C#代码反编译 得到项目可运行源码 经验分享

作者: 2011/3/15 16:49:36

今天在网上看到了编辑了好几次,老是出错,作者所做的反编译,并不是'破解',我们这篇文章要跟大家分享的是:用Reflector将C#的开发的软件[项目](此文中所说的是winForm项目,对于.net项目可以借鉴或参考)的项目代码还原——反编译得到可运行项目源码。其使用的前提或情况是:公司原来请人开发的'配餐软件(幼儿园版)',现有客户咨询想买,并且软件中存在一些问题需改,——不是本人开发的,该软件也无源码,想修改只能想办法得到软件的源码。详细的'破解'方法记录在下,方便自己以后查看!(ps: '破解'的方法,自己之前就摸索过。但困于反编译之后的error比较多,没有耐心,有的问题感觉比较离奇,试了几次不行就放弃了 ——这就间接的说明:真正的黑客,应该都是比较有耐心的,呵呵..., 但做软件开发,又何尝不需要这样?!)

   a.使用到的工具:Reflector,具体的说是:Reflector插件File disassembler(具体是什么和how to use,直接上网查)。

   b. 打开Reflector,选择要'破解'的软件(.exe)主程序,再选择并点击 如图: #FormatImgID_0#, 在右侧出现的 程序集(输出)类型选择界面 选择类型'windows Appliction' (因为是winForm应用程序,如果是选择的其它 如'class ...'类库,则需要在之后的步骤中,改变项目属性中的 输出类型,不建议这样操作),如图:#FormatImgID_1#

   点击 生成 即可 得到此主程序集的源码,其它的相关程序集再如此操作即可! ——不要以为大功告成,这只是第一步,麻烦的在后面!

   c.将生成的源码 在Vs中打开(项目), 先试着运行下,(一般)会报错,排除'xxx程序集不存在'这类的错误,我所遇到的如下:

  

using System;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

[CompilerGenerated]
internal class <PrivateImplementationDetails>{1FF4F699-35E0-4117-BDBC-9E44A1B0F9F5}
{
   
internal static Dictionary<string, int> $$method0x600012e-1;
   
internal static Dictionary<string, int> $$method0x6000137-1;
   
internal static Dictionary<string, int> $$method0x6000137-2;
   
internal static Dictionary<string, int> $$method0x600014a-1;
   
internal static Dictionary<string, int> $$method0x6000169-1;
   
internal static Dictionary<string, int> $$method0x60001b6-1;
   
internal static __StaticArrayInitTypeSize=20 $$method0x6000213-1; // data size: 20 bytes
    internal static __StaticArrayInitTypeSize=20 $$method0x6000213-2; // data size: 20 bytes
    internal static __StaticArrayInitTypeSize=20 $$method0x6000213-3; // data size: 20 bytes
    internal static __StaticArrayInitTypeSize=20 $$method0x6000213-4; // data size: 20 bytes

    [StructLayout(LayoutKind.Explicit, Size
=20, Pack=1)]
   
private struct __StaticArrayInitTypeSize=20
    {
    }
}

   源码文件中会出现一个 _PrivateImplementationDetails_{1FF4F699-35E0-4117-BDBC-9E44A1B0F9F5}.cs 文件名很长 内容如上的 乱码类,对此解决办法时:注释此类 或直接删除。【程序相关的文件,如图片、数据库等要记得放到项目关联位置,一般在bin/debug/文件夹下】

   d. 添加相关程序集的引用,设置启动对象。到这儿,差不多程序就可以 跑起来了,但是还没有完 ——因为 反编译后的代码,文件夹的位置和界面与资源引用之间的关联,基本上都乱了.所以现在要解决的关键问题是:恢复文件间的关联和引用(其它的问题,通过调试就差不多可以解决)。如图:

   #FormatImgID_2#窗体的.cs和.resx(资源)文件不在同一个文件夹中,对应窗体的.resx文件都加上了项目或解决方案名前缀(zhiyiSystem.) ——This is point! 这就是我们要解决问题的关键:恢复窗体的.cs和.resx文件间的关联,操作大致有以下两步:1.将窗体的.cs和.resx文件放在同一个文件中——即同一目录。2.去掉窗体的.resx文件的前缀 ——即修改文件名,如果是一个个文件去修改,窗体比较多的话,是一件非常重复而无聊的事,于是 就上网找 "批量修改文件名"的工具,下载了一两个感觉都不好用,找不到,只能自己搞了,再说这东西简单,说白了就是 遍历文件夹中文件并'重命名'(代码就不贴出了,文章后 附有 自己写的 "批量修改文件名"工具)。

   到此,程序就可以真正跑起来了。别看我写出来,似乎'破解'就是一会儿的事,但我做的时候,却几经折腾 好几次都感觉"算了,又卡住了...",有些或大或小问题,在这里因为时间的原因 及有些步骤一时半会也想不起来了,但主要的方法应该都没有落下,如果有不明白的朋友,可以留言交流,再做解答;也希望在'破解'方法有经验的,能多提些意见,分享下你的‘破解’经验!

特别推荐

玩家留言 跟帖评论
查看更多评论