diff --git a/AquaMai.Core/Helpers/NetPacketHook.cs b/AquaMai.Core/Helpers/NetPacketHook.cs index 44b236d5..d20640d4 100644 --- a/AquaMai.Core/Helpers/NetPacketHook.cs +++ b/AquaMai.Core/Helpers/NetPacketHook.cs @@ -56,10 +56,14 @@ public class NetPacketHook !JsonHelper.DeepEqual(responseJson, JSON.Load(decodedResponse))) { var modifiedResponse = Encoding.UTF8.GetBytes(responseJson.ToJSON()); + if (!Shim.NetHttpClientDecryptsResponse) + { + modifiedResponse = Shim.EncryptNetPacketBody(modifiedResponse); + } memoryStream.SetLength(0); memoryStream.Write(modifiedResponse, 0, modifiedResponse.Length); memoryStream.Seek(0, SeekOrigin.Begin); - MelonLogger.Msg($"[NetPacketExtension] Modified response for {api} ({decodedResponse.Length} bytes -> {modifiedResponse.Length} bytes)"); + MelonLogger.Msg($"[NetPacketExtension] Modified response for {api} ({decryptedResponse.Length} bytes -> {modifiedResponse.Length} bytes)"); } } } diff --git a/AquaMai.Core/Helpers/Shim.cs b/AquaMai.Core/Helpers/Shim.cs index 0460d550..17a90f3d 100644 --- a/AquaMai.Core/Helpers/Shim.cs +++ b/AquaMai.Core/Helpers/Shim.cs @@ -89,6 +89,35 @@ public static class Shim } } + public static byte[] EncryptNetPacketBody(byte[] data) + { + var methods = AccessTools.TypeByName("Net.CipherAES").GetMethods(); + var method = methods.FirstOrDefault(it => it.Name == "Encrypt" && it.GetParameters().Length <= 2); + if (method == null) + { + MelonLogger.Warning("No matching Net.CipherAES.Encrypt() method found"); + // Assume encryption code is removed. + return data; + } + if (method.GetParameters().Length == 1) + { + return (byte[])method.Invoke(null, [data]); + } + else + { + object[] args = [data, null]; + var result = (bool)method.Invoke(null, args); + if (result) + { + return (byte[])args[1]; + } + else + { + throw new Exception("Net.CipherAES.Encrypt() failed"); + } + } + } + public delegate string GetAccessTokenMethod(int index); public static readonly GetAccessTokenMethod GetAccessToken = Iife(() => {