[F] NetPacketHook may need encrypt back

This commit is contained in:
Clansty
2025-02-21 21:20:24 +08:00
parent 3fb0ff09fb
commit 7d2a67f14c
2 changed files with 34 additions and 1 deletions

View File

@@ -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)");
}
}
}

View File

@@ -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<GetAccessTokenMethod>(() =>
{