常量混淆
parent
945c6a074c
commit
b19959488f
|
@ -11,11 +11,6 @@ namespace Obfuz
|
||||||
public class CleanUpInstructionPass : ObfuscationPassBase
|
public class CleanUpInstructionPass : ObfuscationPassBase
|
||||||
{
|
{
|
||||||
public override void Process(ObfuscatorContext ctx)
|
public override void Process(ObfuscatorContext ctx)
|
||||||
{
|
|
||||||
// TODO remove all nop instructions
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void Start(ObfuscatorContext ctx)
|
|
||||||
{
|
{
|
||||||
foreach (var ass in ctx.assemblies)
|
foreach (var ass in ctx.assemblies)
|
||||||
{
|
{
|
||||||
|
@ -29,12 +24,17 @@ namespace Obfuz
|
||||||
body.SimplifyBranches();
|
body.SimplifyBranches();
|
||||||
body.OptimizeMacros();
|
body.OptimizeMacros();
|
||||||
body.OptimizeBranches();
|
body.OptimizeBranches();
|
||||||
|
// TODO remove dup
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void Start(ObfuscatorContext ctx)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
public override void Stop(ObfuscatorContext ctx)
|
public override void Stop(ObfuscatorContext ctx)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
|
@ -8,6 +8,6 @@ namespace Obfuz.Virtualization
|
||||||
public class CompileContext
|
public class CompileContext
|
||||||
{
|
{
|
||||||
public MethodDef method;
|
public MethodDef method;
|
||||||
public List<Instruction> obfuscatedInstructions;
|
public List<Instruction> output;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
using System;
|
using dnlib.DotNet.Emit;
|
||||||
|
using System;
|
||||||
|
|
||||||
namespace Obfuz.Virtualization
|
namespace Obfuz.Virtualization
|
||||||
{
|
{
|
||||||
|
@ -17,48 +18,18 @@ namespace Obfuz.Virtualization
|
||||||
// so we only need to deal int32 and int64
|
// so we only need to deal int32 and int64
|
||||||
switch (Type)
|
switch (Type)
|
||||||
{
|
{
|
||||||
//case DataNodeType.Byte:
|
|
||||||
//{
|
|
||||||
// // create ldloc.i4
|
|
||||||
// break;
|
|
||||||
//}
|
|
||||||
case DataNodeType.Int32:
|
case DataNodeType.Int32:
|
||||||
{
|
{
|
||||||
// create ldloc.i4
|
// create ldloc.i4
|
||||||
|
ctx.output.Add(Instruction.CreateLdcI4(IntValue));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case DataNodeType.Int64:
|
case DataNodeType.Int64:
|
||||||
{
|
{
|
||||||
// create ldloc.i8
|
// create ldloc.i8
|
||||||
|
ctx.output.Add(Instruction.Create(OpCodes.Ldc_I8, LongValue));
|
||||||
break;
|
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:
|
default:
|
||||||
{
|
{
|
||||||
throw new NotImplementedException($"Type:{Type} not implemented");
|
throw new NotImplementedException($"Type:{Type} not implemented");
|
||||||
|
|
|
@ -21,7 +21,7 @@ namespace Obfuz.Virtualization
|
||||||
|
|
||||||
public override void Compile(CompileContext ctx)
|
public override void Compile(CompileContext ctx)
|
||||||
{
|
{
|
||||||
|
function.Compile(ctx, inputs, result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,6 +6,18 @@
|
||||||
|
|
||||||
public abstract object Value { get; set; }
|
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);
|
public abstract void Compile(CompileContext ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -15,10 +15,10 @@ namespace Obfuz.Virtualization
|
||||||
var ctx = new CompileContext
|
var ctx = new CompileContext
|
||||||
{
|
{
|
||||||
method = method,
|
method = method,
|
||||||
obfuscatedInstructions = obfuscatedInstructions,
|
output = obfuscatedInstructions,
|
||||||
};
|
};
|
||||||
node.Compile(ctx);
|
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<Instruction> obfuscatedInstructions)
|
public void ObfuscateLong(MethodDef method, long value, List<Instruction> obfuscatedInstructions)
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
using NUnit.Framework;
|
using dnlib.DotNet.Emit;
|
||||||
|
using NUnit.Framework;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
|
||||||
|
@ -11,7 +12,18 @@ namespace Obfuz.Virtualization
|
||||||
|
|
||||||
public abstract void CreateArguments(DataNodeType type, object value, CreateExpressionOptions options, List<ConstValue> args);
|
public abstract void CreateArguments(DataNodeType type, object value, CreateExpressionOptions options, List<ConstValue> args);
|
||||||
|
|
||||||
public ConstExpression CreateCallable(DataNodeType type, object value, CreateExpressionOptions options)
|
public abstract void CompileSelf(CompileContext ctx, List<Instruction> output);
|
||||||
|
|
||||||
|
public virtual void Compile(CompileContext ctx, List<IDataNode> 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<ConstValue>();
|
var args = new List<ConstValue>();
|
||||||
CreateArguments(type, value, options, args);
|
CreateArguments(type, value, options, args);
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
using System;
|
using dnlib.DotNet.Emit;
|
||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Data;
|
using System.Data;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
@ -21,5 +22,10 @@ namespace Obfuz.Virtualization.Functions
|
||||||
args.Add(new ConstValue(DataNodeType.Int32, op1));
|
args.Add(new ConstValue(DataNodeType.Int32, op1));
|
||||||
args.Add(new ConstValue(DataNodeType.Int32, op2));
|
args.Add(new ConstValue(DataNodeType.Int32, op2));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void CompileSelf(CompileContext ctx, List<Instruction> output)
|
||||||
|
{
|
||||||
|
output.Add(Instruction.Create(OpCodes.Add));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
using System;
|
using dnlib.DotNet.Emit;
|
||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Data;
|
using System.Data;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
@ -21,5 +22,10 @@ namespace Obfuz.Virtualization.Functions
|
||||||
args.Add(new ConstValue(DataNodeType.Int32, op1));
|
args.Add(new ConstValue(DataNodeType.Int32, op1));
|
||||||
args.Add(new ConstValue(DataNodeType.Int32, op2));
|
args.Add(new ConstValue(DataNodeType.Int32, op2));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void CompileSelf(CompileContext ctx, List<Instruction> output)
|
||||||
|
{
|
||||||
|
output.Add(Instruction.Create(OpCodes.And));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +1,13 @@
|
||||||
namespace Obfuz.Virtualization
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace Obfuz.Virtualization
|
||||||
{
|
{
|
||||||
public interface IFunction
|
public interface IFunction
|
||||||
{
|
{
|
||||||
DataNodeType ReturnType { get; }
|
DataNodeType ReturnType { get; }
|
||||||
|
|
||||||
ConstExpression CreateCallable(DataNodeType type, object value, CreateExpressionOptions options);
|
ConstExpression CreateExpr(DataNodeType type, object value, CreateExpressionOptions options);
|
||||||
|
|
||||||
|
void Compile(CompileContext ctx, List<IDataNode> inputs, ConstValue result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,7 +33,7 @@ namespace Obfuz.Virtualization
|
||||||
}
|
}
|
||||||
var func = funcs[options.random.NextInt(funcs.Count)];
|
var func = funcs[options.random.NextInt(funcs.Count)];
|
||||||
++options.depth;
|
++options.depth;
|
||||||
return func.CreateCallable(type, value, options);
|
return func.CreateExpr(type, value, options);
|
||||||
}
|
}
|
||||||
|
|
||||||
public IDataNode CreateRandom(DataNodeType type, object value)
|
public IDataNode CreateRandom(DataNodeType type, object value)
|
||||||
|
|
Loading…
Reference in New Issue