zoukankan      html  css  js  c++  java
  • 一次.NET项目反编译的实战经验(WinForm)

        最近由于业务需求,需要对一个老项目进行功能调整。但是项目的源代码已经找不到了。所以只能尝试对项目行进反编译。

    一、反编译工具的选择

        提到.NET的反编译,第一个想到的就是大名鼎鼎的Reflector。使用之后发现效果并不好,对不认识的类就各种乱码且还不支持多项目导出(可能是我不会用吧),再加上他还是需要付费的,暂时就只能战略性的放弃掉了。查找度娘,ILSpy和dnSpy这两款免费的软件进入了我的视线。先试用ILSpy,直接提示我要安装Framework 4.6.2,可是我就一个2.0的项目用这么高版本的反编译,我怕效果不好,就选择了暂时性的放弃。最后使用了dnSpy,反编译出来的效果比Reflector好。

    二、艰辛的编译过程

        不管使用哪一款反编译工具,反编译出来的代码想要完全没有错误是不太可能,这里就以dnSpy生成出来的代码为例,来说明一下常见问题及解决方案:

        1、缺失引用,最典型的就是缺少了System和System.Xml的引用,需要手动添加

        2、foreach循环内会再申明一个重名变量,手动删除即可

        3、base.AutoScaleMode=AutoScaleMode.Font报错,给AutoScaleMode加上全命名空间System.Windows.Forms.AutoScaleMode.Font

        4、变量“manager”未声明或从未赋值。ComponentResourceManager类实例化的变量名只能是resources

    三、修复资源文件

        其实在这一步之前,项目可以编译成功且不影响到正常使用,只是在开发的时候看不到任何资源数据。

        反编译过来的文件里面有很多.resource的文件,那些就是编译过后的资源文件,这些文件可以正常编译不影响正常使用,但是这些文件在开发时是没有用的,所以在VS里面看来就是一片白的,我们需要把.resource文件转换成我们熟悉的.resx文件。

        可以用VS自带的工具resgen.exe转(我没用,具体方法可以在网上查);还可以使用ConvertResource批量转换,不过这个工具转出来的文件要把里面metadata改成data才行;转出来.resx之后,把.resource文件删掉,将.resx包含进项目就好了。

    四、后记

        1、反编译出来的代码和本身的源代码在结构上可能存在差异,尤其是WebServices。

        2、现在的反编译工具还做不到一点错都没有,看着那几百上千个错误,很容易让人放弃,一定要摆平心态来处理错误。

        3、dnSpy是一个很强大的反编译工具,可以直接断点调试和修改并再编译。如果不放心反编译出来的代码,完全是可以在原程序上修改再编译。

        4、dnSpy可以放在服务器端,能在紧急的时候绕过源代码修复BUG。

  • 相关阅读:
    DoTween插件的使用
    Unity3D协程的简单使用
    排序和双指针,减小时间复杂度
    Unity3D自定义菜单组件
    滑动窗口思路分析
    Unity3D中的序列化特性和DLL特性
    求数组的交集,以及贪心算法的使用
    随笔开始啦
    实例26 循环体的过滤器
    实例25 终止循环体
  • 原文地址:https://www.cnblogs.com/TanSea/p/dnSpy-Decompile.html
Copyright © 2011-2022 走看看