From d28f37b4e4fe4185e8ac3a4bfa235b0361ebbe32 Mon Sep 17 00:00:00 2001 From: Julienraptor01 Date: Fri, 8 Sep 2023 14:37:47 +0200 Subject: create the base64 fixer --- .../mixin/YggdrasilServicesKeyInfoMixin.java | 46 ++++++++++++++++++++++ src/main/resources/skyblocker.mixins.json | 1 + 2 files changed, 47 insertions(+) create mode 100644 src/main/java/me/xmrvizzy/skyblocker/mixin/YggdrasilServicesKeyInfoMixin.java (limited to 'src/main') diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/YggdrasilServicesKeyInfoMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/YggdrasilServicesKeyInfoMixin.java new file mode 100644 index 00000000..b283be24 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/YggdrasilServicesKeyInfoMixin.java @@ -0,0 +1,46 @@ +package me.xmrvizzy.skyblocker.mixin; + +import com.mojang.authlib.yggdrasil.YggdrasilServicesKeyInfo; +import me.xmrvizzy.skyblocker.utils.Utils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +import java.util.*; + +@Mixin(value = YggdrasilServicesKeyInfo.class, remap = false) +public class YggdrasilServicesKeyInfoMixin { + @Unique + private static final Logger LOGGER = LoggerFactory.getLogger(YggdrasilServicesKeyInfo.class); + @Unique + private static final Map REPLACEMENT_HASHMAP = new HashMap<>(); + @Unique + private static final List ERROR_HASH_ARRAYLIST = new ArrayList<>(); + + @Redirect(method = "validateProperty", at = @At(value = "INVOKE", target = "Ljava/util/Base64$Decoder;decode(Ljava/lang/String;)[B", remap = false), remap = false) + private byte[] skyblocker$replaceKnownWrongBase64(Base64.Decoder decoder, String signature) { + try { + return decoder.decode(signature); + } catch (IllegalArgumentException e) { + if (Utils.isOnSkyblock()) { + if (REPLACEMENT_HASHMAP.containsKey(signature)) { + return decoder.decode(REPLACEMENT_HASHMAP.get(signature)); + } + int signatureHashCode = signature.hashCode(); + if (!ERROR_HASH_ARRAYLIST.contains(signatureHashCode)) { + ERROR_HASH_ARRAYLIST.add(signatureHashCode); + LOGGER.warn("Failed to decode this base64 string: {}", signature); + } + LOGGER.warn("Failed to decode the base64 string No.{} again", ERROR_HASH_ARRAYLIST.indexOf(signatureHashCode)); + } + throw e; + } + } + + static { + REPLACEMENT_HASHMAP.put("\"ZnIHWclaHKIRt9H2puWSCaUb2OrI2YPUkdV5f0w/fAdlpllmgCGjYegWX2ThhjrcRbVwc8oravYaVo641X/33ZOmg1W9luZg2rV9Zc16dgTXkDQlJSi8bpEKK2iUMEU5oa/fb3WG3wCYM4EUbataiiizQdMKl0pG81uRDS45QSdWvowbNMvUA+tL97h7nnrNgNU01NQJntJuzXg6JD6vC5bnDyDn5nXF0/KI69xpzSDupWxs6mmd03xbU18T9XX8mlgDgg549zRIaQM2OEihCHecu42e+yjFs5TiXOhpupm3FArJ87XrfzD17fupE0cr9PehXZzJxtLtzthgjqwb5nB3QmD8UFsqhFQBU0TxswGqBQxX1CeCwYvQGOXx3jE73/79Eq6BrGmwqwYs+SOk/qcIdpfdcK2y6q4KSDiJlBbYMCryYFPEUcKmTdOE2OkGniekvzO7AriApibZvt5R/jbS2dmMmUaNKIQFSINScyBH6JV5vMmneEUbhgNBangagVoGIsVAlRNBCKrQ/mTMaIgY+jE/HU8gQnvJAKOtnYrTXLyPvhXaJ4ix+pDGFkycjj7phi1FrLVHTpEewXhx5AvuNY23m+Y9lHp2/687PDoSsryD4e1rJkFs4psmZxCDHRq4x1nmHR3ZvZeRAQgX8LytPbl+PD8N7rJ6lhNRwY4=", "ZnIHWclaHKIRt9H2puWSCaUb2OrI2YPUkdV5f0w/fAdlpllmgCGjYegWX2ThhjrcRbVwc8oravYaVo641X/33ZOmg1W9luZg2rV9Zc16dgTXkDQlJSi8bpEKK2iUMEU5oa/fb3WG3wCYM4EUbataiiizQdMKl0pG81uRDS45QSdWvowbNMvUA+tL97h7nnrNgNU01NQJntJuzXg6JD6vC5bnDyDn5nXF0/KI69xpzSDupWxs6mmd03xbU18T9XX8mlgDgg549zRIaQM2OEihCHecu42e+yjFs5TiXOhpupm3FArJ87XrfzD17fupE0cr9PehXZzJxtLtzthgjqwb5nB3QmD8UFsqhFQBU0TxswGqBQxX1CeCwYvQGOXx3jE73/79Eq6BrGmwqwYs+SOk/qcIdpfdcK2y6q4KSDiJlBbYMCryYFPEUcKmTdOE2OkGniekvzO7AriApibZvt5R/jbS2dmMmUaNKIQFSINScyBH6JV5vMmneEUbhgNBangagVoGIsVAlRNBCKrQ/mTMaIgY+jE/HU8gQnvJAKOtnYrTXLyPvhXaJ4ix+pDGFkycjj7phi1FrLVHTpEewXhx5AvuNY23m+Y9lHp2/687PDoSsryD4e1rJkFs4psmZxCDHRq4x1nmHR3ZvZeRAQgX8LytPbl+PD8N7rJ6lhNRwY4="); + } +} \ No newline at end of file diff --git a/src/main/resources/skyblocker.mixins.json b/src/main/resources/skyblocker.mixins.json index d2465761..06b2b50c 100644 --- a/src/main/resources/skyblocker.mixins.json +++ b/src/main/resources/skyblocker.mixins.json @@ -21,6 +21,7 @@ "PlayerSkinProviderMixin", "ScoreboardMixin", "WorldRendererMixin", + "YggdrasilServicesKeyInfoMixin", "accessor.BeaconBlockEntityRendererInvoker", "accessor.FrustumInvoker", "accessor.HandledScreenAccessor", -- cgit From e881432599f949aa6b8b633e44a356a05c6cff3f Mon Sep 17 00:00:00 2001 From: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> Date: Fri, 8 Sep 2023 10:56:02 -0400 Subject: Refactor YggdrasilServicesKeyInfoMixin --- .../skyblocker/mixin/YggdrasilServicesKeyInfoMixin.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) (limited to 'src/main') diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/YggdrasilServicesKeyInfoMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/YggdrasilServicesKeyInfoMixin.java index b283be24..21826087 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/YggdrasilServicesKeyInfoMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/YggdrasilServicesKeyInfoMixin.java @@ -1,5 +1,7 @@ package me.xmrvizzy.skyblocker.mixin; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import com.mojang.authlib.yggdrasil.YggdrasilServicesKeyInfo; import me.xmrvizzy.skyblocker.utils.Utils; import org.slf4j.Logger; @@ -7,7 +9,6 @@ import org.slf4j.LoggerFactory; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; import java.util.*; @@ -20,14 +21,14 @@ public class YggdrasilServicesKeyInfoMixin { @Unique private static final List ERROR_HASH_ARRAYLIST = new ArrayList<>(); - @Redirect(method = "validateProperty", at = @At(value = "INVOKE", target = "Ljava/util/Base64$Decoder;decode(Ljava/lang/String;)[B", remap = false), remap = false) - private byte[] skyblocker$replaceKnownWrongBase64(Base64.Decoder decoder, String signature) { + @WrapOperation(method = "validateProperty", at = @At(value = "INVOKE", target = "Ljava/util/Base64$Decoder;decode(Ljava/lang/String;)[B", remap = false), remap = false) + private byte[] skyblocker$replaceKnownWrongBase64(Base64.Decoder decoder, String signature, Operation decode) { try { - return decoder.decode(signature); + return decode.call(decoder, signature.replaceAll("[^A-Za-z0-9+/=]","")); } catch (IllegalArgumentException e) { if (Utils.isOnSkyblock()) { if (REPLACEMENT_HASHMAP.containsKey(signature)) { - return decoder.decode(REPLACEMENT_HASHMAP.get(signature)); + return decode.call(decoder, REPLACEMENT_HASHMAP.get(signature)); } int signatureHashCode = signature.hashCode(); if (!ERROR_HASH_ARRAYLIST.contains(signatureHashCode)) { -- cgit From c0754cb68d9db3cc863f7c39559eca0b8d57b141 Mon Sep 17 00:00:00 2001 From: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> Date: Fri, 8 Sep 2023 15:34:45 -0400 Subject: Refactor YggdrasilServicesKeyInfoMixin --- .../mixin/YggdrasilServicesKeyInfoMixin.java | 26 ++++++++++++---------- 1 file changed, 14 insertions(+), 12 deletions(-) (limited to 'src/main') diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/YggdrasilServicesKeyInfoMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/YggdrasilServicesKeyInfoMixin.java index 21826087..3416e282 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/YggdrasilServicesKeyInfoMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/YggdrasilServicesKeyInfoMixin.java @@ -5,26 +5,31 @@ import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import com.mojang.authlib.yggdrasil.YggdrasilServicesKeyInfo; import me.xmrvizzy.skyblocker.utils.Utils; import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; -import java.util.*; +import java.util.ArrayList; +import java.util.Base64; +import java.util.List; +import java.util.Map; @Mixin(value = YggdrasilServicesKeyInfo.class, remap = false) public class YggdrasilServicesKeyInfoMixin { + @Shadow + @Final + private static Logger LOGGER; @Unique - private static final Logger LOGGER = LoggerFactory.getLogger(YggdrasilServicesKeyInfo.class); - @Unique - private static final Map REPLACEMENT_HASHMAP = new HashMap<>(); + private static final Map REPLACEMENT_HASHMAP = Map.of(); @Unique private static final List ERROR_HASH_ARRAYLIST = new ArrayList<>(); @WrapOperation(method = "validateProperty", at = @At(value = "INVOKE", target = "Ljava/util/Base64$Decoder;decode(Ljava/lang/String;)[B", remap = false), remap = false) private byte[] skyblocker$replaceKnownWrongBase64(Base64.Decoder decoder, String signature, Operation decode) { try { - return decode.call(decoder, signature.replaceAll("[^A-Za-z0-9+/=]","")); + return decode.call(decoder, signature.replaceAll("[^A-Za-z0-9+/=]", "")); } catch (IllegalArgumentException e) { if (Utils.isOnSkyblock()) { if (REPLACEMENT_HASHMAP.containsKey(signature)) { @@ -33,15 +38,12 @@ public class YggdrasilServicesKeyInfoMixin { int signatureHashCode = signature.hashCode(); if (!ERROR_HASH_ARRAYLIST.contains(signatureHashCode)) { ERROR_HASH_ARRAYLIST.add(signatureHashCode); - LOGGER.warn("Failed to decode this base64 string: {}", signature); + LOGGER.warn("[Skyblocker Base64 Fixer] Failed to decode base64 string No.{}: {}", ERROR_HASH_ARRAYLIST.size() - 1, signature); + } else { + LOGGER.warn("[Skyblocker Base64 Fixer] Failed to decode the base64 string No.{} again", ERROR_HASH_ARRAYLIST.indexOf(signatureHashCode)); } - LOGGER.warn("Failed to decode the base64 string No.{} again", ERROR_HASH_ARRAYLIST.indexOf(signatureHashCode)); } throw e; } } - - static { - REPLACEMENT_HASHMAP.put("\"ZnIHWclaHKIRt9H2puWSCaUb2OrI2YPUkdV5f0w/fAdlpllmgCGjYegWX2ThhjrcRbVwc8oravYaVo641X/33ZOmg1W9luZg2rV9Zc16dgTXkDQlJSi8bpEKK2iUMEU5oa/fb3WG3wCYM4EUbataiiizQdMKl0pG81uRDS45QSdWvowbNMvUA+tL97h7nnrNgNU01NQJntJuzXg6JD6vC5bnDyDn5nXF0/KI69xpzSDupWxs6mmd03xbU18T9XX8mlgDgg549zRIaQM2OEihCHecu42e+yjFs5TiXOhpupm3FArJ87XrfzD17fupE0cr9PehXZzJxtLtzthgjqwb5nB3QmD8UFsqhFQBU0TxswGqBQxX1CeCwYvQGOXx3jE73/79Eq6BrGmwqwYs+SOk/qcIdpfdcK2y6q4KSDiJlBbYMCryYFPEUcKmTdOE2OkGniekvzO7AriApibZvt5R/jbS2dmMmUaNKIQFSINScyBH6JV5vMmneEUbhgNBangagVoGIsVAlRNBCKrQ/mTMaIgY+jE/HU8gQnvJAKOtnYrTXLyPvhXaJ4ix+pDGFkycjj7phi1FrLVHTpEewXhx5AvuNY23m+Y9lHp2/687PDoSsryD4e1rJkFs4psmZxCDHRq4x1nmHR3ZvZeRAQgX8LytPbl+PD8N7rJ6lhNRwY4=", "ZnIHWclaHKIRt9H2puWSCaUb2OrI2YPUkdV5f0w/fAdlpllmgCGjYegWX2ThhjrcRbVwc8oravYaVo641X/33ZOmg1W9luZg2rV9Zc16dgTXkDQlJSi8bpEKK2iUMEU5oa/fb3WG3wCYM4EUbataiiizQdMKl0pG81uRDS45QSdWvowbNMvUA+tL97h7nnrNgNU01NQJntJuzXg6JD6vC5bnDyDn5nXF0/KI69xpzSDupWxs6mmd03xbU18T9XX8mlgDgg549zRIaQM2OEihCHecu42e+yjFs5TiXOhpupm3FArJ87XrfzD17fupE0cr9PehXZzJxtLtzthgjqwb5nB3QmD8UFsqhFQBU0TxswGqBQxX1CeCwYvQGOXx3jE73/79Eq6BrGmwqwYs+SOk/qcIdpfdcK2y6q4KSDiJlBbYMCryYFPEUcKmTdOE2OkGniekvzO7AriApibZvt5R/jbS2dmMmUaNKIQFSINScyBH6JV5vMmneEUbhgNBangagVoGIsVAlRNBCKrQ/mTMaIgY+jE/HU8gQnvJAKOtnYrTXLyPvhXaJ4ix+pDGFkycjj7phi1FrLVHTpEewXhx5AvuNY23m+Y9lHp2/687PDoSsryD4e1rJkFs4psmZxCDHRq4x1nmHR3ZvZeRAQgX8LytPbl+PD8N7rJ6lhNRwY4="); - } } \ No newline at end of file -- cgit