initial commit
This commit is contained in:
@@ -0,0 +1,56 @@
|
||||
using dnlib.DotNet;
|
||||
using dnlib.DotNet.Emit;
|
||||
|
||||
namespace Obfuscator.Obfuscator.Mutation2;
|
||||
|
||||
public class MulToShift : iMutation
|
||||
{
|
||||
public void Prepare(TypeDef type)
|
||||
{
|
||||
}
|
||||
|
||||
public void Process(MethodDef method, ref int index)
|
||||
{
|
||||
if (!method.Body.Instructions[index - 1].IsLdcI4() || !method.Body.Instructions[index - 2].IsLdcI4())
|
||||
{
|
||||
return;
|
||||
}
|
||||
int ldcI4Value = method.Body.Instructions[index - 2].GetLdcI4Value();
|
||||
int ldcI4Value2 = method.Body.Instructions[index - 1].GetLdcI4Value();
|
||||
if (ldcI4Value2 < 3)
|
||||
{
|
||||
return;
|
||||
}
|
||||
Local local = new Local(method.Module.CorLibTypes.Int32);
|
||||
method.Body.Variables.Add(local);
|
||||
method.Body.Instructions.Insert(0, new Instruction(OpCodes.Stloc, local));
|
||||
method.Body.Instructions.Insert(0, new Instruction(OpCodes.Ldc_I4, ldcI4Value));
|
||||
index += 2;
|
||||
method.Body.Instructions[index - 2].OpCode = OpCodes.Ldloc;
|
||||
method.Body.Instructions[index - 2].Operand = local;
|
||||
method.Body.Instructions[index - 1].OpCode = OpCodes.Nop;
|
||||
method.Body.Instructions[index].OpCode = OpCodes.Nop;
|
||||
int num = 0;
|
||||
for (int num2 = ldcI4Value2; num2 > 0; num2 >>= 1)
|
||||
{
|
||||
if ((num2 & 1) == 1 && num != 0)
|
||||
{
|
||||
method.Body.Instructions.Insert(++index, new Instruction(OpCodes.Ldloc, local));
|
||||
method.Body.Instructions.Insert(++index, new Instruction(OpCodes.Ldc_I4, num));
|
||||
method.Body.Instructions.Insert(++index, new Instruction(OpCodes.Shl));
|
||||
method.Body.Instructions.Insert(++index, new Instruction(OpCodes.Add));
|
||||
}
|
||||
num++;
|
||||
}
|
||||
if ((ldcI4Value2 & 1) == 0)
|
||||
{
|
||||
method.Body.Instructions.Insert(++index, new Instruction(OpCodes.Ldloc, local));
|
||||
method.Body.Instructions.Insert(++index, new Instruction(OpCodes.Sub));
|
||||
}
|
||||
}
|
||||
|
||||
public bool Supported(Instruction instr)
|
||||
{
|
||||
return instr.OpCode == OpCodes.Mul;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user