多读书多实践,勤思考善领悟

去ILDasm SuppressIldasmAttribute限制

本文于1951天之前发表,文中内容可能已经过时。

用ILDasm打开的时候,出现了”受保护模块—无法进行反汇编”的错误提示

看到这个错误提示后,便尝试用ILSpy打开,结果一切正常。网上搜了下,原来是SuppressIldasmAttribute这个属性弄的。

关于SuppressIldasmAttribute这个属性,它可以在程序集中声明,声明这个属性后,ILDasm便不对这个程序集进行反汇编,从而起到一定程度的保护作用。其使用方法可以参看使用SuppressIldasmAttribute防止MSIL反組譯工具對組件進行反組譯这篇文章。

不过,这个SuppressIldasmAttribute是个君子协议,就算加上这个声明,编译器也没有什么额外的保护操作,只是ILDasm不对它反汇编罢了。像ILSpy、Reflector等第三方反编译工具都是无视这个属性的,基本上是一种掩耳盗铃罢了。

那么,如果我们要用ILDasm越过SuppressIldasmAttribute的限制反汇编程序该怎么办呢?一种方法是写个程序修改该程序集的的IL码,去掉SuppressIldasmAttribute属性,代码如下(需要Mono.Cecil库支持):

​ public static void RemoveSuppressIldasmAttribute(string input, string output)
​ {
​ AssemblyDefinition assembly = AssemblyDefinition.ReadAssembly(input);
​ foreach (CustomAttribute attribute in assembly.CustomAttributes)
​ {
​ if (attribute.Constructor.DeclaringType.Name == “SuppressIldasmAttribute”)
​ {
​ assembly.CustomAttributes.Remove(attribute);
​ break;
​ }
​ }

​ assembly.Name.PublicKey = null;
​ assembly.Name.PublicKeyToken = null;
​ assembly.Write(output);
​ }

用这个函数把程序集中的SuppressIldasmAttribute属性去掉后,就可以用ILDasm打开了。

这个方法略显麻烦,这里给一个简单的方法。

  1. 将ILDasm.exe改个扩展名(记得备份原文件),然后用VisualStudio打开。

PS:之所以要改扩展名,是因为我要以十六进制的方式编辑,如果不改扩展名的话,VS把它当个exe打开,只能修改资源文件,如果用Ultraedit或WinHex之类的程序以十六进制方式编辑则可以不用改扩展名。

  1. 查找SuppressIldasmAttribute字符串

img

  1. 把它修改成一个其他的字符串

img

  1. 保存修改后还原扩展名为.exe,这样你的新ILDasm.exe就无视SuppressIldasmAttribute了。