博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
去掉ILDasm的SuppressIldasmAttribute限制
阅读量:6218 次
发布时间:2019-06-21

本文共 1511 字,大约阅读时间需要 5 分钟。

原文:

今天本打算汉化一个.Net程序的,当用ILDasm打开的时候,出现了"受保护模块—无法进行反汇编"的错误提示

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

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

不过,这个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打开了。

这个方法略显麻烦,在前面的文章中给出了另一种解决方法:直接去掉ILDasm中对SuppressIldasmAttribute的限制,这样就可以打开有SuppressIldasmAttribute声明的程序集了。原文中已经给了一个修改后的ILDasm.exe的下载,不过由于该文章发表时间较早,给出的ILDasm.exe的版本也比较老,要使用最新的ILDasm.exe必须我们自己修改。原文中是通过反汇编的方式修改的,比较麻烦,这里给一个简单的方法。

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

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

2. 查找SuppressIldasmAttribute字符串

3. 把它修改成一个其他的字符串(似乎不能乱改,包括长度,所以我随便替换某个字符即可)

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

 

转载地址:http://qelja.baihongyu.com/

你可能感兴趣的文章
AngularJS指令实践
查看>>
Python工具分析风险数据
查看>>
Git自由之章 - 关于SSH 公钥
查看>>
关于classpath中有多个同名类或一个接口有多个实现类Spring启动失败总结
查看>>
数组reduce方法的高级技巧
查看>>
pt-online-schema-change使用说明、限制与比较
查看>>
一些小技巧让JS代码更优雅
查看>>
jquery 添加和删除html元素
查看>>
Java 8怎么了之二:函数和原语
查看>>
dingo/api 使用
查看>>
PHP字符串函数之 strstr stristr strchr strrchr
查看>>
mac安装docker
查看>>
Objective-C runtime 拾遗 (二)——Log message send
查看>>
【temp】Graphx Visualization
查看>>
[LeetCode]Maximal Rectangle
查看>>
JavaScript-imooc
查看>>
[LintCode] Find the Missing Number [三种方法]
查看>>
elasticsearch搭建
查看>>
使用python解释设计模式[译]
查看>>
对立即数进行位移引发的小问题
查看>>