新浦京81707con > 软件下载 > 使用ILDasm查看托管代码的元数据,软件方法

原标题:使用ILDasm查看托管代码的元数据,软件方法

浏览次数:124 时间:2019-05-06

VS中增加IL DASM工具

大家在设置VS同时都会自动安装ildasm工具,不须求再度安装。ildasm工具张开艺术如下图:

图片 1

我们也得以直接wind CR-V.输入:C:Program Files (x86)Microsoft SDKsWindowsv7.0Abinildasm.exe (window 7 63个人 操作系统安装目录) 同样能够展开ildasm。
我们也得以把ildasm工具扩大到我们常用的VS中。
一.工具(Tools)-->外部工具(External Tools..)

图片 2

二.加多内容填写对应消息。命令:C:Program Files (x86)Microsoft SDKsWindowsv7.0Abinildasm.exe
(window 七 6玖个人 操作系统安装目录) 。

图片 3

已上新闻填写完结后,在“工具”选取卡中能找到大家刚扩大的外部工签名称(IL_DASM)。增添实现后方可小规模试制壹把。
国际惯例来段"Hello World"。代码编写完后直接F陆生成exe文件,然后工具-->IL_DASM-->确认(无需修改任何参数,暗许指标文件路线)。系统会弹出IL工具,大家双击Main方法。

图片 4

此刻可以见见Main方法在IL中编写翻译的代码。感到有点面生不易看懂。 还有IL编写翻译出现的三角型,正方型都是什么!

IL DASM反编写翻译工具

  使用C#的古人或多或少都会对微软的IL反编写翻译工具(ildasm.exe)有所认知。小编最早接触到那工具是信用合作社同事使用她反编写翻译exe程序,举办研读和改换。以为他仍旧很强劲。
  IL是微软平台上的1门中间语言,大家常写的C#代码在编写翻译器中都会自行转变到IL,然后在由即时编写翻译器(JIT Compiler)转化学工业机械器码,最终被CPU实行。ildasm.exe反编写翻译工具将IL汇编成可跨平台可举办的(pe)文件。可供咱们领会外人代码和修改。有了她大家对待难点得以毫不停留在编辑器层面,可深入中间层。

图片 5

IL DASM反编写翻译工具

  使用C#的古人或多或少都会对微软的IL反编译工具(ildasm.exe)有所认知。作者最早接触到那工具是信用合作社同事使用他反编写翻译exe程序,举办研读和修改。以为他照旧很强劲。
  IL是微软平台上的一门中间语言,大家常写的C#代码在编写翻译器中都会自动调换来IL,然后在由即时编写翻译器(JIT Compiler)转化学工业机械器码,最终被CPU试行。ildasm.exe反编写翻译工具将IL汇编成可跨平台可实践的(pe)文件。可供大家询问外人代码和修改。有了他我们对待难题得以不要停留在编辑器层面,可深刻中间层。

IL DASM 基础

1.Logo含义

图片 6

采纳IL反编写翻译出项目代码

图片 7

MANIFEST:是贰个叠加新闻列表,主要涵盖程序集的一些品质,如程序集名称、版本号、哈希算法等;
德姆ocode:项目名称
德姆ocodeing.Common:命名空间
Democodeing.ICar:接口
Democodeing.Program:类,主要查看存类上边包车型大巴内容。

.class 类音信项代码:

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

一).class,表示Program是一个类。并且它继续自程序集—mscorlib的System.Object类;
二)private,表示访问权限;
三)auto,表示程序的内部存款和储蓄器加载整体由CL奥德赛来支配;
4)ansi,是为了在并未有托管代码与托管代码之间完成无缝调换。这里首要指C、C 代码等;
5)before田野(field)init,是用来标志运转库(CLCRUISER)能够在静态字段方法生成后的随便时刻,来加载构造器(构造函数);

.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代码,提示编写翻译器编写翻译为托管代码;
二).maxstack:表示调用构造函数.otor时期的评估货仓(Evaluation Stack) ;
3)  IL_0000:标识代码行开首;
四)ldarg.0:表示转载第三个分子参数,在实例方法中指的是近来实例的引用;
5)call:call一般用于调用静态方法,因为静态方法是在编写翻译期就规定的。而这边的构造函数.otor()也是在编写翻译期就制订的。而另一指令callvirt则意味着调用实例方法, 它是在运作时规定的,因为如前述,当调用方法的继续关系时,将在相比较基类与派生类的同名函数的兑现方式(virtual和new),以鲜明调用的函数所属的Method Table;
6)ret:表示试行完成,重回;

Main() 静态方法代码:

.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // 代码大小       19 (0x13)
  .maxstack  8
  IL_0000:  nop
  IL_0001:  ldstr      "Hello World"
  IL_0006:  call       void [mscorlib]System.Console::WriteLine(string)
  IL_000b:  nop
  IL_000c:  call       string [mscorlib]System.Console::ReadLine()
  IL_0011:  pop
  IL_0012:  ret
} // end of method Program::Main

1) hidebysig:表示当把该类作为基类,存在派生类时,此方法不被一而再,同上构造函数;
二).entrypoint:指令表示CLGL450加载程序时,是率先从.entrypoint开头的,即从Main方法作为程序的入口函数;
3)nop:为空该指令,主要给外部设备大概指令间隙计划时间;
四)ldstr:创造String对象变量"Hello World." ;
5)pop:收取栈顶的值。当大家无需把值存入变量时行使;

图片 8

行使IL DASM 修改EXE程序代码

一.开垦IL工具,采用所要修改的EXE程序。

图片 9

二.文书-->转储。分明后选用另存路线,会生成三个文件:*.il 和 *.res

图片 10

3.用记事本展开*.il修改里面包车型大巴剧情:

图片 11

 .method private hidebysig static void  Main(string[] args) cil managed
  {
    .entrypoint
    // 代码大小       19 (0x13)
    .maxstack  8
    IL_0000:  nop
    IL_0001:  ldstr      "Hello World-[已使用il工具修改过...]"
    IL_0006:  call       void [mscorlib]System.Console::WriteLine(string)
    IL_000b:  nop
    IL_000c:  call       string [mscorlib]System.Console::ReadLine()
    IL_0011:  pop
    IL_0012:  ret
  } // end of method Program::Main

图片 12

4.把修改后的代码编写翻译成EXE程序。

ilasm /exe /output=C:CK.exe /Resource=C:UsersCkDesktopcoding.res C:UsersCkDesktopcoding.il

图片 13

修改就像是此简单。运转修改后的EXE程序,值已修改。

图片 14

接纳IL DASM 修改EXE程序代码

1.开辟IL工具,选用所要修改的EXE程序。

图片 15

二.文书-->转储。鲜明后接纳另存路线,会调换三个文件:*.il 和 *.res

图片 16

三.用记事本张开*.il修改里面的剧情:

 .method private hidebysig static void  Main(string[] args) cil managed
  {
    .entrypoint
    // 代码大小       19 (0x13)
    .maxstack  8
    IL_0000:  nop
    IL_0001:  ldstr      "Hello World-[已使用il工具修改过...]"
    IL_0006:  call       void [mscorlib]System.Console::WriteLine(string)
    IL_000b:  nop
    IL_000c:  call       string [mscorlib]System.Console::ReadLine()
    IL_0011:  pop
    IL_0012:  ret
  } // end of method Program::Main

四.把修改后的代码编写翻译成EXE程序。

ilasm /exe /output=C:CK.exe /Resource=C:UsersCkDesktopcoding.res C:UsersCkDesktopcoding.il

图片 17

修改就那样简单。运转修改后的EXE程序,值已修改。

图片 18

 

图片 19

IL DASM 基础

1.Logo含义

图片 20

运用IL反编写翻译出项目代码

图片 21

MANIFEST:是一个增大音信列表,首要包罗程序集的部分性质,如程序集名称、版本号、哈希算法等;
德姆ocode:项目名称
德姆ocodeing.Common:命名空间
Democodeing.ICar:接口
德姆ocodeing.Program:类,首要查看存类上边包车型地铁从头到尾的经过。

.class 类音信项代码:

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

一).class,表示Program是3个类。并且它接二连三自程序集—mscorlib的System.Object类;
二)private,表示访问权限;
叁)auto,表示程序的内部存款和储蓄器加载全体由CLCRUISER来支配;
4)ansi,是为了在一向不托管代码与托管代码之间实现无缝调换。这里最主要指C、C 代码等;
五)before田野(field)init,是用来标识运营库(CL宝马X5)能够在静态字段方法生成后的即兴时刻,来加载构造器(构造函数);

.ctor 方法代码:

图片 22

.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

图片 23

一)cil managed:表示个中为IL代码,提醒编写翻译器编译为托管代码;
二).maxstack:表示调用构造函数.otor时期的评估货仓(伊娃luation Stack) ;
3)  IL_0000:标志代码行初始;
4)ldarg.0:表示转发第1个成员参数,在实例方法中指的是现阶段实例的引用;
5)call:call一般用于调用静态方法,因为静态方法是在编写翻译期就分明的。而这里的组织函数.otor()也是在编写翻译期就制订的。而另一指令callvirt则意味着调用实例方法, 它是在运营时规定的,因为如前述,当调用方法的存在延续关系时,将在相比较基类与派生类的同名函数的贯彻情势(virtual和new),以明显调用的函数所属的Method Table;
六)ret:表示推行完成,再次来到;

Main() 静态方法代码:

图片 24

.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // 代码大小       19 (0x13)
  .maxstack  8
  IL_0000:  nop
  IL_0001:  ldstr      "Hello World"
  IL_0006:  call       void [mscorlib]System.Console::WriteLine(string)
  IL_000b:  nop
  IL_000c:  call       string [mscorlib]System.Console::ReadLine()
  IL_0011:  pop
  IL_0012:  ret
} // end of method Program::Main

图片 25

一) hidebysig:表示当把该类作为基类,存在派生类时,此办法不被三番五次,同上构造函数;
二).entrypoint:指令表示CLPRADO加载程序时,是首先从.entrypoint早先的,即从Main方法作为程序的入口函数;
3)nop:为空该指令,首要给外部设备只怕指令间隙希图时间;
肆)ldstr:创立String对象变量"Hello World." ;
五)pop:收取栈顶的值。当大家不须要把值存入变量时行使;

VS中增加IL DASM工具

咱俩在设置VS同时都会自动安装ildasm工具,不需求再一次安装。ildasm工具展开艺术如下图:

图片 26

咱俩也能够直接wind 福特Explorer.输入:C:Program Files (x86)Microsoft SDKsWindowsv7.0Abinildasm.exe (window 柒 陆16个人 操作系统安装目录) 同样能够展开ildasm。
大家也得以把ildasm工具扩大到大家常用的VS中。
1.工具(Tools)-->外部工具(External Tools..)

图片 27

二.增加剧情填写对应音信。命令:C:Program Files (x86)Microsoft SDKsWindowsv7.0Abinildasm.exe
(window 七 陆十五位 操作系统安装目录) 。

图片 28

已上消息填写实现后,在“工具”选用卡中能找到大家刚增添的外部工签名称(IL_DASM)。增添达成后方可小规模试制1把。
国际惯例来段"Hello World"。代码编写完后间接F陆生成exe文件,然后工具-->IL_DASM-->确认(不供给修改任何参数,暗许目的文件路线)。系统会弹出IL工具,大家双击Main方法。

图片 29

此刻能够看出Main方法在IL中编写翻译的代码。认为有点不熟悉不易看懂。 还有IL编译出现的三角型,正方型都是吗!

 1 .method private hidebysig static void  Main(string[] args) cil managed
 2 {
 3   .entrypoint
 4   // 代码大小       19 (0x13)
 5   .maxstack  8
 6   IL_0000:  nop
 7   IL_0001:  ldstr      bytearray (49 00 4C 00 44 00 61 00 73 00 6D 00 7F 4F 28 75   // I.L.D.a.s.m..O(u
 8                                   4B 6D D5 8B )                                     // Km..
 9   IL_0006:  call       void [mscorlib]System.Console::WriteLine(string)
10   IL_000b:  nop
11   IL_000c:  call       string [mscorlib]System.Console::ReadLine()
12   IL_0011:  pop
13   IL_0012:  ret
14 } // end of method Program::Main

 

留意在指令中要动用相对路线,不然ildasm.exe会找不到你所要反汇编的exe或dll文件。也可只输入ildasm,此时只会展开不加载任何exe或dll的ildasm.exe窗口:

 

1 class Program
2     {
3         static void Main(string[] args)
4         {
5             Console.WriteLine("ILDasm使用测试");
6             Console.ReadLine();
7         }
8 }

 图片 30

图片 31

1).class,表示Program是一个类。并且它继续自程序集—mscorlib的System.Object类;
贰)private,表示访问权限;
3)auto,表示程序的内存加载全体由CLLX570来支配;
四)ansi,是为着在尚未托管代码与托管代码之间完成无缝调换。这里关键指C、C 代码等;
5)before田野先生init,是用来标志运维库(CL安德拉)能够在静态字段方法生成后的妄动时刻,来加载构造器(构造函数);

本文由新浦京81707con发布于软件下载,转载请注明出处:使用ILDasm查看托管代码的元数据,软件方法

关键词: 新浦京81707con C# 工具 IL ILDASM Inside CLR

上一篇:第十六章

下一篇:没有了