C#代码反编译 得到项目可运行源码
C#代码反编译 得到项目可运行源码
摘自:http://www.cnblogs.com/know/archive/2011/03/15/1985026.html
谈到"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文件的前缀
——即修改文件名,如果是一个个文件去修改,窗体比较多的话,是一件非常重复而无聊的事,于是 就上网找
"批量修改文件名"的工具,下载了一两个感觉都不好用,找不到,只能自己搞了,再说这东西简单,说白了就是
遍历文件夹中文件并'重命名'(代码就不贴出了,文章后 附有 自己写的 "批量修改文件名"工具)。
到此,程序就可以真正跑起来了。别看我写出来,似乎'破解'就
是一会儿的事,但我做的时候,却几经折腾 好几次都感觉"算了,又卡住了...",有些或大或小问题,在这里因为时间的原因
及有些步骤一时半会也想不起来了,但主要的方法应该都没有落下,如果有不明白的朋友,可以留言交流,再做解答;也希望在'破解'方法有经验的,能多提些意
见,分享下你的‘破解’经验!
后附:
批量修改文件名工具.rar
(Reflector插件)Reflector.FileDisassembler.rar
C#代码反编译 得到项目可运行源码的更多相关文章
- 解决AndroidKiller APK 反编译失败,无法继续下一步源码反编译!
报错背景 今天使用AndroidKiller V1.3.1,反编译一个APK,遇到如下报错: 当前 Apktool 使用版本:Android Killer Default APKTOOL 正在反编译 ...
- Android逆向之旅---反编译利器Apktool和Jadx源码分析以及错误纠正
Android逆向之旅---反编译利器Apktool和Jadx源码分析以及错误纠正 http://blog.csdn.net/jiangwei0910410003/article/details/51 ...
- 使用Eclipse中的反编译插件jadClipse查看Class源码
功安装完插件jadClipse 之后便可以查看源码class文件了 但是对于自己代码的class文件,直接复制过来却看不到,需要以下操作. 将此文件以及文件夹直接拷贝到Eclipse中发现 右击项目- ...
- C#以管理员权限运行源码,C#软件获取管理员权限,c#获取管理员权限
C#以管理员权限运行源码,C#软件获取管理员权限,c#获取管理员权限 发布时间:2014-10-19 21:40内容来源:未知 点击: 次 windows 7和vista提高的系统的安全性,同时需要明 ...
- MapReduce的ReduceTask任务的运行源码级分析
MapReduce的MapTask任务的运行源码级分析 这篇文章好不容易恢复了...谢天谢地...这篇文章讲了MapTask的执行流程.咱们这一节讲解ReduceTask的执行流程.ReduceTas ...
- 基于案例贯通 Spark Streaming 流计算框架的运行源码
本期内容 : Spark Streaming+Spark SQL案例展示 基于案例贯穿Spark Streaming的运行源码 一. 案例代码阐述 : 在线动态计算电商中不同类别中最热门的商品排名,例 ...
- Dream_Spark-----Spark 定制版:005~贯通Spark Streaming流计算框架的运行源码
Spark 定制版:005~贯通Spark Streaming流计算框架的运行源码 本讲内容: a. 在线动态计算分类最热门商品案例回顾与演示 b. 基于案例贯通Spark Streaming的运 ...
- 贯通Spark Streaming流计算框架的运行源码
本章节内容: 一.在线动态计算分类最热门商品案例回顾 二.基于案例贯通Spark Streaming的运行源码 先看代码(源码场景:用户.用户的商品.商品的点击量排名,按商品.其点击量排名前三): p ...
- 编译Docker<v1.9.0>源码和初级安装
本文主要介绍了如何在POWER CPU处理器上编译和安装Docker服务.很多时候,我们都需要自己编译Docker源码,有的时候是由于自己的处理器没有对应的安装包,有的时候是由于当前的新版本还有发布, ...
随机推荐
- [转]Raspberry Pi做成路由器
http://raspjason.blog.51cto.com/8565009/1426561/ 曾经看到很多文章把Raspberry Pi制作成无线AP,但是我今天要做的是把Raspberry Pi ...
- Two classes have the same XML type name 排错【转】
今天遇到一个问题,webservice发布的时候报下面的错误: <strong>Caused by: com.sun.xml.bind.v2.runtime.IllegalAnnotati ...
- 查看android app 线程信息的命令
参考:https://my.oschina.net/zhiweiofli/blog/138454 ps | grep 'joyodream' 找到 app 的pid: joyodream为包名的一部分 ...
- struts2:异常处理
Struts2框架提供了自己的异常处理机制,只需要在struts.xml文件中配置异常处理即可,而不需要在Action方法中来捕捉异常. 传统方法 public String execute() th ...
- 如何做好IT运营.
定义IT管理的重点在于业务策略与 IT 部门提供的服务之间的一致性.IT 管理可建立必要的管理机制来确保可预测的 IT 服务交付,从而确保业务流程和 IT 流程之间的联系.IT 管理传统上属于CIO. ...
- [转]阎宏博士的JAVA与模式
阎宏,1964年出生于天津市.1987年毕业于中国科技大学近代物理系,1990年于中科院理论物理所获硕士学位,1992年获博士学位,翌年赴日本京都大学进行博士后研究工作. 作者曾于美国花旗银行(Cit ...
- Sass for循环中编译%时报错解决方案
sass功能强大,特别是支持for循环,节省大量开发时间,但是在开发时遇到一个问题,直接使用%时没有问题,当有变量时再加% 单位在编译时报错: 这样没有问题: @for $width from 0 t ...
- Fiddler捕捉ASP.NET WebSite调用WebService、WCF服务
Fiddler默认会注册一个代理,有时会发现WebSite调用的WebService或者WCF服务无法被捕捉到.其实是由于运行的站点关联的应用程序池使用的账号和我们当前登陆操作系统的用户不同,自然它们 ...
- mybatis配置文件(其中,注意节点先后顺序)
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC & ...
- `cocos2dx非完整` 开始自己的FW模块
上一篇的文章中说到了一些个人习惯的东西以及一些简单的项目配置,这一篇文章我们来进一步完善一些东西.首先,打开编译以后的客户端执行,会看到一大堆的fileutils加载luac文件的提示,在终端显示一大 ...