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

一、反编译工具的选择

提到.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。

一次.NET项目反编译的实战经验(WinForm)的更多相关文章

  1. NET项目反编译+VS解决方案整理流程

    net项目反编译 工具:De4Dot + IL SPY和Reflector结合使用 项目:vs10+创建解决方案,每个类库尽量按照dll名来命名,方便整合,新建web项目先把aspx等文件拷贝进去,注 ...

  2. java项目反编译获得源码

    经常能找到一些 过时的 项目源码,但是还是有研究价值的.但是肯定是不会给你源码的. 下面介绍怎么反编译: 1.在项目中找到classes这个文件夹,这个就是编译过的文件. 2.下载反编译工具JD-GU ...

  3. Eclipse 安装反编译插件jadclipse(经验总结)

    方法/步骤   先下载jadClipse的jar包 链接:sourceforge.net/projects/jadclipse/   然后,将net.sf.jadclipse_3.3.0.jar拷贝到 ...

  4. 将JAR包反编译,修改后重新打包(转)

     将JAR包反编译,修改后重新打包(转)   在学习和开发JAVA项目中,我们经常会用到第三方提供的一些jar.使用这些第三方工具包,可以提高我们开发的效率,缩短开发的时间.有的第三方工具,提供具体的 ...

  5. Jar包进行反编译,修改后重新打包

    在学习和开发JAVA项目中,我们经常会用到第三方提供的一些jar.使用这些第三方工具包,可以提高我们开发的效率,缩短开发的时间.有的第三方工具,提供具体的使用说明和源代码,有时有的却不提供源代码,使用 ...

  6. eclipse下的反编译

    Eclipse 安装反编译插件jadclipse(经验总结) 根据网上搜集的材料以及亲身安装测试,总结经验如下,希望能够帮助有需要的朋友们,本总结有助于朋友们少走弯路哦!jadclipse可以帮助查看 ...

  7. Reflector反编译WinForm程序重建项目资源和本地资源

    工具:vs2012..NET Reflector8.1.0.35 要解决的问题: 通过Reflector反编译生成的代码可以编译通过并显示窗体的本地资源和项目资源图片 一.测试项目 两个图片分别放在项 ...

  8. C#代码反编译 得到项目可运行源码

    C#代码反编译 得到项目可运行源码 摘自:http://www.cnblogs.com/know/archive/2011/03/15/1985026.html 谈到"C#代码反编译&quo ...

  9. .Net反编译实战

    原文:.Net反编译实战 当你面对一个已经部署好的网站,功能,性能都非常不给力的时候,你会怎么办? 当你尝试去了解这个网站业务逻辑,代码逻辑和数据库逻辑时却发现根本没有任何资料时你会怎么办? 当你准备 ...

随机推荐

  1. 确认(confirm 消息对话框)语法:confirm(str); 消息对话框通常用于允许用户做选择的动作,如:“你对吗?”等。弹出对话框(包括一个确定按钮和一个取消按钮)

    确认(confirm 消息对话框) confirm 消息对话框通常用于允许用户做选择的动作,如:"你对吗?"等.弹出对话框(包括一个确定按钮和一个取消按钮). 语法: confir ...

  2. 自定义Jquery:ajax,get,post方法

    var myAjax = { request: function(url, type, data, callback) { $.ajax(url, { type: type, data: data, ...

  3. Element-ui之修改样式

    修改样式的方法 官网上面介绍了几种方法: 当然还有其他的方法,比如: 直接在标签上面采用行内式: 在组件中的style里面添加样式: 引入.scss文件(注意:如果是公用样式最好在index.scss ...

  4. 第十一章 Odoo 12开发之看板视图和用户端 QWeb

    QWeb 是 Odoo 使用的模板引擎,它基于 XML 来生成 HTML 片断和页面.通过 QWeb可生成内容丰富的看板(Kankan)视图.报表和 CMS 网页.本文中我们将学习QWeb 语法以及如 ...

  5. iOS之CAScrollLayer属性简介和使用

    1.CAScrollLayer的简介 CAScrollLayer用于显示一个滑动图层的一部分,可以确定滑动方向和可视区域面积,限制不滑出区域外!相关属性如下:其中 /* Scroll the cont ...

  6. 转:五种I/O模型和select函数简介

    源地址:http://blog.csdn.net/jnu_simba/article/details/9070955 一.五种I/O模型 1.阻塞I/O 我们在前面所说的I/O模型都是阻塞I/O,即调 ...

  7. 工业派-配置Intel神经计算棒二代(NCS2)

    最近两天在工业派ubuntu16.04上配置了Intel神经计算棒二代——Intel Neural Compute Stick,配置过程之艰辛我都不想说了,实在是太折磨人.不过历尽千辛万苦,总算让计算 ...

  8. js 引入Vue.js实现vue效果

    拆分组件为单个js见:https://www.jianshu.com/p/2f0335818ceb 效果 html <!DOCTYPE html> <html> <hea ...

  9. 如何使用Pig集成分词器来统计新闻词频?

    散仙在上篇文章中,介绍过如何使用Pig来进行词频统计,整个流程呢,也是非常简单,只有短短5行代码搞定,这是由于Pig的内置函数TOKENIZE这个UDF封装了单词分割的核心流程,当然,我们的需求是各种 ...

  10. 2019-2-26-SublimeText-快速打开当前文件的文件夹

    title author date CreateTime categories SublimeText 快速打开当前文件的文件夹 lindexi 2019-02-26 18:45:29 +0800 2 ...