56 lines
1.9 KiB
C#
56 lines
1.9 KiB
C#
using System;
|
|
using System.Linq;
|
|
using dnlib.DotNet;
|
|
using dnlib.DotNet.Emit;
|
|
|
|
namespace Obfuscator.Obfuscator.Calli;
|
|
|
|
internal class Calli
|
|
{
|
|
public static void Execute(ModuleDef module)
|
|
{
|
|
TypeDef[] array = module.Types.ToArray();
|
|
for (int i = 0; i < array.Length; i++)
|
|
{
|
|
MethodDef[] array2 = array[i].Methods.ToArray();
|
|
foreach (MethodDef methodDef in array2)
|
|
{
|
|
if (!methodDef.HasBody || !methodDef.Body.HasInstructions || methodDef.FullName.Contains("My.") || methodDef.FullName.Contains(".My") || methodDef.FullName.Contains("Costura") || methodDef.IsConstructor || methodDef.DeclaringType.IsGlobalModuleType)
|
|
{
|
|
continue;
|
|
}
|
|
for (int k = 0; k < methodDef.Body.Instructions.Count - 1; k++)
|
|
{
|
|
try
|
|
{
|
|
if (!methodDef.Body.Instructions[k].ToString().Contains("ISupportInitialize") && (methodDef.Body.Instructions[k].OpCode == OpCodes.Call || methodDef.Body.Instructions[k].OpCode == OpCodes.Callvirt || methodDef.Body.Instructions[k].OpCode == OpCodes.Ldloc_S) && !methodDef.Body.Instructions[k].ToString().Contains("Object") && (methodDef.Body.Instructions[k].OpCode == OpCodes.Call || methodDef.Body.Instructions[k].OpCode == OpCodes.Callvirt || methodDef.Body.Instructions[k].OpCode == OpCodes.Ldloc_S))
|
|
{
|
|
try
|
|
{
|
|
MemberRef memberRef = (MemberRef)methodDef.Body.Instructions[k].Operand;
|
|
methodDef.Body.Instructions[k].OpCode = OpCodes.Calli;
|
|
methodDef.Body.Instructions[k].Operand = memberRef.MethodSig;
|
|
methodDef.Body.Instructions.Insert(k, Instruction.Create(OpCodes.Ldftn, memberRef));
|
|
}
|
|
catch (Exception)
|
|
{
|
|
}
|
|
}
|
|
}
|
|
catch (Exception)
|
|
{
|
|
}
|
|
}
|
|
}
|
|
foreach (MethodDef method in module.GlobalType.Methods)
|
|
{
|
|
if (!(method.Name != ".ctor"))
|
|
{
|
|
module.GlobalType.Remove(method);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|