B.        将代码拷贝到你刚创立的公文中去,Reflector代码反编译

批量改动文件名工具.rar

(Reflector插件)Reflector.FileDisassembler.rar

 

二、        反编译前备选

A.        新建一个与要反编译程序一样名称的项目.

B.        新建一个与要反编译程序一样名称的窗体,删除窗体自带控件如MainMenu控件,删除*.Designer.cs文件.

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)主程序,再选拔并点击
如图: 图片 1, 在右手出现的
程序集(输出)类型选拔界面 接纳品种’windows Appliction’
(因为是winForm应用程序,如若是选拔的其余 如’class
…’类库,则须求在事后的步骤中,改变项目性质中的
输出类型,不提出如此操作),如图:图片 2

 点击 生成 即可 获得此主程序集的源码,其余的相关程序集再这么操作即可!
——不要以为水到渠成,那只是第一步,麻烦的在后头!

    c.将转变的源码 在Vs中开拓(项目),
先试着运行下,(一般)会报错,排除’xxx程序集不存在’那类的错误,我所蒙受的如下:

   

图片 3

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
{
}
}

图片 4

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

    d. 添加相关程序集的引用,设置启动对象。到此时,大致程序就足以
跑起来了,不过还从未完 ——因为
反编译后的代码,文件夹的职位和界面与资源引用之间的关联,基本上都乱了.所以现在要化解的关键难点是:苏醒文件间的涉嫌和引用(别的的难点,通过调节就
差不离可以解决)。如图:

   图片 5
体的.cs和.resx(资源)文件不在同一个文本夹中,对应窗体的.resx文件都增加了连串或解决方案名前缀(zhiyiSystem.)
——This is point! 
那就是大家要化解难题的显要:苏醒窗体的.cs和.resx文件间的涉嫌,操作大致有以下两步:1.
将窗体的.cs和.resx文件放在同一个文书中——即一律目录。2.去掉窗体的.resx文件的前缀
——即修改文件名,如果是一个个文件去修改,窗体相比较多的话,是一件越发重复而无聊的事,于是
就上网找
“批量改动文件名”的工具,下载了一多个感觉都不佳用,找不到,只可以自己搞了,再说那东西简单,说白了就是
遍历文件夹中文件并’重命名'(代码就不贴出了,小说后 附有 自己写的
“批量修改文件名”工具)。

      
到此,程序就足以真正跑起来了。别看本身写出来,就如’破解’
是说话的事,但我做的时候,却几经折腾
好五遍都感到”算了,又卡住了…”,有些或大或小意思,在那边因为日子的原故
及有些步骤一时半会也想不起来了,但重点的点子应该都尚未落下,假使有不亮堂的朋友,可以留言沟通,再做解答;也可望在’破解’方法有经验的,能多提些意
见,分享下你的‘破解’经验!

     后附:

一、        准备工具

A.       
Reflector工具:

图片 6

 

B.       
ResGen.exe工具(C:\Program
Files\Microsoft SDKs\Windows\v6.0A\bin)

图片 7

三、        反编译

A.        将”EXE”或”DLL”文件拖入”Reflector”.得到如下界面.

图片 8

B.        将代码拷贝到你刚建立的文书中去,例如获得如下代码:

using System;

using System.Linq;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

 

namespace Test

{

    public class Form1 : Form

    {

        // Fields

        private Button button1;

        private IContainer components = null;

        private Label label1;

        private ListBox listBox1;

 

        // Methods

        public Form1()

        {

            this.InitializeComponent();

        }

 

        private void button1_Click(object sender, EventArgs e)

        {

            MessageBox.Show("HelloWorld");

        }

 

        protected override void Dispose(bool disposing)

        {

            if (disposing && (this.components != null))

            {

                this.components.Dispose();

            }

            base.Dispose(disposing);

        }

 

        private void InitializeComponent()

        {

            this.button1 = new Button();

            this.label1 = new Label();

            this.listBox1 = new ListBox();

            base.SuspendLayout();

            this.button1.Location = new Point(0x54, 0xe8);

            this.button1.Name = "button1";

            this.button1.Size = new Size(0x48, 20);

            this.button1.TabIndex = 0;

            this.button1.Text = "button1";

            this.button1.Click += new EventHandler(this.button1_Click);

            this.label1.Location = new Point(4, 12);

            this.label1.Name = "label1";

            this.label1.Size = new Size(0xe9, 20);

            this.label1.Text = "列表:";

            this.listBox1.Items.Add("杭州");

            this.listBox1.Items.Add("厦门");

            this.listBox1.Location = new Point(4, 0x24);

            this.listBox1.Name = "listBox1";

            this.listBox1.Size = new Size(0xe9, 0xb8);

            this.listBox1.TabIndex = 2;

            base.AutoScaleDimensions = new SizeF(96f, 96f);

            base.AutoScaleMode = AutoScaleMode.Dpi;

            this.AutoScroll = true;

            base.ClientSize = new Size(240, 0x126);

            base.Controls.Add(this.listBox1);

            base.Controls.Add(this.label1);

            base.Controls.Add(this.button1);

            base.Name = "Form1";

            this.Text = "DecompileExample";

            base.ResumeLayout(false);

        }

    }

}

修改的结果:

using System;

using System.Linq;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

 

namespace Test

{

    public class Form1 : Form

    {

        // Fields

        private System.Windows.Forms.Button button1;

        private IContainer components = null;

        private System.Windows.Forms.Label label1;

        private System.Windows.Forms.ListBox listBox1;

 

        // Methods

        public Form1()

        {

            this.InitializeComponent();

        }

 

        private void button1_Click(object sender, EventArgs e)

        {

            MessageBox.Show("HelloWorld");

        }

 

        protected override void Dispose(bool disposing)

        {

            if (disposing && (this.components != null))

            {

                this.components.Dispose();

            }

            base.Dispose(disposing);

        }

 

        private void InitializeComponent()

        {

            this.button1 = new System.Windows.Forms.Button();

            this.label1 = new System.Windows.Forms.Label();

            this.listBox1 = new System.Windows.Forms.ListBox();

            base.SuspendLayout();

            this.button1.Location = new System.Drawing.Point(0x54, 0xe8);

            this.button1.Name = "button1";

            this.button1.Size = new System.Drawing.Size(0x48, 20);

            this.button1.TabIndex = 0;

            this.button1.Text = "button1";

            this.button1.Click += new EventHandler(this.button1_Click);

            this.label1.Location = new System.Drawing.Point(4, 12);

            this.label1.Name = "label1";

            this.label1.Size = new System.Drawing.Size(0xe9, 20);

            this.label1.Text = "列表:";

            this.listBox1.Items.Add("杭州");

            this.listBox1.Items.Add("厦门");

            this.listBox1.Location = new System.Drawing.Point(4, 0x24);

            this.listBox1.Name = "listBox1";

            this.listBox1.Size = new System.Drawing.Size(0xe9, 0xb8);

            this.listBox1.TabIndex = 2;

            base.AutoScaleDimensions = new System.Drawing.SizeF(96f, 96f);

            base.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;

            this.AutoScroll = true;

            base.ClientSize = new System.Drawing.Size(240, 0x126);

            base.Controls.Add(this.listBox1);

            base.Controls.Add(this.label1);

            base.Controls.Add(this.button1);

            base.Name = "Form1";

            this.Text = "DecompileExample";

            base.ResumeLayout(false);

        }

    }

}

假定该窗体带有资源文件(resources),可以用Reflector工具将资源文件导出.

图片 9

譬如地点紫色框内的资源文件就是对应上边”Form1”窗体的资源文件.

图片 10

入选”DecompileExample.Form1.resources”,然后点击右键采用”Save As…”导出资源文件.

图片 11

在先河菜单中找到”Visual Studio
2008 Command Prompt”命令.打开命令窗口:

图片 12

将resources文件转换成resx文件.将”Form1.resx”文件拷贝到项目中覆盖原来文件.

在意:要是一个窗体带有resources文件,并且有内容的时候,在反编译的时候会如下的讲话:

ComponentResourceManager
manager = new

ComponentResourceManager(typeof(ClassName));
亟待将地点的语句替换为
System.ComponentModel.ComponentResourceManager
resources = new

System.ComponentModel.ComponentResourceManager(typeof(ClassName));那样窗体设计器才能健康识别,名字也要改为”resources”.

在翻看窗体时如出现如下错误,可以重启一下Visual Studio
2008即可.

图片 13

重启之后便足以健康突显了.

图片 14

拍卖单合营源文件,我们在Reflector程序中看出灰色框其实就是一个资源文件,文件名为”Resources”.

图片 15

据此在档次中新建一个Resources.resx文件.根据地点的手续将resources文件转换成resx文件,用VS2008打开界面如下:

图片 16

可以接纳那两条记下后拷贝粘贴到刚刚新建的资源文件中即可.

用Reflector反编译 Mobile Winform程序

四、        总结

按照上边的操作已经做到反编译的全体做事,如若在代码中用到第三方dll文件需求将dll应用到项目中来.在实际反编译工作中恐怕并不是那么简单,本文首要也是投砾引珠的功能.具体情状要实际分析.

作者:顾恩礼

相关文章