分享

用Reflector反编译.NET程序

 看见就非常 2014-10-01

用Reflector反编译.NET程序

 

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

 

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

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

Reflector也是可以区分.NET还是C原生程序,如果是非.NET程序则会显示Not a .NET module.
用Reflector反编译.NET程序

 

先拷贝一个WcfSvcHost.exe出来,别把源文件给玩坏了.用reflector打开这个文件,找到了导出为源代码的功能,哈哈!
用Reflector反编译.NET程序


用Reflector反编译.NET程序

 

得到了整个工程文件
用Reflector反编译.NET程序


我浏览了一下reflector反编译的结果,发现双击WcfSvcHost.exe时的Usage用法提示信息是存在于资源文件中,玩把破解吧--我要改掉它!
用Reflector反编译.NET程序

 

用VS打开该资源文件,搜索Usage字串
用Reflector反编译.NET程序

 

选中Usage字串,按Insert键,直接编辑这个二进制文件,把Usage替换成K.O.by.Jinifly--改掉它!
用Reflector反编译.NET程序

 

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

用Reflector反编译.NET程序

 

 

根据错误提示,很明显Private EventHandler ApplicationExit与internal event EventHandler ApplicationExit重复定义了ApplicationExit, 由于后面写了实现部分,我把Private的申明注释掉,pass!
用Reflector反编译.NET程序

 

又出现了重复XX特性的提示,这又是在哪个文件中重复定义了相同的字段,我把整个这段出错的代码注释掉,pass!
用Reflector反编译.NET程序

 

接下来又提示签名失败,这想必是当初生成WcfSvcHost.exe时微软开发组做的签名
用Reflector反编译.NET程序

 

点击程序属性,用自己新建的签名替换之
用Reflector反编译.NET程序


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

 

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

 

然后去掉程序的签名,再rebuild,又过了.(尽管有一个延迟签名的警告)
用Reflector反编译.NET程序

 

再Run一下,OK了,哈哈!

用Reflector反编译.NET程序

 

任务管理器显示它是个32位程序,还是要完美一下吧
用Reflector反编译.NET程序

 

找到程序属性的目标平台,改为x64,rebuild, OK!
用Reflector反编译.NET程序

64位
用Reflector反编译.NET程序


题外话:

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

我到Reflector站点上下了个最新试用版的ver 7.5.4.20(现在开始收费了),见下面的Applauncher.cs对ApplicationExit事件,只有定义,没有实现部分
用Reflector反编译.NET程序

 

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


稍微分析一下,可以看到用法提示是通过Usage属性中的get方法调用的,而get方法又调用了ResourceManager.GetString方法,点击ResourceManager属性以获得其get定义
用Reflector反编译.NET程序

可以发现ResourceManager最终负责对StringResources.resources资源文件的处理
用Reflector反编译.NET程序  

最后,就能看到Usage字段在该资源文件中了.
用Reflector反编译.NET程序

 

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

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

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多