Reflector代码反编写翻译,A.        新建二个与要反编写翻译程序相似名称的项目.

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(财富卡塔 尔(英语:State of Qatar)文件不在同一个文本夹中,对应窗体的.resx文件都增进了体系或缓慢解决方案名前缀(zhiyiSystem.)
——This is point! 
那就是大家要解除难点的第意气风发:恢复生机窗体的.cs和.resx文件间的关联,操作大约有以下两步:1.
将窗体的.cs和.resx文件放在同一个文本中——即生机勃勃律目录。2.去掉窗体的.resx文件的前缀
——即订正文件名,假诺是三个个文件去订正,窗体相当多的话,是意气风发件超重复而粗鄙的事,于是
就上网找
“批量改正文件名”的工具,下载了一四个感觉都倒霉用,找不到,只可以和煦搞了,再说那东西简单,说白了正是遍历文件夹中文件并’重命名'(代码就不贴出了,小说后 附有 自身写的
“批量改换文件名”工具)。

      
到此,程序就足以真正跑起来了。别看笔者写出来,就如’破解’正是说话的事,但笔者做的时候,却多次经过折腾
好两回都以为”算了,又卡住了…”,有个别或大或小意思,在那间因为时间的来由
及某个步骤偶尔半会也想不起来了,但首要的章程应该都并未有落下,假如有不知道的相恋的人,能够留言沟通,再做解答;也意在在’破解’方法有资历的,能多提些意
见,分享下您的‘破解’资历!

     后附:

用Reflector反编译 Mobile Winform程序

批量订正文件名工具.rar

(Reflector插件)Reflector.FileDisassembler.rar

 

作者:顾恩礼

豆蔻年华、        思谋工具

A.       
Reflector工具:

图片 6

 

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

图片 7

二、        反编写翻译前备选

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

B.        新建多少个与要反编写翻译程序相符名称的窗体,删除窗体自带控件如MainMenu控件,删除*.Designer.cs文件.

三、        反编译

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
2010 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
2010就能够.

图片 13

重启之后便得以平常显示了.

图片 14

管理单独财富文件,我们在Reflector程序中看见洋蓟绿框其实正是叁个财富文件,文件名称为”Resources”.

图片 15

由此在项目中新建三个Resources.resx文件.依照上边的手续将resources文件调换来resx文件,用VS二〇〇九张开分界面如下:

图片 16

能够选拔这两条记下后拷贝粘贴到刚刚新建的资源文件中就能够.

四、        总结

依据上面的操作已经做到反编写翻译的上上下下职业,假若在代码中用到第三方dll文件须求将dll应用到品种中来.在事实上反编写翻译专门的学业中大概并非那么粗略,本文主要也是引玉之砖的成效.具体情状要切实可行剖判.

相关文章