指示编译器编译为托管代码; 2).maxstack:表示调用构造函数.otor期间的评估堆栈(Evaluation St

时间:2022-02-16 04:46:24

IL DASM反编译工具

  使用C#的猿人或多或少城市对微软的IL反编译工具(ildasm.exe)有所认识。我最早接触到这工具是公司同事使用他反编译exe措施,进行研读和改削。觉得他还是很强大。
  IL是微软平台上的一门中间语言,我们常写的C#代码在编译器中城市自动转换成IL,然后在由即时编译器(JIT Compiler)转化机器码,最后被CPU执行。ildasm.exe反编译工具将IL汇编成可跨平台可执行的(pe)文件。可供我们了解别人代码和改削。有了他我们对待问题可以不用勾留在编纂器层面,可深入中间层。

VS中增加IL DASM工具

我们在安置VS同时城市自动安置ildasm工具,无需另行安置。ildasm工具打开要领如下图:

指示编译器编译为托管代码; 2).maxstack:表示调用构造函数.otor期间的评估堆栈(Evaluation St

我们也可以直接wind+R.输入:C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin\ildasm.exe (window 7 64位 操纵系统安置目录) 同样可以打开ildasm。
我们也可以把ildasm工具增加到我们常用的VS中。
1.工具(Tools)-->外部工具(External Tools..)

指示编译器编译为托管代码; 2).maxstack:表示调用构造函数.otor期间的评估堆栈(Evaluation St

2.添加内容填写对应信息。命令:C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin\ildasm.exe
(window 7 64位 操纵系统安置目录) 。

指示编译器编译为托管代码; 2).maxstack:表示调用构造函数.otor期间的评估堆栈(Evaluation St

已上信息填写完成后,在“工具”选择卡中能找到我们刚增加的外部工具名称(IL_DASM)。增加完成后可以小试一把。
国际惯例来段"Hello World"。代码编写完后直接F6生成exe文件,然后工具-->IL_DASM-->确认(无需改削任何参数,默认方针文件路径)。系统会弹出IL工具,我们双击Main要领。

指示编译器编译为托管代码; 2).maxstack:表示调用构造函数.otor期间的评估堆栈(Evaluation St

这时可以看到Main要领在IL中编译的代码。觉得有点陌生不易看懂。 还有IL编译呈现的三角型,正方型都是啥!

IL DASM 根本

1.图标含义

指示编译器编译为托管代码; 2).maxstack:表示调用构造函数.otor期间的评估堆栈(Evaluation St

使用IL反编译出项目代码

指示编译器编译为托管代码; 2).maxstack:表示调用构造函数.otor期间的评估堆栈(Evaluation St

MANIFEST:是一个附加信息列表,主要包罗措施集的一些属性,如措施集名称、版本号、哈希算法等;
Democode:项目名称
Democodeing.Common:定名空间
Democodeing.ICar:接口
Democodeing.Program:类,主要检察存类下面的内容。

.class 类信息项代码:

.class private auto ansi beforefieldinit DemoCoding.Program extends [mscorlib]System.Object { } // end of class DemoCoding.Program

1).class,暗示Program是一个类。并且它担任自措施集—mscorlib的System.Object类;
2)private,暗示访谒权限;
3)auto,暗示措施的内存加载全部由CLR来控制;
4)ansi,是为了在没有托管代码与托管代码之间实现无缝转换。这里主要指C、C++代码等;
5)beforefieldinit,是用来符号运行库(CLR)可以在静态字段要领生成后的任意时刻,来加载结构器(结构函数);

.ctor 要领代码:

.method public hidebysig specialname rtspecialname instance void .ctor() cil managed { // 代码巨细 7 (0x7) .maxstack 8 IL_0000: ldarg.0 IL_0001: call instance void [mscorlib]System.Object::.ctor() IL_0006: ret } // end of method Program::.ctor

1)cil managed:暗示此中为IL代码,指示编译器编译为托管代码;
2).maxstack:暗示挪用结构函数.otor期间的评估仓库(Evaluation Stack) ;
3)  IL_0000:符号代码行开头;
4)ldarg.0:暗示转载第一个成员参数,在实例要领中指的是当前实例的引用;
5)call:call一般用于挪用静态要领,因为静态要领是在编译期就确定的。而这里的结构函数.otor()也是在编译期就制定的。而另一指令callvirt则暗示挪用实例要领, 它是在运行时确定的,,因为如前述,当挪用要领的担任关系时,就要对照基类与派生类的同名函数的实现要领(virtual和new),以确定挪用的函数所属的Method Table;
6)ret:暗示执行完毕,返回;

Main() 静态要领代码: