Files
Liberium-1.8-Source-Code/Obfuscator.Obfuscator.ConstMelting/ConstMelting.cs
T

87 lines
2.5 KiB
C#
Raw Normal View History

2026-08-27 11:21:58 -06:00
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;
}
}