我正在尝试使用Mono.Cecil制作一个C#/ .NET混淆器。 我写了一个重命名方法的基本测试,它似乎工作正常。
我使用JetBrains dotPeek反编译我的混淆输出,以查看我的混淆器的效果。在界面左侧的方法列表中,方法按其模糊名称列出。但是,如果我双击该类以显示完整的反编译代码,则会显示原始方法名称。 是否添加了某些我可以删除的元数据以防止这种情况发生?
以下是我的混淆器的相关代码:
public Program()
{
AssemblyDefinition ass = AssemblyDefinition.ReadAssembly(@"C:\Users\Derp\Desktop\CecilTestApp.exe");
foreach (ModuleDefinition def in ass.Modules)
{
foreach (TypeDefinition d in def.Types)
{
foreach (MethodDefinition m in d.Methods)
{
if (!m.IsConstructor && !m.IsRuntimeSpecialName && m.Name != "Main")
{
string oldNm = m.Name;
string newNm = GetNewName();
m.Name = newNm;
Console.WriteLine("Rename Method '{0}'->'{1}'", oldNm, newNm);
}
}
foreach (FieldDefinition f in d.Fields)
{
string oldNm = f.Name;
string newNm = GetNewName();
f.Name = newNm;
Console.WriteLine("Rename Field '{0}'->'{1}'", oldNm, newNm);
}
}
}
ass.Write(@"C:\Users\Derp\Desktop\CecilTestApp-Obf.exe");
Console.ReadKey();
}
GetNewName()
只返回尚未用作方法/字段名称的随机string
。
以下是我通过dotPeek获得的行为的屏幕截图:
答案 0 :(得分:1)
事实证明,当我对同一程序的未经模糊处理的版本进行反编译时,DotPeek以某种方式缓存结果。在另一台机器上进行反编译非常合适。
我认为它是通过程序集名称进行缓存,因为在混淆版本中更改程序集名称也会使反编译器显示模糊代码。