From 33f83d5432e6997a625b4f19cecea4ec57b6c8e5 Mon Sep 17 00:00:00 2001 From: walon Date: Sun, 20 Apr 2025 15:20:13 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0add=20=E8=A1=A8=E8=BE=BE?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...tPrimitiveDataNode.cs => ConstDataNode.cs} | 24 +++++++++++---- Editor/Virtualization/ConstExpression.cs | 11 ++++++- Editor/Virtualization/ConstFieldDataNode.cs | 22 ++++++++++---- Editor/Virtualization/ConstStringDataNode.cs | 15 ---------- Editor/Virtualization/ConstValue.cs | 13 ++++++++ .../Virtualization/CreateExpressionOptions.cs | 4 ++- Editor/Virtualization/DataNodeBase.cs | 1 + Editor/Virtualization/DataNodeType.cs | 2 +- Editor/Virtualization/FunctionBase.cs | 30 +++++++++++++++++++ .../Functions/Int32FunctionAdd.cs | 25 ++++++++++++++++ .../Functions/Int32FunctionBase.cs | 14 +++++++++ Editor/Virtualization/IDataNodeCreator.cs | 7 +++++ Editor/Virtualization/IFunction.cs | 2 ++ Editor/Virtualization/IRandom.cs | 2 ++ ...{ConstBytesDataNode.cs => RvaBytesNode.cs} | 5 +--- 15 files changed, 144 insertions(+), 33 deletions(-) rename Editor/Virtualization/{ConstPrimitiveDataNode.cs => ConstDataNode.cs} (69%) delete mode 100644 Editor/Virtualization/ConstStringDataNode.cs create mode 100644 Editor/Virtualization/ConstValue.cs create mode 100644 Editor/Virtualization/FunctionBase.cs create mode 100644 Editor/Virtualization/Functions/Int32FunctionAdd.cs create mode 100644 Editor/Virtualization/Functions/Int32FunctionBase.cs create mode 100644 Editor/Virtualization/IDataNodeCreator.cs rename Editor/Virtualization/{ConstBytesDataNode.cs => RvaBytesNode.cs} (62%) diff --git a/Editor/Virtualization/ConstPrimitiveDataNode.cs b/Editor/Virtualization/ConstDataNode.cs similarity index 69% rename from Editor/Virtualization/ConstPrimitiveDataNode.cs rename to Editor/Virtualization/ConstDataNode.cs index 696b317..82892bc 100644 --- a/Editor/Virtualization/ConstPrimitiveDataNode.cs +++ b/Editor/Virtualization/ConstDataNode.cs @@ -2,7 +2,7 @@ namespace Obfuz.Virtualization { - public class ConstPrimitiveDataNode : DataNodeAny + public class ConstDataNode : DataNodeAny { public override void Compile(CompileContext ctx) @@ -10,11 +10,11 @@ namespace Obfuz.Virtualization switch (Type) { - case DataNodeType.Byte: - { - // create ldloc.i4 - break; - } + //case DataNodeType.Byte: + //{ + // // create ldloc.i4 + // break; + //} case DataNodeType.Int32: { // create ldloc.i4 @@ -40,6 +40,18 @@ namespace Obfuz.Virtualization // 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/ConstExpression.cs b/Editor/Virtualization/ConstExpression.cs index b0d13a3..3cfc750 100644 --- a/Editor/Virtualization/ConstExpression.cs +++ b/Editor/Virtualization/ConstExpression.cs @@ -5,7 +5,16 @@ namespace Obfuz.Virtualization public class ConstExpression : DataNodeAny { public IFunction function; - public readonly List Inputs = new List(); + public readonly List inputs; + public readonly ConstValue result; + + public ConstExpression(IFunction function, List inputs, ConstValue result) + { + this.function = function; + this.inputs = inputs; + Type = function.ReturnType; + this.result = result; + } public override void Compile(CompileContext ctx) { diff --git a/Editor/Virtualization/ConstFieldDataNode.cs b/Editor/Virtualization/ConstFieldDataNode.cs index 0a5f849..44df38f 100644 --- a/Editor/Virtualization/ConstFieldDataNode.cs +++ b/Editor/Virtualization/ConstFieldDataNode.cs @@ -10,11 +10,11 @@ namespace Obfuz.Virtualization switch (Type) { - case DataNodeType.Byte: - { - // create ldloc.i4 - break; - } + //case DataNodeType.Byte: + //{ + // // create ldloc.i4 + // break; + //} case DataNodeType.Int32: { // create ldloc.i4 @@ -40,6 +40,18 @@ namespace Obfuz.Virtualization // 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/ConstStringDataNode.cs b/Editor/Virtualization/ConstStringDataNode.cs deleted file mode 100644 index 33624cf..0000000 --- a/Editor/Virtualization/ConstStringDataNode.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; - -namespace Obfuz.Virtualization -{ - public class ConstStringDataNode : DataNodeBase - { - - public override void Compile(CompileContext ctx) - { - - - // create ldstr - } - } -} diff --git a/Editor/Virtualization/ConstValue.cs b/Editor/Virtualization/ConstValue.cs new file mode 100644 index 0000000..7c862d1 --- /dev/null +++ b/Editor/Virtualization/ConstValue.cs @@ -0,0 +1,13 @@ +namespace Obfuz.Virtualization +{ + public struct ConstValue + { + public readonly DataNodeType type; + public readonly object value; + public ConstValue(DataNodeType type, object value) + { + this.type = type; + this.value = value; + } + } +} diff --git a/Editor/Virtualization/CreateExpressionOptions.cs b/Editor/Virtualization/CreateExpressionOptions.cs index 0294bfe..31930e1 100644 --- a/Editor/Virtualization/CreateExpressionOptions.cs +++ b/Editor/Virtualization/CreateExpressionOptions.cs @@ -1,7 +1,9 @@ namespace Obfuz.Virtualization { - public class CreateExpressionOptions + public struct CreateExpressionOptions { public IRandom random; + public IDataNodeCreator expressionCreator; + public int depth; } } diff --git a/Editor/Virtualization/DataNodeBase.cs b/Editor/Virtualization/DataNodeBase.cs index d2f581e..6d37231 100644 --- a/Editor/Virtualization/DataNodeBase.cs +++ b/Editor/Virtualization/DataNodeBase.cs @@ -27,6 +27,7 @@ public abstract class DataNodeAny : DataNodeBase { private object _value; + public override object Value { get => _value; diff --git a/Editor/Virtualization/DataNodeType.cs b/Editor/Virtualization/DataNodeType.cs index 71bb9e3..081e292 100644 --- a/Editor/Virtualization/DataNodeType.cs +++ b/Editor/Virtualization/DataNodeType.cs @@ -2,7 +2,7 @@ { public enum DataNodeType { - Byte, + //Byte, Int32, Int64, Float32, diff --git a/Editor/Virtualization/FunctionBase.cs b/Editor/Virtualization/FunctionBase.cs new file mode 100644 index 0000000..a6585cb --- /dev/null +++ b/Editor/Virtualization/FunctionBase.cs @@ -0,0 +1,30 @@ +using NUnit.Framework; +using System.Collections.Generic; +using System.Linq; + +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); + + public ConstExpression CreateCallable(IDataNode result, CreateExpressionOptions options) + { + var args = new List(); + CreateArguments(result.Type, result.Value, options, args); + + options.depth += 1; + var argNodes = new List(); + foreach (ConstValue cv in args) + { + var argNode = options.expressionCreator.CreateRandom(cv.type, cv.value, options); + argNodes.Add(argNode); + } + + return new ConstExpression(this, args.Select(a => options.expressionCreator.CreateRandom(a.type, a.value, options)).ToList(), new ConstValue(result.Type, result.Value)); + } + } +} diff --git a/Editor/Virtualization/Functions/Int32FunctionAdd.cs b/Editor/Virtualization/Functions/Int32FunctionAdd.cs new file mode 100644 index 0000000..e7d85c9 --- /dev/null +++ b/Editor/Virtualization/Functions/Int32FunctionAdd.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using static UnityEngine.Networking.UnityWebRequest; + +namespace Obfuz.Virtualization.Functions +{ + public class Int32FunctionAdd : Int32FunctionBase + { + public override DataNodeType ReturnType => DataNodeType.Int32; + + public override void CreateArguments(DataNodeType type, object v, CreateExpressionOptions options, List args) + { + int value = (int)v; + + int op1 = value >= 0 ? options.random.NextInt(value) : -options.random.NextInt(-value); + int op2 = value - op1; + args.Add(new ConstValue(DataNodeType.Int32, op1)); + args.Add(new ConstValue(DataNodeType.Int32, op2)); + } + } +} diff --git a/Editor/Virtualization/Functions/Int32FunctionBase.cs b/Editor/Virtualization/Functions/Int32FunctionBase.cs new file mode 100644 index 0000000..e52e186 --- /dev/null +++ b/Editor/Virtualization/Functions/Int32FunctionBase.cs @@ -0,0 +1,14 @@ +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/IDataNodeCreator.cs b/Editor/Virtualization/IDataNodeCreator.cs new file mode 100644 index 0000000..4d21449 --- /dev/null +++ b/Editor/Virtualization/IDataNodeCreator.cs @@ -0,0 +1,7 @@ +namespace Obfuz.Virtualization +{ + public interface IDataNodeCreator + { + IDataNode CreateRandom(DataNodeType type, object value, CreateExpressionOptions options); + } +} diff --git a/Editor/Virtualization/IFunction.cs b/Editor/Virtualization/IFunction.cs index 04c835e..a71eeb6 100644 --- a/Editor/Virtualization/IFunction.cs +++ b/Editor/Virtualization/IFunction.cs @@ -2,6 +2,8 @@ { public interface IFunction { + DataNodeType ReturnType { get; } + ConstExpression CreateCallable(IDataNode result, CreateExpressionOptions options); } } diff --git a/Editor/Virtualization/IRandom.cs b/Editor/Virtualization/IRandom.cs index daeb7e5..e50e1bd 100644 --- a/Editor/Virtualization/IRandom.cs +++ b/Editor/Virtualization/IRandom.cs @@ -2,6 +2,8 @@ { public interface IRandom { + int NextInt(int min, int max); + int NextInt(int max); } } diff --git a/Editor/Virtualization/ConstBytesDataNode.cs b/Editor/Virtualization/RvaBytesNode.cs similarity index 62% rename from Editor/Virtualization/ConstBytesDataNode.cs rename to Editor/Virtualization/RvaBytesNode.cs index d3c3de0..e3acbfd 100644 --- a/Editor/Virtualization/ConstBytesDataNode.cs +++ b/Editor/Virtualization/RvaBytesNode.cs @@ -6,15 +6,12 @@ using System.Threading.Tasks; namespace Obfuz.Virtualization { - public class ConstBytesDataNode : DataNodeAny + public class RvaBytesNode : DataNodeBase { public override void Compile(CompileContext ctx) { - - // create ldstr - // RuntimeHelpers.InitializeArray(array, fieldHandle); } } }