diff --git a/Editor/CleanUpInstructionPass.cs b/Editor/CleanUpInstructionPass.cs index 695632e..af95f9f 100644 --- a/Editor/CleanUpInstructionPass.cs +++ b/Editor/CleanUpInstructionPass.cs @@ -11,11 +11,6 @@ namespace Obfuz public class CleanUpInstructionPass : ObfuscationPassBase { public override void Process(ObfuscatorContext ctx) - { - // TODO remove all nop instructions - } - - public override void Start(ObfuscatorContext ctx) { foreach (var ass in ctx.assemblies) { @@ -29,12 +24,17 @@ namespace Obfuz body.SimplifyBranches(); body.OptimizeMacros(); body.OptimizeBranches(); + // TODO remove dup } } } } } + public override void Start(ObfuscatorContext ctx) + { + } + public override void Stop(ObfuscatorContext ctx) { diff --git a/Editor/Virtualization/CompileContext.cs b/Editor/Virtualization/CompileContext.cs index a87d581..d23aacc 100644 --- a/Editor/Virtualization/CompileContext.cs +++ b/Editor/Virtualization/CompileContext.cs @@ -8,6 +8,6 @@ namespace Obfuz.Virtualization public class CompileContext { public MethodDef method; - public List obfuscatedInstructions; + public List output; } } diff --git a/Editor/Virtualization/DataNodes/ConstDataNode.cs b/Editor/Virtualization/DataNodes/ConstDataNode.cs index f4053b6..73d9341 100644 --- a/Editor/Virtualization/DataNodes/ConstDataNode.cs +++ b/Editor/Virtualization/DataNodes/ConstDataNode.cs @@ -1,4 +1,5 @@ -using System; +using dnlib.DotNet.Emit; +using System; namespace Obfuz.Virtualization { @@ -17,48 +18,18 @@ namespace Obfuz.Virtualization // so we only need to deal int32 and int64 switch (Type) { - //case DataNodeType.Byte: - //{ - // // create ldloc.i4 - // break; - //} case DataNodeType.Int32: { // create ldloc.i4 + ctx.output.Add(Instruction.CreateLdcI4(IntValue)); break; } case DataNodeType.Int64: { // create ldloc.i8 + ctx.output.Add(Instruction.Create(OpCodes.Ldc_I8, LongValue)); break; } - //case DataNodeType.Float32: - //{ - // // create ldloc.r4 - // break; - //} - //case DataNodeType.Float64: - //{ - // // create ldloc.r8 - // break; - //} - //case DataNodeType.Null: - //{ - // // create ldnull - // break; - //} - //case DataNodeType.String: - //{ - // // create ldstr - // break; - //} - //case DataNodeType.Bytes: - //{ - // // create ldstr - - // // RuntimeHelpers.InitializeArray(array, fieldHandle); - // break; - //} default: { throw new NotImplementedException($"Type:{Type} not implemented"); diff --git a/Editor/Virtualization/DataNodes/ConstExpression.cs b/Editor/Virtualization/DataNodes/ConstExpression.cs index ad3b850..2602594 100644 --- a/Editor/Virtualization/DataNodes/ConstExpression.cs +++ b/Editor/Virtualization/DataNodes/ConstExpression.cs @@ -21,7 +21,7 @@ namespace Obfuz.Virtualization public override void Compile(CompileContext ctx) { - + function.Compile(ctx, inputs, result); } } } diff --git a/Editor/Virtualization/DataNodes/DataNodeBase.cs b/Editor/Virtualization/DataNodes/DataNodeBase.cs index 7b4d933..06699b3 100644 --- a/Editor/Virtualization/DataNodes/DataNodeBase.cs +++ b/Editor/Virtualization/DataNodes/DataNodeBase.cs @@ -6,6 +6,18 @@ public abstract object Value { get; set; } + public int IntValue => (int)Value; + + public long LongValue => (long) Value; + + public float FloatValue => (float)Value; + + public double DoubleValue => (double)Value; + + public string StringValue => (string)Value; + + public byte[] BytesValue => (byte[])Value; + public abstract void Compile(CompileContext ctx); } diff --git a/Editor/Virtualization/DefaultDataObfuscator.cs b/Editor/Virtualization/DefaultDataObfuscator.cs index ad86c79..54e2b02 100644 --- a/Editor/Virtualization/DefaultDataObfuscator.cs +++ b/Editor/Virtualization/DefaultDataObfuscator.cs @@ -15,10 +15,10 @@ namespace Obfuz.Virtualization var ctx = new CompileContext { method = method, - obfuscatedInstructions = obfuscatedInstructions, + output = obfuscatedInstructions, }; node.Compile(ctx); - obfuscatedInstructions.Add(Instruction.Create(OpCodes.Ldc_I4, value)); + //obfuscatedInstructions.Add(Instruction.Create(OpCodes.Ldc_I4, value)); } public void ObfuscateLong(MethodDef method, long value, List obfuscatedInstructions) diff --git a/Editor/Virtualization/Functions/FunctionBase.cs b/Editor/Virtualization/Functions/FunctionBase.cs index c8becc8..b8de5d8 100644 --- a/Editor/Virtualization/Functions/FunctionBase.cs +++ b/Editor/Virtualization/Functions/FunctionBase.cs @@ -1,4 +1,5 @@ -using NUnit.Framework; +using dnlib.DotNet.Emit; +using NUnit.Framework; using System.Collections.Generic; using System.Linq; @@ -11,7 +12,18 @@ namespace Obfuz.Virtualization public abstract void CreateArguments(DataNodeType type, object value, CreateExpressionOptions options, List args); - public ConstExpression CreateCallable(DataNodeType type, object value, CreateExpressionOptions options) + public abstract void CompileSelf(CompileContext ctx, List output); + + public virtual void Compile(CompileContext ctx, List inputs, ConstValue result) + { + foreach (var input in inputs) + { + input.Compile(ctx); + } + CompileSelf(ctx, ctx.output); + } + + public ConstExpression 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 dfc8c1c..e71f8d8 100644 --- a/Editor/Virtualization/Functions/Int32FunctionAdd.cs +++ b/Editor/Virtualization/Functions/Int32FunctionAdd.cs @@ -1,4 +1,5 @@ -using System; +using dnlib.DotNet.Emit; +using System; using System.Collections.Generic; using System.Data; using System.Linq; @@ -21,5 +22,10 @@ namespace Obfuz.Virtualization.Functions args.Add(new ConstValue(DataNodeType.Int32, op1)); args.Add(new ConstValue(DataNodeType.Int32, op2)); } + + public override void CompileSelf(CompileContext ctx, List output) + { + output.Add(Instruction.Create(OpCodes.Add)); + } } } diff --git a/Editor/Virtualization/Functions/Int32FunctionXor.cs b/Editor/Virtualization/Functions/Int32FunctionXor.cs index 3324d28..dc8bd87 100644 --- a/Editor/Virtualization/Functions/Int32FunctionXor.cs +++ b/Editor/Virtualization/Functions/Int32FunctionXor.cs @@ -1,4 +1,5 @@ -using System; +using dnlib.DotNet.Emit; +using System; using System.Collections.Generic; using System.Data; using System.Linq; @@ -21,5 +22,10 @@ namespace Obfuz.Virtualization.Functions args.Add(new ConstValue(DataNodeType.Int32, op1)); args.Add(new ConstValue(DataNodeType.Int32, op2)); } + + public override void CompileSelf(CompileContext ctx, List output) + { + output.Add(Instruction.Create(OpCodes.And)); + } } } diff --git a/Editor/Virtualization/IFunction.cs b/Editor/Virtualization/IFunction.cs index 96f7a44..4ac4623 100644 --- a/Editor/Virtualization/IFunction.cs +++ b/Editor/Virtualization/IFunction.cs @@ -1,9 +1,13 @@ -namespace Obfuz.Virtualization +using System.Collections.Generic; + +namespace Obfuz.Virtualization { public interface IFunction { DataNodeType ReturnType { get; } - ConstExpression CreateCallable(DataNodeType type, object value, CreateExpressionOptions options); + ConstExpression 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 115c0d1..39c106c 100644 --- a/Editor/Virtualization/RandomDataNodeCreator.cs +++ b/Editor/Virtualization/RandomDataNodeCreator.cs @@ -33,7 +33,7 @@ namespace Obfuz.Virtualization } var func = funcs[options.random.NextInt(funcs.Count)]; ++options.depth; - return func.CreateCallable(type, value, options); + return func.CreateExpr(type, value, options); } public IDataNode CreateRandom(DataNodeType type, object value)