新增 IntRotateShift
parent
6d786330d1
commit
f23ea3a46c
|
@ -7,5 +7,7 @@
|
||||||
int NextInt(int max);
|
int NextInt(int max);
|
||||||
|
|
||||||
int NextInt();
|
int NextInt();
|
||||||
|
|
||||||
|
long NextLong();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -54,5 +54,10 @@ namespace Obfuz.Utils
|
||||||
{
|
{
|
||||||
return _random.Next() ^ GetNextKeyByte();
|
return _random.Next() ^ GetNextKeyByte();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public long NextLong()
|
||||||
|
{
|
||||||
|
return ((long)NextInt() << 32) | (uint)NextInt();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,9 +40,9 @@ namespace Obfuz.Virtualization
|
||||||
|
|
||||||
public void ObfuscateLong(MethodDef method, long value, List<Instruction> obfuscatedInstructions)
|
public void ObfuscateLong(MethodDef method, long value, List<Instruction> obfuscatedInstructions)
|
||||||
{
|
{
|
||||||
//IDataNode node = _nodeCreator.CreateRandom(DataNodeType.Int64, value);
|
IDataNode node = _nodeCreator.CreateRandom(DataNodeType.Int64, value);
|
||||||
//CompileNode(node, method, obfuscatedInstructions);
|
CompileNode(node, method, obfuscatedInstructions);
|
||||||
obfuscatedInstructions.Add(Instruction.Create(OpCodes.Ldc_I8, value));
|
//obfuscatedInstructions.Add(Instruction.Create(OpCodes.Ldc_I8, value));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ObfuscateFloat(MethodDef method, float value, List<Instruction> obfuscatedInstructions)
|
public void ObfuscateFloat(MethodDef method, float value, List<Instruction> obfuscatedInstructions)
|
||||||
|
|
|
@ -22,7 +22,7 @@ namespace Obfuz.Virtualization
|
||||||
CompileSelf(ctx, ctx.output);
|
CompileSelf(ctx, ctx.output);
|
||||||
}
|
}
|
||||||
|
|
||||||
public IDataNode CreateExpr(DataNodeType type, object value, CreateExpressionOptions options)
|
public virtual IDataNode CreateExpr(DataNodeType type, object value, CreateExpressionOptions options)
|
||||||
{
|
{
|
||||||
var args = new List<ConstValue>();
|
var args = new List<ConstValue>();
|
||||||
CreateArguments(type, value, options, args);
|
CreateArguments(type, value, options, args);
|
||||||
|
|
|
@ -1,30 +0,0 @@
|
||||||
using dnlib.DotNet.Emit;
|
|
||||||
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 : FunctionBase
|
|
||||||
{
|
|
||||||
|
|
||||||
public override void CreateArguments(DataNodeType type, object v, CreateExpressionOptions options, List<ConstValue> args)
|
|
||||||
{
|
|
||||||
int value = (int)v;
|
|
||||||
|
|
||||||
int op1 = options.random.NextInt();
|
|
||||||
int op2 = value - op1;
|
|
||||||
args.Add(new ConstValue(DataNodeType.Int32, op1));
|
|
||||||
args.Add(new ConstValue(DataNodeType.Int32, op2));
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void CompileSelf(CompileContext ctx, List<Instruction> output)
|
|
||||||
{
|
|
||||||
output.Add(Instruction.Create(OpCodes.Add));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,30 +0,0 @@
|
||||||
using dnlib.DotNet.Emit;
|
|
||||||
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 Int32FunctionXor : FunctionBase
|
|
||||||
{
|
|
||||||
|
|
||||||
public override void CreateArguments(DataNodeType type, object v, CreateExpressionOptions options, List<ConstValue> args)
|
|
||||||
{
|
|
||||||
int value = (int)v;
|
|
||||||
|
|
||||||
int op1 = options.random.NextInt();
|
|
||||||
int op2 = value ^ op1;
|
|
||||||
args.Add(new ConstValue(DataNodeType.Int32, op1));
|
|
||||||
args.Add(new ConstValue(DataNodeType.Int32, op2));
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void CompileSelf(CompileContext ctx, List<Instruction> output)
|
|
||||||
{
|
|
||||||
output.Add(Instruction.Create(OpCodes.Xor));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -0,0 +1,50 @@
|
||||||
|
using dnlib.DotNet.Emit;
|
||||||
|
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 IntAdd : FunctionBase
|
||||||
|
{
|
||||||
|
|
||||||
|
public override void CreateArguments(DataNodeType type, object v, CreateExpressionOptions options, List<ConstValue> args)
|
||||||
|
{
|
||||||
|
switch (type)
|
||||||
|
{
|
||||||
|
case DataNodeType.Int32:
|
||||||
|
{
|
||||||
|
int value = (int)v;
|
||||||
|
|
||||||
|
int op1 = options.random.NextInt();
|
||||||
|
int op2 = value - op1;
|
||||||
|
args.Add(new ConstValue(DataNodeType.Int32, op1));
|
||||||
|
args.Add(new ConstValue(DataNodeType.Int32, op2));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case DataNodeType.Int64:
|
||||||
|
{
|
||||||
|
long value = (long)v;
|
||||||
|
long op1 = options.random.NextLong();
|
||||||
|
long op2 = value - op1;
|
||||||
|
args.Add(new ConstValue(DataNodeType.Int64, op1));
|
||||||
|
args.Add(new ConstValue(DataNodeType.Int64, op2));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
throw new NotSupportedException($"Unsupported type: {type}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void CompileSelf(CompileContext ctx, List<Instruction> output)
|
||||||
|
{
|
||||||
|
output.Add(Instruction.Create(OpCodes.Add));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,73 @@
|
||||||
|
using dnlib.DotNet.Emit;
|
||||||
|
using NUnit.Framework;
|
||||||
|
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 IntRotateShift : FunctionBase
|
||||||
|
{
|
||||||
|
|
||||||
|
public override void CreateArguments(DataNodeType type, object v, CreateExpressionOptions options, List<ConstValue> args)
|
||||||
|
{
|
||||||
|
switch (type)
|
||||||
|
{
|
||||||
|
case DataNodeType.Int32:
|
||||||
|
{
|
||||||
|
int value = (int)v;
|
||||||
|
|
||||||
|
// (value >> amount) | (value << (32 - amount))
|
||||||
|
// << amount
|
||||||
|
// value = b31 b30 .. b0;
|
||||||
|
int leftShiftAmount = options.random.NextInt(8, 16);
|
||||||
|
uint op1 = (uint)value >> leftShiftAmount;
|
||||||
|
int rightShiftAmount = 32 - leftShiftAmount;
|
||||||
|
uint op2 = (uint)value << rightShiftAmount;
|
||||||
|
Assert.AreEqual((uint)value, (op1 << leftShiftAmount) | (op2 >> rightShiftAmount));
|
||||||
|
args.Add(new ConstValue(DataNodeType.Int32, (int)op1));
|
||||||
|
args.Add(new ConstValue(DataNodeType.Int32, leftShiftAmount));
|
||||||
|
args.Add(new ConstValue(DataNodeType.Int32, (int)op2));
|
||||||
|
args.Add(new ConstValue(DataNodeType.Int32, rightShiftAmount));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case DataNodeType.Int64:
|
||||||
|
{
|
||||||
|
long value = (long)v;
|
||||||
|
int leftShiftAmount = options.random.NextInt(16, 32);
|
||||||
|
ulong op1 = (ulong)value >> leftShiftAmount;
|
||||||
|
int rightShiftAmount = 64 - leftShiftAmount;
|
||||||
|
ulong op2 = (ulong)value << rightShiftAmount;
|
||||||
|
Assert.AreEqual((ulong)value, (op1 << leftShiftAmount) | (op2 >> rightShiftAmount));
|
||||||
|
args.Add(new ConstValue(DataNodeType.Int64, (long)op1));
|
||||||
|
args.Add(new ConstValue(DataNodeType.Int32, leftShiftAmount));
|
||||||
|
args.Add(new ConstValue(DataNodeType.Int64, (long)op2));
|
||||||
|
args.Add(new ConstValue(DataNodeType.Int32, rightShiftAmount));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: throw new NotSupportedException($"Unsupported type {type} for IntRotateShift");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void CompileSelf(CompileContext ctx, List<Instruction> output)
|
||||||
|
{
|
||||||
|
output.Add(Instruction.Create(OpCodes.Xor));
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Compile(CompileContext ctx, List<IDataNode> inputs, ConstValue result)
|
||||||
|
{
|
||||||
|
Assert.AreEqual(inputs.Count, 4);
|
||||||
|
inputs[0].Compile(ctx);
|
||||||
|
inputs[1].Compile(ctx);
|
||||||
|
ctx.output.Add(Instruction.Create(OpCodes.Shl));
|
||||||
|
inputs[2].Compile(ctx);
|
||||||
|
inputs[3].Compile(ctx);
|
||||||
|
ctx.output.Add(Instruction.Create(OpCodes.Shr_Un));
|
||||||
|
ctx.output.Add(Instruction.Create(OpCodes.Or));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,46 @@
|
||||||
|
using dnlib.DotNet.Emit;
|
||||||
|
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 IntXor : FunctionBase
|
||||||
|
{
|
||||||
|
|
||||||
|
public override void CreateArguments(DataNodeType type, object v, CreateExpressionOptions options, List<ConstValue> args)
|
||||||
|
{
|
||||||
|
switch (type)
|
||||||
|
{
|
||||||
|
case DataNodeType.Int32:
|
||||||
|
{
|
||||||
|
int value = (int)v;
|
||||||
|
int op1 = options.random.NextInt();
|
||||||
|
int op2 = value ^ op1;
|
||||||
|
args.Add(new ConstValue(DataNodeType.Int32, op1));
|
||||||
|
args.Add(new ConstValue(DataNodeType.Int32, op2));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case DataNodeType.Int64:
|
||||||
|
{
|
||||||
|
long value = (long)v;
|
||||||
|
long op1 = options.random.NextLong();
|
||||||
|
long op2 = value ^ op1;
|
||||||
|
args.Add(new ConstValue(DataNodeType.Int64, op1));
|
||||||
|
args.Add(new ConstValue(DataNodeType.Int64, op2));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: throw new NotSupportedException($"Unsupported type {type} for Int32FunctionXor");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void CompileSelf(CompileContext ctx, List<Instruction> output)
|
||||||
|
{
|
||||||
|
output.Add(Instruction.Create(OpCodes.Xor));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -16,12 +16,14 @@ namespace Obfuz.Virtualization
|
||||||
_random = random;
|
_random = random;
|
||||||
var int32Funcs = new List<IFunction>()
|
var int32Funcs = new List<IFunction>()
|
||||||
{
|
{
|
||||||
new Int32FunctionAdd(),
|
//new IntAdd(),
|
||||||
new Int32FunctionXor(),
|
//new IntXor(),
|
||||||
|
new IntRotateShift(),
|
||||||
//new ConstFromFieldRvaDataCreator(),
|
//new ConstFromFieldRvaDataCreator(),
|
||||||
//new ConstDataCreator(),
|
//new ConstDataCreator(),
|
||||||
};
|
};
|
||||||
_functions.Add(DataNodeType.Int32, int32Funcs);
|
_functions.Add(DataNodeType.Int32, int32Funcs);
|
||||||
|
_functions.Add(DataNodeType.Int64, int32Funcs);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override IDataNode CreateRandom(DataNodeType type, object value, CreateExpressionOptions options)
|
public override IDataNode CreateRandom(DataNodeType type, object value, CreateExpressionOptions options)
|
||||||
|
@ -30,11 +32,11 @@ namespace Obfuz.Virtualization
|
||||||
{
|
{
|
||||||
throw new System.Exception($"No functions available for type {type}");
|
throw new System.Exception($"No functions available for type {type}");
|
||||||
}
|
}
|
||||||
if (options.depth >= 2)
|
if (options.depth >= 3)
|
||||||
{
|
{
|
||||||
//return new ConstDataNode() { Type = type, Value = value };
|
//return new ConstDataNode() { Type = type, Value = value };
|
||||||
//return _random.NextInt(100) < 50 ?
|
return _random.NextInt(100) < 50 ?
|
||||||
return true ?
|
//return true ?
|
||||||
new ConstFromFieldRvaDataNode() { Type = type, Value = value } :
|
new ConstFromFieldRvaDataNode() { Type = type, Value = value } :
|
||||||
new ConstDataNode() { Type = type, Value = value };
|
new ConstDataNode() { Type = type, Value = value };
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue