为什么dotPeek在Mono.Cecil中重命名后仍然能够找出原始方法名称?

时间:2014-01-20 05:49:29

标签: c# .net obfuscation mono.cecil

我正在尝试使用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获得的行为的屏幕截图:

enter image description here

1 个答案:

答案 0 :(得分:1)

事实证明,当我对同一程序的未经模糊处理的版本进行反编译时,DotPeek以某种方式缓存结果。在另一台机器上进行反编译非常合适。

我认为它是通过程序集名称进行缓存,因为在混淆版本中更改程序集名称也会使反编译器显示模糊代码。