NLDClient-yudde/Tool/Obfuz/EditorAssets/Editor/KedrExtension/OpCodeShuffleCommand.cs

50 lines
1.9 KiB
C#
Raw Permalink Normal View History

2026-01-27 18:24:36 +08:00
using System.IO;
using System.Linq;
using HarmonyLib;
using HybridCLR.Editor;
using HybridCLR.Editor.Template;
using Obfuz.Settings;
using UnityEditor;
public static class OpCodeShuffleCommand
{
private static string TemplatePath => "Assets/Editor/KedrExtension/Templates";
[InitializeOnLoadMethod]
private static void Init()
{
var harmony = new Harmony("kedr.polymorphic.il");
harmony.PatchAll();
}
public static void GenerateOpCodes()
{
var opcodeMapping = Enumerable.Range(0, 248).Select(x => (byte)x).ToArray();
if (ObfuzSettings.Instance.polymorphicDllSettings.enable && KedrExtensionSettings.Instance.enableOpcodeShuffle)
{
var seed = HashUtil.Hash(ObfuzSettings.Instance.polymorphicDllSettings.codeGenerationSecretKey);
var rng = new System.Random((int)seed);
RandomUtil.Shuffle(opcodeMapping, rng);
}
var reverseOpcodeMapping = new byte[opcodeMapping.Length];
for (byte i = 0; i < opcodeMapping.Length; i++) reverseOpcodeMapping[opcodeMapping[i]] = i;
{
var frr = new FileRegionReplace(File.ReadAllText($"{TemplatePath}/Opcodes.h.tpl"));
var lines = Opcode.List.Select((op, i) => $"{op.Name} = {opcodeMapping[i]},");
frr.Replace("OPCODE_VALUE", string.Join('\n', lines));
var opcodesPath = $"{SettingsUtil.LocalIl2CppDir}/libil2cpp/hybridclr/metadata/Opcodes.h";
frr.Commit(opcodesPath);
}
{
var frr = new FileRegionReplace(File.ReadAllText($"{TemplatePath}/Opcodes.cpp.tpl"));
var lines = reverseOpcodeMapping.Select(i => Opcode.List[i].Info);
frr.Replace("OPCODE_INFO", string.Join('\n', lines));
var opcodesPath = $"{SettingsUtil.LocalIl2CppDir}/libil2cpp/hybridclr/metadata/Opcodes.cpp";
frr.Commit(opcodesPath);
}
}
}