From 945c6a074c1671fa9f7b64b5a159576855448f99 Mon Sep 17 00:00:00 2001 From: walon Date: Tue, 22 Apr 2025 08:58:00 +0800 Subject: [PATCH] =?UTF-8?q?CleanUpInstructionPass=E4=B8=AD=E4=BC=98?= =?UTF-8?q?=E5=8C=96branch=E5=92=8Cmacro?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Editor/CleanUpInstructionPass.cs | 21 +++++++++++++++++-- Editor/Virtualization/CompileContext.cs | 10 +++++++-- .../ConfigDataObfuscationPolicy.cs | 4 ++-- .../Virtualization/DataVirtualizationPass.cs | 9 +++++--- .../Virtualization/DefaultDataObfuscator.cs | 8 ++++++- 5 files changed, 42 insertions(+), 10 deletions(-) diff --git a/Editor/CleanUpInstructionPass.cs b/Editor/CleanUpInstructionPass.cs index 8308dac..695632e 100644 --- a/Editor/CleanUpInstructionPass.cs +++ b/Editor/CleanUpInstructionPass.cs @@ -1,4 +1,6 @@ -using System; +using dnlib.DotNet; +using dnlib.DotNet.Emit; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -15,7 +17,22 @@ namespace Obfuz public override void Start(ObfuscatorContext ctx) { - + foreach (var ass in ctx.assemblies) + { + foreach (TypeDef type in ass.module.GetTypes()) + { + foreach (MethodDef method in type.Methods) + { + if (method.HasBody) + { + CilBody body = method.Body; + body.SimplifyBranches(); + body.OptimizeMacros(); + body.OptimizeBranches(); + } + } + } + } } public override void Stop(ObfuscatorContext ctx) diff --git a/Editor/Virtualization/CompileContext.cs b/Editor/Virtualization/CompileContext.cs index ba2f858..a87d581 100644 --- a/Editor/Virtualization/CompileContext.cs +++ b/Editor/Virtualization/CompileContext.cs @@ -1,7 +1,13 @@ -namespace Obfuz.Virtualization +using dnlib.DotNet; +using dnlib.DotNet.Emit; +using NUnit.Framework; +using System.Collections.Generic; + +namespace Obfuz.Virtualization { public class CompileContext { - + public MethodDef method; + public List obfuscatedInstructions; } } diff --git a/Editor/Virtualization/ConfigDataObfuscationPolicy.cs b/Editor/Virtualization/ConfigDataObfuscationPolicy.cs index 2876c68..afb3d1c 100644 --- a/Editor/Virtualization/ConfigDataObfuscationPolicy.cs +++ b/Editor/Virtualization/ConfigDataObfuscationPolicy.cs @@ -16,12 +16,12 @@ namespace Obfuz.Virtualization public override bool NeedObfuscateInt(MethodDef method, int value) { - return value > 10000; + return value > 10000 || value < -10000; } public override bool NeedObfuscateLong(MethodDef method, long value) { - return value > 10000; + return value > 10000 || value < -10000; } public override bool NeedObfuscateFloat(MethodDef method, float value) diff --git a/Editor/Virtualization/DataVirtualizationPass.cs b/Editor/Virtualization/DataVirtualizationPass.cs index 002d151..ae91a27 100644 --- a/Editor/Virtualization/DataVirtualizationPass.cs +++ b/Editor/Virtualization/DataVirtualizationPass.cs @@ -137,9 +137,12 @@ namespace Obfuz.Virtualization { // current instruction may be the target of control flow instruction, so we can't remove it directly. // we replace it with nop now, then remove it in CleanUpInstructionPass - inst.OpCode = OpCodes.Nop; - inst.Operand = null; - resultInstructions.AddRange(obfuscatedInstructions); + inst.OpCode = obfuscatedInstructions[0].OpCode; + inst.Operand = obfuscatedInstructions[0].Operand; + for (int k = 1; k < obfuscatedInstructions.Count; k++) + { + resultInstructions.Add(obfuscatedInstructions[k]); + } } } diff --git a/Editor/Virtualization/DefaultDataObfuscator.cs b/Editor/Virtualization/DefaultDataObfuscator.cs index ea1e7f4..ad86c79 100644 --- a/Editor/Virtualization/DefaultDataObfuscator.cs +++ b/Editor/Virtualization/DefaultDataObfuscator.cs @@ -12,7 +12,13 @@ namespace Obfuz.Virtualization public void ObfuscateInt(MethodDef method, int value, List obfuscatedInstructions) { IDataNode node = _nodeCreator.CreateRandom(DataNodeType.Int32, value); - obfuscatedInstructions.Add(Instruction.CreateLdcI4(value)); + var ctx = new CompileContext + { + method = method, + obfuscatedInstructions = obfuscatedInstructions, + }; + node.Compile(ctx); + obfuscatedInstructions.Add(Instruction.Create(OpCodes.Ldc_I4, value)); } public void ObfuscateLong(MethodDef method, long value, List obfuscatedInstructions)