一.前言:

微软的IL反编译实用程序——Ildasm.exe,可以对可执行文件(ex,经典的控制台Hello World 的 exe 可执行文件)抽取出 IL 代码,并且给出命名空间以及类的视图。在讲述如何反编译之前,有必要从虚拟CPU的角度来看CLR,这样有助于先从正面了解代码执行过程。

虚拟CPU:

.NET 程序,其核心皆为 CLR ,而同时CLR的功能却与CPU非常相近,其中CLR执行IL代码(或叫做,IL指令)、操作数据,只不过操作的代码不同:CPU操作机器语言,而CLR操作IL代码。

由上,上述讲解的是从IL--机器语言的过程,而Ildasm则可以实现将可执行程序(机器语言)--IL代码,这就是Ildasm的主要功能

在Anytao的《你必须知道的.NET》中对IL代码专门做了说明,虽然暂时悟不透其"深远意义",但我还是愿意去开始我的IL之旅的,呵呵~。 在此我们先看,Anytao对于掌握(或者了解) IL代码的重要性:

1.通用的语言基础是.NET运行的基础,当我们对运行结果有异议的时候,如何透过表面看本质,IL是必须的基础

2. IL也是更好理解、认识CLR的基础

3.大量的实例分析是以IL为基础的,所以了解IL,是读懂他人代码的必备基础,同时自己也可以获得潜移默化的提高;

有上述3条影响,足以让任何一个有追求的人都鼓足劲,去开始IL之旅了(自然包括我,呵呵~)。

二 .Ildasm.exe 的使用方法:

在应用Ildasm.exe具体反编译代码之前,先附上MSDN对于用Ildasm.exe反编译的经典帮助示例:

然后我们用Ildasm.exe具体反编译经典的"Hello World"控制台程序的可执行文件,展现出来的视图为:

分析具体IL代码:

1.MANIFEST清单:

MANIFEST是一个附加信息列表,主要包含程序集的一些属性,如程序集名称、版本号、哈希算法等;

2.ConsoleApplication1.Program类:

这才是我们介绍的主角

首先是Program类: 代码为

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

1).class,表示Program是一个类。并且它继承自程序集—mscorlib的System.Object类;

2)private,表示访问权限;

3)auto,表示程序的内存加载全部由CLR来控制;

4)ansi,是为了在没有托管代码与托管代码之间实现无缝转换。这里主要指C、C++代码等;

5)beforefieldinit,是用来标记运行库(CLR)可以在静态字段方法生成后的任意时刻,来加载构造器(构造函数);

其次是 .otor方法,代码为:

.method public hidebysig specialname rtspecialname 
        instance void  .ctor() cil managed
{
  // Code size       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()方法,代码为:

.method private hidebysig static void  Main() cil managed
{
  .entrypoint
  // Code size       13 (0xd)
  .maxstack  8
  IL_0000:  nop
  IL_0001:  ldstr      "Hello world"
  IL_0006:  call       void [mscorlib]System.Console::WriteLine(string)
  IL_000b:  nop
  IL_000c:  ret
} // end of method Program::Main

1) .entrypoint指令表示CLR加载程序时,是首先从.entrypoint开始的,即从Main方法作为程序的入口函数;

2)ldstr:表示将字符串压栈,在这里就是将"Hello World." 压栈;

3)hidebysig:表示当把此类作为基类,存在派生类时,此方法不被继承,同上构造函数;

至此,我们对IL代码的一些指令有了了解,也纵观了IL世界里的概况,呵呵~

常用IL指令扩展:

一:创建对象实例的IL指令

关于创建对象的在内存分配的机制,在《内存探寻1之——值类型和引用类型的内存分配机制》 里有了详细的介绍。而常用的创建对象的IL指令使我们更好理解对象的步骤。其主要有4种:

1.newobj: 用于创建引用类型的对象;

2:ldstr:用于创建String对象变量;

3.newarr:用于创建数组型对象;

4:box:在值类型转换为引用类型的对象时,将值类型拷贝纸托管堆上分配内存;

二:通过IL代码,更好地理解属性

我们在C++中,在典型的类中,都会定义用于控制有效性输入的Set()函数,以及用于不同方式显示的Get()函数。然而在C#中,它将Get()函数和Set()结合在一起,刚开始难免会为之混淆。然而若通过 Ildasm.exe对程序反编译后观察属性的本质,即可看到其执行机制,如下图示(注:选自互联网):

由我们前面的分析IL代码的方法,以及上图的展示,我们可以看到属性被重新分为Get()函数和Set()函数。ex,属性Name,被分解为get_Name()函数和set_Name(String s)函数。这样我们对其本质就一目了然了!至于其属性的特殊表示形式,只看做是Set()函数和Get()函数的完美结合体就可以了,这也是C#语言的优美体现啊,呵呵~

Ildasm.exe 概要:的更多相关文章

  1. 转载文章----初识Ildasm.exe——IL反编译的实用工具

    转载地址http://www.cnblogs.com/yangmingming/archive/2010/02/03/1662307.html Ildasm.exe 概要:(路径:C:\Program ...

  2. 初识Ildasm.exe——IL反编译的实用工具

    原文地址:http://www.cnblogs.com/yangmingming/archive/2010/02/03/1662307.html Ildasm.exe 概要: 一.前言: 微软的IL反 ...

  3. [No000013B]初识Ildasm.exe——IL反编译的实用工具

    Ildasm.exe 概要: 一.前言: 微软的IL反编译实用程序——Ildasm.exe,可以对可执行文件(ex,经典的控制台Hello World 的 exe 可执行文件)抽取出 IL 代码,并且 ...

  4. 转载文章----IL反编译利器——Ildasm.exe和Reflector.exe:

    转载地址:http://www.cnblogs.com/yangmingming/archive/2010/02/03/1662546.html 一:Ildasm.exe简介  这一微软VS自带工具, ...

  5. 关于ILDASM.EXE的知识整理

    因为现在用的VS2010,发现,这个工具自己就带着ILDASM.EXE这个反编译工具 具体的查找方式为: C:\Program Files\Microsoft SDKS\Windows\V7.0\bi ...

  6. 【解决方案】VS2013外部工具中添加ildasm.exe

    VS2013安装在Win8.1的操作系统中,开始屏幕中找不到ildasm.exe没有显示,于是下面提供了一种方法将ildasm.exe工具添加到VS2013外部工具中,并将反编译的代码输出到VS201 ...

  7. Ildasm.exe(MSIL 反汇编程序)

    MSIL 反汇编程序是 MSIL 汇编程序 (Ilasm.exe) 的伙伴工具. Ildasm.exe 采用包含 Microsoft 中间语言 (MSIL) 代码的可迁移可执行 (PE) 文件,并创建 ...

  8. ilasm.exe与ildasm.exe的使用(编译与反编译)

    ilasm.exe与ildasm.exe的使用(编译与反编译)   首先打开cmd命令.cd 到 C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0 ...

  9. IL反编译的实用工具Ildasm.exe

    初识Ildasm.exe——IL反编译的实用工具    https://www.cnblogs.com/yangmingming/archive/2010/02/03/1662307.html   学 ...

随机推荐

  1. 定制一个FlatBuffers编译器

    个人并不喜欢FlatBuffers编译器生成的代码,原因是我已经习惯了unix风格的代码. 不喜欢之处大致有以下: 1 命名法使用了Pascal命名法,而我个人习惯了小写字母加下划线式的unix式命名 ...

  2. 使用RSA非对称密钥算法实现硬件设备授权

    一.硬件设备授权 即用户在硬件设备输入一个序列号(或一个包含授权信息的文件),然后硬件设备便可正常使用.    二.授权方案 构思授权方案时,参考了下面网址的思路: http://bbs.csdn.n ...

  3. make subversion时出现neon报错 及 svn其他问题汇总(3ge )

    在make subvision时,出现以下错误提示: /usr/local/src/neon-0.29.6/src/ne_auth.c:781: undefined reference to`ne__ ...

  4. 《Linux设备驱动程序》 笔记1

    驱动程序的任务 通常来讲,驱动(模块)要执行两类任务: 模块中的某些函数作为系统调用的一部分执行(按照既定规则填补必需的系统调用模块) 其他函数负责终端处理 内核中的并发 为什么考虑并发问题: Lin ...

  5. centos 7搭建vpn(pptpd)服务器 (只限centos 7)

    第一步:首先检查ppp是否开启  若使用XEN构架的VPS,此步骤不用执行 终端输入命令:cat /dev/ppp 开启成功的标志:No such file or directory 或者 No su ...

  6. poj 3094 Quicksum

    #include <stdio.h> #include <string.h> ]; int main() { ; int i,len; while(gets(word)) { ...

  7. 未能加载文件或程序集“Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。

    未能加载文件或程序集“Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed”或它的某一个 ...

  8. js运动 九宫格展开

    <!doctype html> <html> <head> <meta charset = "utf-8"> <title&g ...

  9. 一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库 RxJava,相当好

    https://github.com/ReactiveX/RxJava https://github.com/ReactiveX/RxAndroid RX (Reactive Extensions,响 ...

  10. Chef

    Chef是一个渐渐流行的部署大.小集群的自动化管理平台.Chef可以用来管理一个传统的静态集群,也可以和EC2或者其他的云计算提供商一起使用.Chef用cookbook作为最基本的配置单元,可以被泛化 ...