Reflector反编译.NET文件后修复
谈到"C#代码反编译",大家可能都会想到 Reflector代码反编译工具,对其应该也不会太陌生;做C#开发,它算得上是一个不可或缺的实用工具。通过它我们可以很方便的查看一个程序集的源代码(这是其最基本的使用,也是大家常用的),还可以方便破解软件...,而我这篇文章要跟大家分享的是:用Reflector将C#的开发的软件[项目](此文中所说的是winForm项目,对于.net项目可以借鉴或参考)的项目代码还原——反编译得到可运行项目源码。 我所做的反编译,并不是'破解',其使用的前提或情况是:公司原来请人开发的'配餐软件(幼儿园版)',现有客户咨询想买,并且软件中存在一些问题需改,——不是本人开发的,该软件也无源码,想修改只能想办法得到软件的源码。具体的'破解'方法记录在下,方便自己以后查看!(ps: '破解'的方法,自己之前就摸索过。但困于反编译之后的error比较多,没有耐心,有的问题感觉比较离奇,试了几次不行就放弃了 ——这就间接的说明:真正的黑客,应该都是比较有耐心的,呵呵..., 但做软件开发,又何尝不需要这样?!)
a.使用到的工具:Reflector,具体的说是:Reflector插件File disassembler(具体是什么和how to use,直接上网查)。
b. 打开Reflector,选择要'破解'的软件(.exe)主程序,再选择并点击 如图: , 在右侧出现的 程序集(输出)类型选择界面 选择类型'windows Appliction' (因为是winForm应用程序,如果是选择的其它 如'class ...'类库,则需要在之后的步骤中,改变项目属性中的 输出类型,不建议这样操作),如图:
点击 生成 即可 得到此主程序集的源码,其它的相关程序集再如此操作即可! ——不要以为大功告成,这只是第一步,麻烦的在后面!
c.将生成的源码 在Vs中打开(项目), 先试着运行下,(一般)会报错,排除'xxx程序集不存在'这类的错误,我所遇到的如下:
using System; using System.Collections.Generic; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; [CompilerGenerated] internalclass<PrivateImplementationDetails>{1FF4F699-35E0-4117-BDBC-9E44A1B0F9F5} { internalstatic Dictionary<string, int> $$method0x600012e-1; internalstatic Dictionary<string, int> $$method0x6000137-1; internalstatic Dictionary<string, int> $$method0x6000137-2; internalstatic Dictionary<string, int> $$method0x600014a-1; internalstatic Dictionary<string, int> $$method0x6000169-1; internalstatic Dictionary<string, int> $$method0x60001b6-1; internalstatic __StaticArrayInitTypeSize=20 $$method0x6000213-1; // data size: 20 bytes internalstatic __StaticArrayInitTypeSize=20 $$method0x6000213-2; // data size: 20 bytes internalstatic __StaticArrayInitTypeSize=20 $$method0x6000213-3; // data size: 20 bytes internalstatic __StaticArrayInitTypeSize=20 $$method0x6000213-4; // data size: 20 bytes [StructLayout(LayoutKind.Explicit, Size=20, Pack=1)] privatestruct __StaticArrayInitTypeSize=20 { } }
源码文件中会出现一个 _PrivateImplementationDetails_{1FF4F699-35E0-4117-BDBC-9E44A1B0F9F5}.cs 文件名很长 内容如上的 乱码类,对此解决办法时:注释此类 或直接删除。【程序相关的文件,如图片、数据库等要记得放到项目关联位置,一般在bin/debug/文件夹下】
d. 添加相关程序集的引用,设置启动对象。到这儿,差不多程序就可以 跑起来了,但是还没有完 ——因为 反编译后的代码,文件夹的位置和界面与资源引用之间的关联,基本上都乱了.所以现在要解决的关键问题是:恢复文件间的关联和引用(其它的问题,通过调试就差不多可以解决)。如图:
窗体的.cs和.resx(资源)文件不在同一个文件夹中,对应窗体的.resx文件都加上了项目或解决方案名前缀(zhiyiSystem.) ——This is point! 这就是我们要解决问题的关键:恢复窗体的.cs和.resx文件间的关联,操作大致有以下两步:1.将窗体的.cs和.resx文件放在同一个文件中——即同一目录。2.去掉窗体的.resx文件的前缀 ——即修改文件名,如果是一个个文件去修改,窗体比较多的话,是一件非常重复而无聊的事,于是 就上网找 "批量修改文件名"的工具,下载了一两个感觉都不好用,找不到,只能自己搞了,再说这东西简单,说白了就是 遍历文件夹中文件并'重命名'
反编译后的工程文件用VS2010打开后,在打开窗体时会出现一系列错误提示:
第一种情况:
“设计器无法处理第 152 行的代码: base.AutoScaleMode = AutoScaleMode.Font; 方法“InitializeComponent”内的代码由设计器生成,不应手动修改。请移除任何更改,然后尝试重新打开设计器”。
解决方法就是:对所有System.Windows.Forms.命名空间里面的控件需要全命名空间的声明,例如里面上图的base.AutoScaleMode = AutoScaleMode.Font;就要改成base.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
第二种情况:
“变量“manager”未声明或从未赋值。 ”
解决方法就是:本方法只限于在InitializeComponent中包含System.Resources.ResourceManager调用的窗体
1.资源文件格式转换,将.resources(二进制)文件转成.resx文件(XML) 用C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin下 resgen.exe 格式: resgen *.resources *.resx(.resx文件最好与窗体.cs文件同名)
2.将InitializeComponent方法中的对象manager替换为resources(没错,只替换变量名^_^,全部都换掉哦,最好的办法就是更改manager的申明)
3.将资源文件.resx放到窗体文件.cs相同的文件夹下。
4.将所有窗体(.cs)从工程中排除,再添加(这样可以省去将.resx文件映射到.csproj的过程)。
到此,程序就可以真正跑起来了。别看我写出来,似乎'破解'就是一会儿的事,但我做的时候,却几经折腾 好几次都感觉"算了,又卡住了...",有些或大或小问题,在这里因为时间的原因 及有些步骤一时半会也想不起来了,但主要的方法应该都没有落下,如果有不明白的朋友,可以留言交流,再做解答;也希望在'破解'方法有经验的,能多提些意见,分享下你的‘破解’经验!