From 62cabf939c248eeca4508ead7aa18d0b358594d0 Mon Sep 17 00:00:00 2001 From: walon Date: Tue, 13 May 2025 08:56:19 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=B1=80=E9=83=A8=E7=A7=8D?= =?UTF-8?q?=E5=AD=90=E7=94=9F=E6=88=90=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Editor/EncryptionVM/VirtualMachineCreator.cs | 3 ++- Editor/ObfusPasses/CallObfus/CallObfusPass.cs | 2 +- .../ConstEncrypt/ConstEncryptPass.cs | 2 +- .../FieldEncrypt/FieldEncryptPass.cs | 2 +- Editor/ObfuscationPassContext.cs | 4 +++- Editor/Obfuscator.cs | 21 +++++++++---------- Editor/Utils/RandomWithKey.cs | 4 ++-- 7 files changed, 20 insertions(+), 18 deletions(-) diff --git a/Editor/EncryptionVM/VirtualMachineCreator.cs b/Editor/EncryptionVM/VirtualMachineCreator.cs index 4163b78..93c76f5 100644 --- a/Editor/EncryptionVM/VirtualMachineCreator.cs +++ b/Editor/EncryptionVM/VirtualMachineCreator.cs @@ -17,7 +17,8 @@ namespace Obfuz.EncryptionVM { _vmGenerationSecretKey = vmGenerationSecretKey; byte[] byteGenerationSecretKey = KeyGenerator.GenerateKey(vmGenerationSecretKey, CodeGenerationSecretKeyLength); - _random = new RandomWithKey(byteGenerationSecretKey, 0); + int[] intGenerationSecretKey = KeyGenerator.ConvertToIntKey(byteGenerationSecretKey); + _random = new RandomWithKey(intGenerationSecretKey, 0); } private IEncryptionInstruction CreateRandomInstruction(int intSecretKeyLength) diff --git a/Editor/ObfusPasses/CallObfus/CallObfusPass.cs b/Editor/ObfusPasses/CallObfus/CallObfusPass.cs index a8a9652..b812beb 100644 --- a/Editor/ObfusPasses/CallObfus/CallObfusPass.cs +++ b/Editor/ObfusPasses/CallObfus/CallObfusPass.cs @@ -38,7 +38,7 @@ namespace Obfuz.ObfusPasses.CallObfus public override void Start() { var ctx = ObfuscationPassContext.Current; - _random = ctx.random; + _random = ctx.globalRandom; _encryptor = ctx.encryptor; _dynamicProxyObfuscator = new DefaultCallProxyObfuscator(_random, _encryptor, ctx.constFieldAllocator, ctx.moduleEntityManager, _obfuscationLevel); _dynamicProxyPolicy = new ConfigurableObfuscationPolicy(ctx.toObfuscatedAssemblyNames, _configFiles); diff --git a/Editor/ObfusPasses/ConstEncrypt/ConstEncryptPass.cs b/Editor/ObfusPasses/ConstEncrypt/ConstEncryptPass.cs index 064c90b..ae40c67 100644 --- a/Editor/ObfusPasses/ConstEncrypt/ConstEncryptPass.cs +++ b/Editor/ObfusPasses/ConstEncrypt/ConstEncryptPass.cs @@ -31,7 +31,7 @@ namespace Obfuz.ObfusPasses.ConstEncrypt { var ctx = ObfuscationPassContext.Current; _dataObfuscatorPolicy = new ConfigurableEncryptPolicy(ctx.toObfuscatedAssemblyNames, _configFiles); - _dataObfuscator = new DefaultConstEncryptor(ctx.random, ctx.encryptor, ctx.rvaDataAllocator, ctx.constFieldAllocator, ctx.moduleEntityManager, _encryptionLevel); + _dataObfuscator = new DefaultConstEncryptor(ctx.globalRandom, ctx.encryptor, ctx.rvaDataAllocator, ctx.constFieldAllocator, ctx.moduleEntityManager, _encryptionLevel); } public override void Stop() diff --git a/Editor/ObfusPasses/FieldEncrypt/FieldEncryptPass.cs b/Editor/ObfusPasses/FieldEncrypt/FieldEncryptPass.cs index 84b5b88..3d12564 100644 --- a/Editor/ObfusPasses/FieldEncrypt/FieldEncryptPass.cs +++ b/Editor/ObfusPasses/FieldEncrypt/FieldEncryptPass.cs @@ -30,7 +30,7 @@ namespace Obfuz.ObfusPasses.FieldEncrypt public override void Start() { var ctx = ObfuscationPassContext.Current; - _memoryEncryptor = new DefaultFieldEncryptor(ctx.random, ctx.encryptor, ctx.moduleEntityManager, _encryptionLevel); + _memoryEncryptor = new DefaultFieldEncryptor(ctx.globalRandom, ctx.encryptor, ctx.moduleEntityManager, _encryptionLevel); _encryptionPolicy = new ConfigurableEncryptPolicy(ctx.toObfuscatedAssemblyNames, _configFiles); } diff --git a/Editor/ObfuscationPassContext.cs b/Editor/ObfuscationPassContext.cs index c69d356..0823548 100644 --- a/Editor/ObfuscationPassContext.cs +++ b/Editor/ObfuscationPassContext.cs @@ -30,7 +30,9 @@ namespace Obfuz public string obfuscatedAssemblyOutputDir; - public IRandom random; + public IRandom globalRandom; + public Func localScopeRandomCreator; + public IEncryptor encryptor; public ConstFieldAllocator constFieldAllocator; public RvaDataAllocator rvaDataAllocator; diff --git a/Editor/Obfuscator.cs b/Editor/Obfuscator.cs index 86568b0..25370c8 100644 --- a/Editor/Obfuscator.cs +++ b/Editor/Obfuscator.cs @@ -31,7 +31,8 @@ namespace Obfuz private readonly Pipeline _pipeline1 = new Pipeline(); private readonly Pipeline _pipeline2 = new Pipeline(); - private readonly byte[] _secret; + private readonly byte[] _byteSecret; + private readonly int[] _intSecret; private readonly int _randomSeed; private readonly string _encryptionVmGenerationSecret; private readonly int _encryptionVmOpCodeCount; @@ -41,8 +42,9 @@ namespace Obfuz public Obfuscator(ObfuscatorBuilder builder) { - _secret = KeyGenerator.GenerateKey(builder.Secret, VirtualMachine.SecretKeyLength); - SaveKey(_secret, builder.SecretOutputPath); + _byteSecret = KeyGenerator.GenerateKey(builder.Secret, VirtualMachine.SecretKeyLength); + _intSecret = KeyGenerator.ConvertToIntKey(_byteSecret); + SaveKey(_byteSecret, builder.SecretOutputPath); _randomSeed = builder.RandomSeed; _encryptionVmGenerationSecret = builder.EncryptionVmGenerationSecretKey; _encryptionVmOpCodeCount = builder.EncryptionVmOpCodeCount; @@ -109,7 +111,7 @@ namespace Obfuz { throw new Exception($"EncryptionVm CodeFile:`{_encryptionVmCodeFile}` not match with encryptionVM settings! Please run `Obfuz/GenerateVm` to update it!"); } - var vms = new VirtualMachineSimulator(vm, _secret); + var vms = new VirtualMachineSimulator(vm, _byteSecret); var generatedVmTypes = AppDomain.CurrentDomain.GetAssemblies() .Select(assembly => assembly.GetType("Obfuz.EncryptionVM.GeneratedEncryptionVirtualMachine")) @@ -124,7 +126,7 @@ namespace Obfuz throw new Exception($"class Obfuz.EncryptionVM.GeneratedEncryptionVirtualMachine found in multiple assemblies! Please retain only one!"); } - var gvmInstance = (IEncryptor)Activator.CreateInstance(generatedVmTypes[0], new object[] { _secret } ); + var gvmInstance = (IEncryptor)Activator.CreateInstance(generatedVmTypes[0], new object[] { _byteSecret } ); int testValue = 11223344; for (int i = 0; i < vm.opCodes.Length; i++) @@ -152,16 +154,12 @@ namespace Obfuz private void OnPreObfuscation(Pipeline pipeline) { - - AssemblyCache assemblyCache = new AssemblyCache(new PathAssemblyResolver(_assemblySearchDirs.ToArray())); List toObfuscatedModules = new List(); List obfuscatedAndNotObfuscatedModules = new List(); - LoadAssemblies(assemblyCache, toObfuscatedModules, obfuscatedAndNotObfuscatedModules); - - var random = new RandomWithKey(_secret, _randomSeed); + var random = new RandomWithKey(_intSecret, _randomSeed); var encryptor = CreateEncryptionVirtualMachine(); var moduleEntityManager = new GroupByModuleEntityManager(); var rvaDataAllocator = new RvaDataAllocator(random, encryptor, moduleEntityManager); @@ -176,7 +174,8 @@ namespace Obfuz obfuscatedAssemblyOutputDir = _obfuscatedAssemblyOutputDir, moduleEntityManager = moduleEntityManager, - random = random, + globalRandom = random, + localScopeRandomCreator = (seed) => new RandomWithKey(_intSecret, _randomSeed ^ seed), encryptor = encryptor, rvaDataAllocator = rvaDataAllocator, constFieldAllocator = constFieldAllocator, diff --git a/Editor/Utils/RandomWithKey.cs b/Editor/Utils/RandomWithKey.cs index 4200613..27d1001 100644 --- a/Editor/Utils/RandomWithKey.cs +++ b/Editor/Utils/RandomWithKey.cs @@ -19,9 +19,9 @@ namespace Obfuz.Utils private int _seed; - public RandomWithKey(byte[] key, int seed) + public RandomWithKey(int[] key, int seed) { - _key = KeyGenerator.ConvertToIntKey(key); + _key = key; _seed = seed; }