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源码,有的时候是由于自己的处理器没有对应的安装包,有的时候是由于当前的新版本还有发布, ...
随机推荐
- windows7实现打印机共享的方法
windows7实现打印机共享的方法和windows xp差不多,就是在下图当中的设置: 具体方法请参照:http://jingyan.baidu.com/article/6d704a13e00a21 ...
- 基于Bootstrap的后台通用模板
人总是比较刁的,世界的时尚趋势不断变化,对系统UI的审美也在不断疲劳中前进,之前觉得好好的UI,过了半年觉得平平无奇,不想再碰,需要寻求新的兴奋点. 下面这套UI就是半年前的(今日:2015-12), ...
- Java Arrays 排序
Java SDK中的排序分为两种情况: .对基础类型数组的排序,使用DualPivotQuicksort类 a.如果是对char.short数组的排序,因为byte.char.short分别为8bit ...
- C# Use Pop3Client to read gmail
host = "pop.gmail.com" user = "xxxxx@gmail.com" password = "xxxx" port ...
- studio 快捷键
一,基础快捷键 1.1 Ctrl+N,Navigate | Class,快速打开某个类 1.2 Ctrl+Shift+N, Navigate | File, 快速打开某个文件 1.3 Ctrl+S ...
- 微信、qq时间格式模板
产品近来蛋疼,时间格式从做完到现在改了四遍了 ,最新的要求如下: * 2分钟内 无显示 * 2分钟-24小时 HH:mm * 昨天 昨天 HH:mm * 前天 前天 HH:mm * 今年 MM:DD ...
- sencha touch api 使用指南
本文主要讲解如何使用sencha touch的api以及如何查看api中官方示例源码 前期准备 1.sdk 下载地址:http://www.sencha.com/products/touch/down ...
- eclipse从数据库逆向生成Hibernate实体类
做项目必然要先进行数据库表设计,然后根据数据库设计建立实体类(VO),这是理所当然的,但是到公司里做项目后,让我认识到,没有说既进行完数据库设计后还要再“自己”建立一变VO.意思是,在项目设计时,要么 ...
- zk框架销毁Page上的Component
销毁Page上的Component ZK的组件之间是树状结构的,每一组件都只有一个根. 从页面上销毁一个组件可以通过下面两种方式来实现: 1. 组件不是根组件时:Component.setParent ...
- 利用Cydia Substrate进行Android HOOK(二)
在前面关于Substrate的介绍中我们已经讲了用Substrate hook java代码,现在我们讲下怎么用它hook native代码.hook native代码我们需要编写Substrate ...