89 lines
2.8 KiB
C#
89 lines
2.8 KiB
C#
using System;
|
|
using HarmonyLib;
|
|
using Net.Packet;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Reflection;
|
|
using AMDaemon.Allnet;
|
|
using Main;
|
|
using Manager;
|
|
using Manager.Operation;
|
|
using MelonLoader;
|
|
using Net;
|
|
using Net.VO;
|
|
|
|
namespace SinmaiAssist.Fix;
|
|
|
|
public class DisableEncryption
|
|
{
|
|
// codes from AquaMai [https://github.com/MewoLab/AquaMai/blob/main/AquaMai.Core]
|
|
private static string apiSuffix = "";
|
|
|
|
[HarmonyPostfix]
|
|
[HarmonyPatch(typeof(GameMain), "LateInitialize")]
|
|
public static void GetApiSuffix()
|
|
{
|
|
try
|
|
{
|
|
var baseNetQueryConstructor = typeof(NetQuery<VOSerializer, VOSerializer>)
|
|
.GetConstructors()
|
|
.First();
|
|
apiSuffix = ((INetQuery)baseNetQueryConstructor.Invoke(
|
|
[.. baseNetQueryConstructor
|
|
.GetParameters()
|
|
.Select((parameter, i) => i == 0 ? "" : parameter.DefaultValue)])).Api;
|
|
MelonLogger.Msg($"API suffix: {apiSuffix}");
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
MelonLogger.Error($"Failed to resolve the API suffix: {e}");
|
|
apiSuffix = null;
|
|
}
|
|
}
|
|
|
|
[HarmonyPrefix]
|
|
[HarmonyPatch(typeof(Packet), "Obfuscator", typeof(string))]
|
|
public static bool PreObfuscator(string srcStr, ref string __result)
|
|
{
|
|
if (string.IsNullOrEmpty(apiSuffix)) return false;
|
|
if (srcStr.EndsWith(apiSuffix))
|
|
{
|
|
__result = srcStr.Substring(0, srcStr.Length - apiSuffix.Length);
|
|
}
|
|
// __result = srcStr.Replace("MaimaiExp", "").Replace("MaimaiChn", "");
|
|
return false;
|
|
}
|
|
|
|
[HarmonyPatch]
|
|
public class EncryptDecrypt
|
|
{
|
|
public static IEnumerable<MethodBase> TargetMethods()
|
|
{
|
|
var methods = AccessTools.TypeByName("Net.CipherAES").GetMethods();
|
|
return
|
|
[
|
|
methods.FirstOrDefault(it => it.Name == "Encrypt" && it.IsPublic),
|
|
methods.FirstOrDefault(it => it.Name == "Decrypt" && it.IsPublic)
|
|
];
|
|
}
|
|
|
|
public static bool Prefix(object[] __args, ref object __result)
|
|
{
|
|
if (!SinmaiAssist.MainConfig.Fix.DisableEncryption) return true;
|
|
if (__args.Length == 1)
|
|
{
|
|
// public static byte[] Encrypt(byte[] data)
|
|
// public static byte[] Decrypt(byte[] encryptData)
|
|
__result = __args[0];
|
|
}
|
|
else if (__args.Length == 2)
|
|
{
|
|
// public static bool Encrypt(byte[] data, out byte[] encryptData)
|
|
// public static bool Decrypt(byte[] encryptData, out byte[] plainData)
|
|
__args[1] = __args[0];
|
|
__result = true;
|
|
}
|
|
return false;
|
|
}
|
|
}
|
|
} |