From 3fded4273c9dc8a7fdff6cb42ecf9168665bfc81 Mon Sep 17 00:00:00 2001 From: walon Date: Tue, 22 Apr 2025 20:09:16 +0800 Subject: [PATCH] =?UTF-8?q?RandomDataNodeCreator=E7=9A=84=E5=8F=B6?= =?UTF-8?q?=E8=8A=82=E7=82=B9=E5=8F=AF=E4=BB=A5=E4=B8=BAConstDataNode?= =?UTF-8?q?=E6=88=96=E8=80=85ConstFromFieldRvaDataNode?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Virtualization/DataNodes/ConstExpression.cs | 2 +- Editor/Virtualization/DefaultDataObfuscator.cs | 17 +++++++++++++++-- .../Functions/ConstDataCreator.cs | 17 +++++++++++++++++ .../Functions/ConstFromFieldRvaDataCreator.cs | 17 +++++++++++++++++ Editor/Virtualization/Functions/FunctionBase.cs | 3 +-- .../Functions/Int32FunctionAdd.cs | 3 +-- .../Functions/Int32FunctionBase.cs | 14 -------------- .../Functions/Int32FunctionXor.cs | 3 +-- .../Virtualization/Functions/NodeCreatorBase.cs | 14 ++++++++++++++ Editor/Virtualization/IFunction.cs | 3 +-- Editor/Virtualization/RandomDataNodeCreator.cs | 8 ++++++-- 11 files changed, 74 insertions(+), 27 deletions(-) create mode 100644 Editor/Virtualization/Functions/ConstDataCreator.cs create mode 100644 Editor/Virtualization/Functions/ConstFromFieldRvaDataCreator.cs delete mode 100644 Editor/Virtualization/Functions/Int32FunctionBase.cs create mode 100644 Editor/Virtualization/Functions/NodeCreatorBase.cs diff --git a/Editor/Virtualization/DataNodes/ConstExpression.cs b/Editor/Virtualization/DataNodes/ConstExpression.cs index 2602594..b18747f 100644 --- a/Editor/Virtualization/DataNodes/ConstExpression.cs +++ b/Editor/Virtualization/DataNodes/ConstExpression.cs @@ -15,7 +15,7 @@ namespace Obfuz.Virtualization { this.function = function; this.inputs = inputs; - Type = function.ReturnType; + Type = result.type; this.result = result; } diff --git a/Editor/Virtualization/DefaultDataObfuscator.cs b/Editor/Virtualization/DefaultDataObfuscator.cs index e5788c3..f1f53d0 100644 --- a/Editor/Virtualization/DefaultDataObfuscator.cs +++ b/Editor/Virtualization/DefaultDataObfuscator.cs @@ -20,9 +20,8 @@ namespace Obfuz.Virtualization _rvaDataAllocator = new RvaDataAllocator(_random); } - public void ObfuscateInt(MethodDef method, int value, List obfuscatedInstructions) + private void CompileNode(IDataNode node, MethodDef method, List obfuscatedInstructions) { - IDataNode node = _nodeCreator.CreateRandom(DataNodeType.Int32, value); var ctx = new CompileContext { method = method, @@ -30,21 +29,33 @@ namespace Obfuz.Virtualization rvaDataAllocator = _rvaDataAllocator, }; node.Compile(ctx); + } + + public void ObfuscateInt(MethodDef method, int value, List obfuscatedInstructions) + { + IDataNode node = _nodeCreator.CreateRandom(DataNodeType.Int32, value); + CompileNode(node, method, obfuscatedInstructions); //obfuscatedInstructions.Add(Instruction.Create(OpCodes.Ldc_I4, value)); } public void ObfuscateLong(MethodDef method, long value, List obfuscatedInstructions) { + //IDataNode node = _nodeCreator.CreateRandom(DataNodeType.Int64, value); + //CompileNode(node, method, obfuscatedInstructions); obfuscatedInstructions.Add(Instruction.Create(OpCodes.Ldc_I8, value)); } public void ObfuscateFloat(MethodDef method, float value, List obfuscatedInstructions) { + //IDataNode node = _nodeCreator.CreateRandom(DataNodeType.Float32, value); + //CompileNode(node, method, obfuscatedInstructions); obfuscatedInstructions.Add(Instruction.Create(OpCodes.Ldc_R4, value)); } public void ObfuscateDouble(MethodDef method, double value, List obfuscatedInstructions) { + //IDataNode node = _nodeCreator.CreateRandom(DataNodeType.Float64, value); + //CompileNode(node, method, obfuscatedInstructions); obfuscatedInstructions.Add(Instruction.Create(OpCodes.Ldc_R8, value)); } @@ -56,6 +67,8 @@ namespace Obfuz.Virtualization public void ObfuscateString(MethodDef method, string value, List obfuscatedInstructions) { + //IDataNode node = _nodeCreator.CreateRandom(DataNodeType.String, value); + //CompileNode(node, method, obfuscatedInstructions); obfuscatedInstructions.Add(Instruction.Create(OpCodes.Ldstr, value)); } diff --git a/Editor/Virtualization/Functions/ConstDataCreator.cs b/Editor/Virtualization/Functions/ConstDataCreator.cs new file mode 100644 index 0000000..a330ffb --- /dev/null +++ b/Editor/Virtualization/Functions/ConstDataCreator.cs @@ -0,0 +1,17 @@ +using dnlib.DotNet.Emit; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Obfuz.Virtualization.Functions +{ + public class ConstDataCreator : NodeCreatorBase + { + public override IDataNode CreateExpr(DataNodeType type, object value, CreateExpressionOptions options) + { + return new ConstDataNode { Type = type, Value = value }; + } + } +} diff --git a/Editor/Virtualization/Functions/ConstFromFieldRvaDataCreator.cs b/Editor/Virtualization/Functions/ConstFromFieldRvaDataCreator.cs new file mode 100644 index 0000000..d94c37a --- /dev/null +++ b/Editor/Virtualization/Functions/ConstFromFieldRvaDataCreator.cs @@ -0,0 +1,17 @@ +using dnlib.DotNet.Emit; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Obfuz.Virtualization.Functions +{ + public class ConstFromFieldRvaDataCreator : NodeCreatorBase + { + public override IDataNode CreateExpr(DataNodeType type, object value, CreateExpressionOptions options) + { + return new ConstFromFieldRvaDataNode { Type = type, Value = value }; + } + } +} diff --git a/Editor/Virtualization/Functions/FunctionBase.cs b/Editor/Virtualization/Functions/FunctionBase.cs index b8de5d8..194984a 100644 --- a/Editor/Virtualization/Functions/FunctionBase.cs +++ b/Editor/Virtualization/Functions/FunctionBase.cs @@ -8,7 +8,6 @@ namespace Obfuz.Virtualization public abstract class FunctionBase : IFunction { - public abstract DataNodeType ReturnType { get; } public abstract void CreateArguments(DataNodeType type, object value, CreateExpressionOptions options, List args); @@ -23,7 +22,7 @@ namespace Obfuz.Virtualization CompileSelf(ctx, ctx.output); } - public ConstExpression CreateExpr(DataNodeType type, object value, CreateExpressionOptions options) + public IDataNode CreateExpr(DataNodeType type, object value, CreateExpressionOptions options) { var args = new List(); CreateArguments(type, value, options, args); diff --git a/Editor/Virtualization/Functions/Int32FunctionAdd.cs b/Editor/Virtualization/Functions/Int32FunctionAdd.cs index e71f8d8..1c50e48 100644 --- a/Editor/Virtualization/Functions/Int32FunctionAdd.cs +++ b/Editor/Virtualization/Functions/Int32FunctionAdd.cs @@ -9,9 +9,8 @@ using static UnityEngine.Networking.UnityWebRequest; namespace Obfuz.Virtualization.Functions { - public class Int32FunctionAdd : Int32FunctionBase + public class Int32FunctionAdd : FunctionBase { - public override DataNodeType ReturnType => DataNodeType.Int32; public override void CreateArguments(DataNodeType type, object v, CreateExpressionOptions options, List args) { diff --git a/Editor/Virtualization/Functions/Int32FunctionBase.cs b/Editor/Virtualization/Functions/Int32FunctionBase.cs deleted file mode 100644 index e52e186..0000000 --- a/Editor/Virtualization/Functions/Int32FunctionBase.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Data; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Obfuz.Virtualization.Functions -{ - public abstract class Int32FunctionBase : FunctionBase - { - public override DataNodeType ReturnType => DataNodeType.Int32; - } -} diff --git a/Editor/Virtualization/Functions/Int32FunctionXor.cs b/Editor/Virtualization/Functions/Int32FunctionXor.cs index dc8bd87..2d77814 100644 --- a/Editor/Virtualization/Functions/Int32FunctionXor.cs +++ b/Editor/Virtualization/Functions/Int32FunctionXor.cs @@ -9,9 +9,8 @@ using static UnityEngine.Networking.UnityWebRequest; namespace Obfuz.Virtualization.Functions { - public class Int32FunctionXor : Int32FunctionBase + public class Int32FunctionXor : FunctionBase { - public override DataNodeType ReturnType => DataNodeType.Int32; public override void CreateArguments(DataNodeType type, object v, CreateExpressionOptions options, List args) { diff --git a/Editor/Virtualization/Functions/NodeCreatorBase.cs b/Editor/Virtualization/Functions/NodeCreatorBase.cs new file mode 100644 index 0000000..042e35c --- /dev/null +++ b/Editor/Virtualization/Functions/NodeCreatorBase.cs @@ -0,0 +1,14 @@ +using System.Collections.Generic; + +namespace Obfuz.Virtualization +{ + public abstract class NodeCreatorBase : IFunction + { + void IFunction.Compile(CompileContext ctx, List inputs, ConstValue result) + { + throw new System.NotSupportedException("This function is not supported in this context."); + } + + public abstract IDataNode CreateExpr(DataNodeType type, object value, CreateExpressionOptions options); + } +} diff --git a/Editor/Virtualization/IFunction.cs b/Editor/Virtualization/IFunction.cs index 4ac4623..5431702 100644 --- a/Editor/Virtualization/IFunction.cs +++ b/Editor/Virtualization/IFunction.cs @@ -4,9 +4,8 @@ namespace Obfuz.Virtualization { public interface IFunction { - DataNodeType ReturnType { get; } - ConstExpression CreateExpr(DataNodeType type, object value, CreateExpressionOptions options); + IDataNode CreateExpr(DataNodeType type, object value, CreateExpressionOptions options); void Compile(CompileContext ctx, List inputs, ConstValue result); } diff --git a/Editor/Virtualization/RandomDataNodeCreator.cs b/Editor/Virtualization/RandomDataNodeCreator.cs index b5bfdd4..c49c043 100644 --- a/Editor/Virtualization/RandomDataNodeCreator.cs +++ b/Editor/Virtualization/RandomDataNodeCreator.cs @@ -18,6 +18,8 @@ namespace Obfuz.Virtualization { new Int32FunctionAdd(), new Int32FunctionXor(), + //new ConstFromFieldRvaDataCreator(), + //new ConstDataCreator(), }; _functions.Add(DataNodeType.Int32, int32Funcs); } @@ -28,10 +30,12 @@ namespace Obfuz.Virtualization { throw new System.Exception($"No functions available for type {type}"); } - if (options.depth >= 2) + if (options.depth >= 4) { //return new ConstDataNode() { Type = type, Value = value }; - return new ConstFromFieldRvaDataNode() { Type = type, Value = value }; + return _random.NextInt(100) < 50 ? + new ConstFromFieldRvaDataNode() { Type = type, Value = value } : + new ConstDataNode() { Type = type, Value = value }; } var func = funcs[options.random.NextInt(funcs.Count)]; ++options.depth;