一次.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。
一次.NET项目反编译的实战经验(WinForm)的更多相关文章
- NET项目反编译+VS解决方案整理流程
net项目反编译 工具:De4Dot + IL SPY和Reflector结合使用 项目:vs10+创建解决方案,每个类库尽量按照dll名来命名,方便整合,新建web项目先把aspx等文件拷贝进去,注 ...
- java项目反编译获得源码
经常能找到一些 过时的 项目源码,但是还是有研究价值的.但是肯定是不会给你源码的. 下面介绍怎么反编译: 1.在项目中找到classes这个文件夹,这个就是编译过的文件. 2.下载反编译工具JD-GU ...
- Eclipse 安装反编译插件jadclipse(经验总结)
方法/步骤 先下载jadClipse的jar包 链接:sourceforge.net/projects/jadclipse/ 然后,将net.sf.jadclipse_3.3.0.jar拷贝到 ...
- 将JAR包反编译,修改后重新打包(转)
将JAR包反编译,修改后重新打包(转) 在学习和开发JAVA项目中,我们经常会用到第三方提供的一些jar.使用这些第三方工具包,可以提高我们开发的效率,缩短开发的时间.有的第三方工具,提供具体的 ...
- Jar包进行反编译,修改后重新打包
在学习和开发JAVA项目中,我们经常会用到第三方提供的一些jar.使用这些第三方工具包,可以提高我们开发的效率,缩短开发的时间.有的第三方工具,提供具体的使用说明和源代码,有时有的却不提供源代码,使用 ...
- eclipse下的反编译
Eclipse 安装反编译插件jadclipse(经验总结) 根据网上搜集的材料以及亲身安装测试,总结经验如下,希望能够帮助有需要的朋友们,本总结有助于朋友们少走弯路哦!jadclipse可以帮助查看 ...
- Reflector反编译WinForm程序重建项目资源和本地资源
工具:vs2012..NET Reflector8.1.0.35 要解决的问题: 通过Reflector反编译生成的代码可以编译通过并显示窗体的本地资源和项目资源图片 一.测试项目 两个图片分别放在项 ...
- C#代码反编译 得到项目可运行源码
C#代码反编译 得到项目可运行源码 摘自:http://www.cnblogs.com/know/archive/2011/03/15/1985026.html 谈到"C#代码反编译&quo ...
- .Net反编译实战
原文:.Net反编译实战 当你面对一个已经部署好的网站,功能,性能都非常不给力的时候,你会怎么办? 当你尝试去了解这个网站业务逻辑,代码逻辑和数据库逻辑时却发现根本没有任何资料时你会怎么办? 当你准备 ...
随机推荐
- linux常用软连接使用ln -s
[软连接]另外一种连接称之为符号连接(Symbolic Link),也叫软连接.软链接文件有类似于Windows的快捷方式.它实际上是一个特殊的文件.在符号连接中,文件实际上是一个文本文件,其中包含的 ...
- open 和 release
我们开始在真实的 scull 函数中使用它们. open 方法 open 方法提供给驱动来做任何的初始化来准备后续的操作. 在大部分驱动中, open 应当 进行下面的工作: 检查设备特定的错误( ...
- MYSQL随笔心得1
cmd链接数据库命令: 输入密码进入 显示全部的数据库: 退出服务器连接,还有/p quit 非关系型数据库:NOSQL,not only sql 不仅仅是SQL 代表:redis,mongodb
- laydate实现设置最小时间为当前时间
当前时间之前的日期不能选择,添加个min,主要代码如下: var now = new Date(); startTime= laydate.render({ elem: '#test1', type: ...
- UVA - 11327
UVA - 11327https://vjudge.net/problem/28358/origin求欧拉函数的前缀和,二分查找到那个位置,再从它开始暴力gcd找 #include <iostr ...
- 2016.10.5初中部上午NOIP普及组比赛总结
2016.10.5初中部上午NOIP普及组比赛总结 这次的题目出得挺有质量的.但我觉得我更应该努力了. 进度: 比赛:0+20+0+0=20 改题:AC+AC+AC+AC=AK kk的作业 这题我错得 ...
- poj 3682 King Arthur's Birthday Celebration (期望dp)
传送门 解题思路 第一问比较简单,设$f[i]$表示扔了$i$次正面向上的硬币的期望,那么有转移方程 : $f[i]=f[i]*(1-p)+f[i-1]*p+1$,意思就是$i$次正面向上可以 ...
- centos6 nginx安装好以后,添加拓展ssl
前言 安装nginx的时候,只是执行最简单的安装,--user=nobody --group=nobody --prefix=/usr/local/nginx_1.8.1,没有安装http_ssl_m ...
- 新增的Java MapReduce API
http://book.51cto.com/art/201106/269647.htm Hadoop的版本0.20.0包含有一个新的 Java MapReduce API,有时也称为"上下文 ...
- windwos API 第七篇 分离路径,组合路径 _splitpath _makepath
函数原型: //Break a path name into components. void _splitpath( const char *path, char *drive, char *dir ...