87 lines
2.5 KiB
C#
87 lines
2.5 KiB
C#
using System.Linq;
|
|||
|
|
using dnlib.DotNet;
|
||
|
|
using dnlib.DotNet.Emit;
|
||
|
|
using Obfuscator.Helper;
|
||
|
|
|
||
|
|
namespace Obfuscator.Obfuscator.ConstMelting;
|
||
|
|
|
||
|
|
internal class ConstMelting
|
||
|
|
{
|
||
|
|
public static void Execute(ModuleDef moduleDef)
|
||
|
|
{
|
||
|
|
TypeDef[] array = moduleDef.Types.ToArray();
|
||
|
|
for (int i = 0; i < array.Length; i++)
|
||
|
|
{
|
||
|
|
MethodDef[] array2 = array[i].Methods.ToArray();
|
||
|
|
foreach (MethodDef methodDef in array2)
|
||
|
|
{
|
||
|
|
ReplaceStringLiterals(methodDef);
|
||
|
|
ReplaceIntLiterals(methodDef);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
private static void ReplaceStringLiterals(MethodDef methodDef)
|
||
|
|
{
|
||
|
|
if (!CanObfuscate(methodDef))
|
||
|
|
{
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
foreach (Instruction instruction in methodDef.Body.Instructions)
|
||
|
|
{
|
||
|
|
if (instruction.OpCode == OpCodes.Ldstr)
|
||
|
|
{
|
||
|
|
MethodDef methodDef2 = new MethodDefUser(Methods.GenerateString(), MethodSig.CreateStatic(methodDef.DeclaringType.Module.CorLibTypes.String), MethodImplAttributes.IL, MethodAttributes.Public | MethodAttributes.Static | MethodAttributes.HideBySig)
|
||
|
|
{
|
||
|
|
Body = new CilBody()
|
||
|
|
};
|
||
|
|
methodDef2.Body.Instructions.Add(new Instruction(OpCodes.Ldstr, instruction.Operand.ToString()));
|
||
|
|
methodDef2.Body.Instructions.Add(new Instruction(OpCodes.Ret));
|
||
|
|
methodDef.DeclaringType.Methods.Add(methodDef2);
|
||
|
|
instruction.OpCode = OpCodes.Call;
|
||
|
|
instruction.Operand = methodDef2;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
private static void ReplaceIntLiterals(MethodDef methodDef)
|
||
|
|
{
|
||
|
|
if (!CanObfuscate(methodDef))
|
||
|
|
{
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
foreach (Instruction instruction in methodDef.Body.Instructions)
|
||
|
|
{
|
||
|
|
if (instruction.OpCode == OpCodes.Ldc_I4)
|
||
|
|
{
|
||
|
|
MethodDef methodDef2 = new MethodDefUser(Methods.GenerateString(), MethodSig.CreateStatic(methodDef.DeclaringType.Module.CorLibTypes.Int32), MethodImplAttributes.IL, MethodAttributes.Public | MethodAttributes.Static | MethodAttributes.HideBySig)
|
||
|
|
{
|
||
|
|
Body = new CilBody()
|
||
|
|
};
|
||
|
|
methodDef2.Body.Instructions.Add(new Instruction(OpCodes.Ldc_I4, instruction.GetLdcI4Value()));
|
||
|
|
methodDef2.Body.Instructions.Add(new Instruction(OpCodes.Ret));
|
||
|
|
methodDef.DeclaringType.Methods.Add(methodDef2);
|
||
|
|
instruction.OpCode = OpCodes.Call;
|
||
|
|
instruction.Operand = methodDef2;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
public static bool CanObfuscate(MethodDef methodDef)
|
||
|
|
{
|
||
|
|
if (!methodDef.HasBody)
|
||
|
|
{
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
if (!methodDef.Body.HasInstructions)
|
||
|
|
{
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
if (methodDef.DeclaringType.IsGlobalModuleType)
|
||
|
|
{
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
}
|