加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

用Reflector反编译.NET程序

(2012-06-03 10:29:28)
标签:

it

分类: 学习

http://s12/middle/4ca83f83gc187e1b7017b&690

 

接上篇,刚开始我以为以前开发组的郑Sir是用ildasm来反编译并修改代码的,但是当我读了ildasm反编译出来的结果后发现,ildasm得到的是类似于debug的汇编代码,郑Sir应该有别的方法,因为他每次改.exe文件都很快,会立即生成一个新的给我.
http://s5/middle/4ca83f83gc187e1f318f4&690

 

我qq问了郑Sir(一年没联系啊!),他告诉我是用Reflector来直接得到源代码的,哈哈!

我让他发了个7.0版本的给我,开始玩起来....

Reflector也是可以区分.NET还是C原生程序,如果是非.NET程序则会显示Not a .NET module.
http://s11/middle/4ca83f83gc187e22e4c8a&690

 

先拷贝一个WcfSvcHost.exe出来,别把源文件给玩坏了.用reflector打开这个文件,找到了导出为源代码的功能,哈哈!
http://s12/middle/4ca83f83gc187e2326fab&690


http://s8/middle/4ca83f83gc187e23183a7&690

 

得到了整个工程文件
http://s3/middle/4ca83f83gc187e24f8c42&690


我浏览了一下reflector反编译的结果,发现双击WcfSvcHost.exe时的Usage用法提示信息是存在于资源文件中,玩把破解吧--我要改掉它!
http://s11/middle/4ca83f83gc187e319ea0a&690

 

用VS打开该资源文件,搜索Usage字串
http://s13/middle/4ca83f83gc187e2e7ec5c&690

 

选中Usage字串,按Insert键,直接编辑这个二进制文件,把Usage替换成K.O.by.Jinifly--改掉它!
http://s8/middle/4ca83f83g79c0c9f9e337&690

 

Rebuilt工程,如我所料,开始出现一些错误,Reflector也不是100%能还原出源程序的.

http://s14/middle/4ca83f83gc187e2b617bd&690

 

 

根据错误提示,很明显Private EventHandler ApplicationExit与internal event EventHandler ApplicationExit重复定义了ApplicationExit, 由于后面写了实现部分,我把Private的申明注释掉,pass!
http://s15/middle/4ca83f83g79c0c9e586fe&690

 

又出现了重复XX特性的提示,这又是在哪个文件中重复定义了相同的字段,我把整个这段出错的代码注释掉,pass!
http://s6/middle/4ca83f83gc187e39166c5&690

 

接下来又提示签名失败,这想必是当初生成WcfSvcHost.exe时微软开发组做的签名
http://s8/middle/4ca83f83gc187e38b46f7&690

 

点击程序属性,用自己新建的签名替换之
http://s9/middle/4ca83f83gc187e390ea58&690


会提示"选项keyfile重写源或添加的模块中给出的特性"System.Reflection.AssemblykeyFileAttribute",但只是警告,编译顺利通过.然后我运行了一下编译生成的WcfSvcHost.exe,结果发现任务管理器里可以正常看到进程正在运行,但是没有弹出它的用法提示信息.是不是自签名会有问题?

 

签名字段应该与发行公司,版本等属于程序本身的信息,找了一下,它是AssemblyInfo.cs定义的,根据前面错误提示的"f:\dd\tools...",我试着把对应的那一行注释掉.
http://s15/middle/4ca83f83gc187e415fa1e&690

 

然后去掉程序的签名,再rebuild,又过了.(尽管有一个延迟签名的警告)
http://s8/middle/4ca83f83gc187e4378cb7&690

 

再Run一下,OK了,哈哈!

http://s6/middle/4ca83f83gc187e44468f5&690

 

任务管理器显示它是个32位程序,还是要完美一下吧
http://s12/middle/4ca83f83gc187e41495eb&690

 

找到程序属性的目标平台,改为x64,rebuild, OK!
http://s13/middle/4ca83f83gc187e429f4fc&690

64位
http://s1/middle/4ca83f83gc187e436f7d0&690


题外话:

后来发现不同版本的Reflector,反编译出来的源码效率是不一样的.

我到Reflector站点上下了个最新试用版的ver 7.5.4.20(现在开始收费了),见下面的Applauncher.cs对ApplicationExit事件,只有定义,没有实现部分
http://s5/middle/4ca83f83gc187e4976b44&690

 

而用郑Sir给我的老版本ver 7.0,不仅出现了重复的定义,还有实现部分,这个实现部分会导致"事件XXX只出现在+=或-="这个错误,实现部分从代码语法上看(从38行开始)是没有错误的,试着改了几次都过不去,后来偶然发现最新版反编译出的源码是OK的.
http://s4/middle/4ca83f83gc187e50e6fb3&690


稍微分析一下,可以看到用法提示是通过Usage属性中的get方法调用的,而get方法又调用了ResourceManager.GetString方法,点击ResourceManager属性以获得其get定义
http://s5/middle/4ca83f83gc187e4f45274&690

可以发现ResourceManager最终负责对StringResources.resources资源文件的处理
http://s2/middle/4ca83f83gc187e5273ef1&690  

最后,就能看到Usage字段在该资源文件中了.
http://s10/middle/4ca83f83gc187e5309899&690

 

百度百科对Reflector有清晰的说明:

http://baike.baidu.com/view/3803210.htm

 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有