点评:软中间语言 (MSIL) 是一种语言,是许多编译器(C#、VB.NET等)的输出。ILDasm (中间语言反汇编器)程序和.Net Framework SDK(FrameworkSDK\Bin\ildasm.exe)打包在一起,让用户以人可阅读的格式查看MSIL代码

通过该工具,我们可以打开任何.net可执行文件(exe或dll)并查看其MSIL代码。
Ildasm.exe下载地址:http://www.jb51.net/softs/73291.html
下边我们来看看怎么使用:

1.在VS2008中新建一个Windows窗体应用程序,输入如下代码后生成解决方案:

复制代码

代码如下:


private void Form1_Load(object sender, EventArgs e)
{
int i = 0;
i = i++;
MessageBox.Show(i.ToString());
}

2.运行ildasm,打开刚生成的exe文件,可以看到如下内容:

3.在ildasm中双击"Form1_Load: void(object,class [mscorlib]System.EventArgs)"即可看到上边代码的MSIL代码:

复制代码

代码如下:


.method private hidebysig instance void Form1_Load(object sender,
class [mscorlib]System.EventArgs e) cil managed
{
// 代码大小 22 (0x16)
.maxstack 3
.locals init ([0] int32 i)
IL_0000: ldc.i4.0
IL_0001: stloc.0
IL_0002: ldloc.0
IL_0003: dup
IL_0004: ldc.i4.1
IL_0005: add
IL_0006: stloc.0
IL_0007: stloc.0
IL_0008: ldloca.s i
IL_000a: call instance string [mscorlib]System.Int32::ToString()
IL_000f: call valuetype [System.Windows.Forms]System.Windows.Forms.DialogResult [System.Windows.Forms]System.Windows.Forms.MessageBox::Show(string)
IL_0014: pop
IL_0015: ret
} // end of method Form1::Form1_Load

附:将ildasm集成到VS2008中的方法:

在VS2008菜单中选择"工具→外部工具",点击添加按钮,在标题中输入ILdasm,命令中输入C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\ildasm.exe,确定后在工具菜单中就能找到ILdasm了,以后只要选择它就能运行ILdasm。

MSIL汇编程序(Ilasm.exe)和MSIL反汇编程序(Ildasm.exe)

先来解释下文要提到的几个名词:

PE文件:可移植可执行文件。当为公共语言运行库编译程序时,该程序转换为由三部分组成的 PE 文件,PE 标头、MSIL 指令、元数据。

MSIL: Microsoft 中间语言。这是一组可以有效地转换为本机代码且独立于 CPU 的指令。MSIL 包括用于加载、存储和初始化对象以及对对象调用方法的指令,还包括用于算术和逻辑运算、控制流、直接内存访问、异常处理和其他操作的指令。

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

还是以SampleClass为例来解释它们的用法。

MSIL反汇编程序(Ildasm.exe)

下面的命令使 PE 文件 SampleClass.exe 的元数据和反汇编代码显示在 Ildasm.exe 的默认 GUI 中。
ildasm SampleClass.exe
下面的命令对 SampleClass.exe 文件进行反汇编,并将结果 MSIL 汇编程程序文本存储在 SampleClass.il 文件中。

E:\test>ildasm SampleClass.exe /output:SampleClass.il
// WARNING: Created Win32 resource file SampleClass.res

下面的命令对 SampleClass.exe 文件进行反汇编,并将结果 MSIL 汇编程序文本显示到控制台窗口中。

E:\test>ildasm SampleClass.exe /text

如果文件 SampleClass.exe 包含嵌入的托管和非托管资源,则下面的命令将产生以下 4 个文件:SampleClass.il、SampleClass.res、Icons.resources 和 Message.resources:

ildasm SampleClass.exe /output:SampleClass.il

下面的命令对 SampleClass.exe 的 SampleClass 类中的 DataClass 方法进行反汇编,并将输出显示到控制台窗口中。

ildasm /item:SampleClass::DataClass SampleClass.exe /text

参数列表:

下列选项可用于 .exe、.dll、.obj 和 .lib 文件。

/output:filename 创建具有指定 filename 的输出文件,而不是在对话框中显示结果。
/text 将结果显示到控制台窗口,而不是显示在对话框中或显示为输出文件。
/? 显示此工具的命令语法和选项。

下列附加选项可用于 .exe 和 .dll 文件。

/bytes 以十六进制格式显示作为指令注释的实际字节。
/linenum 包含对原始源行的引用。
/nobar 取消反汇编进度指示器弹出窗口的显示。
/pubonly 只反汇编公共类型和公共成员。等效于 /visibility:PUB
/quoteallnames 在单引号中包含所有名称。
/raweh 以原始格式显示异常处理子句。
/source 显示作为注释的原始源行。
/tokens 显示类和成员的元数据标记。
/visibility:vis [+vis ...] 只反汇编具有指定可见性的类型或成员。以下是 vis 的有效值。 PUB Public PRI Private FAM Family ASM Assembly FAA Family 和 Assembly FOA Family 或 Assembly PSC Private Scope

下列选项仅对用于文件或控制台输出的 .exe 和 .dll 文件有效。

/all 指定 /header/bytes/tokens 选项的组合。
/header 在输出中包含文件头信息。
/noil 取消 MSIL 程序集代码输出。
/unicode 对输出使用 Unicode 编码。
/utf8 对输出使用 UTF-8 编码。默认值是 ANSI。

下列选项仅对用于文件或控制台输出的 .exe、.dll、.obj 和 .lib 文件有效。

/item:class[::method [(sig)]] 根据所提供的参数反汇编下列内容:

  • 反汇编指定的 class
  • 反汇编 class 的指定 method
  • 反汇编具有指定签名 sigclassmethod。指定具有返回类型的签名和所需的任意多个参数。例如,returntype (param1, param2,..paramn)。

MSIL汇编程序(Ilasm.exe)

下面的命令对 MSIL 文件 SampleClass.il 进行汇编并产生可执行文件 SampleClass.exe。

E:\test>ilasm SampleClass

Microsoft (R) .NET Framework IL Assembler.  Version 1.1.4322.2032
Copyright (C) Microsoft Corporation 1998-2002. All rights reserved.
Assembling 'SampleClass.IL' , no listing file, to EXE --> 'SampleClass.EX
Source file is ANSI

Assembled method DataClass::.ctor
Assembled method DataClass::addem
Assembled method SampleClass::.ctor
Assembled method SampleClass::Main
Creating PE file

Emitting members:
Global
Class 1 Fields: 2;      Methods: 2;
Class 2 Fields: 2;      Methods: 2;
Resolving member refs: 11 -> 11 defs, 0 refs
Writing PE file
Operation completed successfully

下面的命令对 MSIL 文件 SampleClass.il 进行汇编并产生 .dll 文件 SampleClass.dll。

E:\test>ilasm SampleClass /dll

Microsoft (R) .NET Framework IL Assembler.  Version 1.1.4322.2032
Copyright (C) Microsoft Corporation 1998-2002. All rights reserved.
Assembling 'SampleClass.IL' , no listing file, to DLL --> 'SampleClass.DLL'
Source file is ANSI

Assembled method DataClass::.ctor
Assembled method DataClass::addem
Assembled method SampleClass::.ctor
Assembled method SampleClass::Main
Creating PE file

Emitting members:
Global
Class 1 Fields: 2;      Methods: 2;
Class 2 Fields: 2;      Methods: 2;
Resolving member refs: 11 -> 11 defs, 0 refs
Writing PE file
Operation completed successfully

下面的命令对 MSIL 文件 SampleClass.il 进行汇编并产生 .dll 文件 SampleClass.dll。

ilasm SampleClass /dll /output:newSampleClass.dll

参数列表:

/alignment=integer 将 FileAlignment 设置为由 NT Optional 标题中的 integer 指定的值。如果在文件中指定了 .alignment IL 指令,则此选项将重写它。
/base=integer 将 ImageBase 设置为由 NT Optional 标题中的 integer 指定的值。如果在文件指定了 .imagebase IL 指令,则此选项将重写它。
/clock 为指定的 .il 源文件测量并报告下列编译时间(以毫秒为单位): 总运行时间 执行后面的所有特定操作所花费的总时间。 启动 加载并打开文件。

分析

发出 MD 发出元数据。 定义引用解析 解析对文件中的定义的引用。

修正和链接

CEE 文件生成 在内存中生成文件映像。 PE 文件写入 将映像写入 PE 文件。

/debug 包括调试信息(局部变量名和参数名以及行号)。
/dll 生成 .dll 文件作为输出。
/exe 生成可执行文件作为输出。这是默认值。
/flags=integer 将 ImageFlags 设置为由公共语言运行库标题中的 integer 指定的值。如果在文件中指定了 .corflags IL 指令,则此选项将重写它。有关 integer 的有效值的列表,请参见 CorHdr.h 中的 COMIMAGE_FLAGS。
/key:keyFile 使用 keyFile 中包含的私钥编译具有强签名的 filename
/key:@keySource 使用在 keySource 中生成的私钥编译具有强签名的 filename
/listing 在标准输出上生成列表文件。如果省略此选项,则不生成列表文件。
/nologo 取消显示 Microsoft 启动标题。
/output:file.ext 指定输出文件名和扩展名。默认情况下,输出文件名与第一个源文件名相同。默认扩展名为 .exe。如果指定 /dll 选项,则默认扩展名为 .dll。

注意   指定 /output:myfile.dll 并不会设置 /dll 选项。如果不指定 /dll,则会生成名为 myfile.dll 的可执行文件。

/quiet 指定安静模式;不报告程序集进度。
/resource:file.res 在生成的 .exe 或 .dll 文件中包括 *.res 格式的指定资源文件。使用 /resource 选项只能指定一个 .res 文件。
/subsystem=integer 将 subsystem 设置为由 NT Optional 标题中的 integer 指定的值。如果在文件中指定了 .subsystem IL 指令,则此命令将重写它。有关 integer 的有效值的列表,请参见 winnt.h 中的 IMAGE_SUBSYSTEM。
/? 显示此工具的命令语法和选项。

ILdasm 的使用方法相关推荐

  1. C# IL DASM 使用

    IL DASM反编译工具 使用C#的猿人或多或少都会对微软的IL反编译工具(ildasm.exe)有所认识.我最早接触到这工具是公司同事使用他反编译exe程序,进行研读和修改.感觉他还是很强大. IL ...

  2. 再探.NET的PE文件结构(安全篇)

    一.开篇 首先写在前面,这篇文章源于个人的研究和探索,由于.NET有自己的反射机制,可以清楚的将源码反射出来,这样你的软件就很容易被破解,当然这篇文章不会说怎么样保护你的软件不被破解,相反是借用一个软 ...

  3. 在 Oracle Enterprise Linux 和 iSCSI 上构建您自己的 Oracle RAC 11g 集群

    作者:Jeffrey Hunter 了解如何以低于 2,700 美元的费用在 Oracle Enterprise Linux 上安装并配置 Oracle RAC 11g 第 2 版开发集群. 本指南中 ...

  4. Java面试题大全2021版

    一.Java 基础 JDK 和 JRE 有什么区别? JDK:Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境和运行环境. JRE:Java Run ...

  5. 《Effective C#中文版:改善C#程序的50种方法》读书笔记

    一.用属性代替可访问的字段 1..NET数据绑定只支持数据绑定,使用属性可以获得数据绑定的好处: 2.在属性的get和set访问器重可使用lock添加多线程的支持. 二.readonly(运行时常量) ...

  6. 正则表达式测试工具 Regex Tester 的使用方法

    2019独角兽企业重金招聘Python工程师标准>>> 正则表达式测试工具"RegexTester",下载地址:http://www.oschina.net/p/ ...

  7. 破解.net程序 编译和反编译方法

    有好多.net程序有加密狗或者有验证,如果exe或dll没有做过特殊处理,破解.net程序其实很简单,不过你要有足够的耐心! 我只做个简单的小例子,给大家一个思路,吼吼~~~~ 1使用工具 Refle ...

  8. 去掉ILDasm的SuppressIldasmAttribute限制

    去掉ILDasm的SuppressIldasmAttribute限制 原文 去掉ILDasm的SuppressIldasmAttribute限制 今天本打算汉化一个.Net程序的,当用ILDasm打开 ...

  9. 优化C#程序的48种方法

    一.用属性代替可访问的字段 1..NET数据绑定只支持数据绑定,使用属性可以获得数据绑定的好处: 2.在属性的get和set访问器重可使用lock添加多线程的支持. 二.readonly(运行时常量) ...

  10. MSIL学习笔记(01):ilasm和ildasm

    我跟每个.NET程序员一样,MSIL多少都接触过一点,个别语句也能看明白,但是没有系统学习过 更没有写过IL代码 和 编译过 IL我觉得学习方法应该跟其他语言不同,因为这个语言根本上不是用来手写的,因 ...

最新文章

  1. 6个月为50篇AI论文写摘要,网友:这有啥,我曾被要求1.5小时内复现一篇论文...
  2. 高斯混合模型(GaussianMixture Model, GMM)聚类、可视化最优协方差形式、通过TSNE进行结果可视化分析、抽取核心特征因子
  3. 读书笔记:《搞定3--平衡工作和生活的艺术》
  4. [密码学] DES(一)
  5. python flask上传文件_Python-Flask-文件上传
  6. 各种常用排序算法的时间复杂度和空间复杂度
  7. 塔设备设计手册_强烈推荐必备资料—化工设备设计手册 (上、下卷全)
  8. 宿舍管理系统简单的增删改查
  9. 加密的PDF文件如何解密?教你使用手机就能解密的方法
  10. 【动态规划 记忆化搜索】JZOJ_6287 扭动的树
  11. PR模板 有趣的波普艺术网络自媒体宣传PR视频模板
  12. 推荐电影 迪士尼经典动画片大全 1937-2008
  13. 浙江中医药大学第十二届大学生程序设计竞赛 部分题解
  14. Midjourney用户手册中文版详解模型、命令、参数与高级用法
  15. 微服务架构的简单实现-Stardust
  16. 认知科学和认知神经科学_设计师认知科学阅读清单
  17. lm曲线公式推导_宏观经济学 - LM曲线
  18. 手把手教你清理 windows C盘文件
  19. ASEMI快恢复二极管ES8JC参数,ES8JC规格,ES8JC封装
  20. FishHook钩子库开发日志

热门文章

  1. STM8L超低功耗程序编写教学,简单易懂
  2. 【WebGIS bug】WARNING: Too many active WebGL contexts. Oldest context will be lost.
  3. HPE Comware Lab - Simulator
  4. 手机版kali Linux教程(质量高)
  5. 一款桌面整理软件——Fences
  6. systen v消息队列(一)
  7. c++实现高斯滤波器
  8. 2019深圳杯获奖论文_我校研究生喜获2019年“深圳杯”数学建模挑战赛决赛三等奖...
  9. windows下C++内存碎片的测试
  10. 主键中的mappdeBy的使用方法