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

2010-08-28 10:49:44来源:西部e网作者:

MSIL 汇编程序 (Ilasm.exe)

MSIL 汇编程序从 MSIL 汇编语言生成可移植可执行的 (PE) 文件。可以运行结果可执行文件(该文件包含 MSIL 和所需的元数据)以确定 MSIL 是否按预期执行。

ilasm [options] filename [[options]filename...]
参数 说明
filename .il 源文件的名称。该文件包含元数据声明指令和符号化 MSIL 指令。可以提供多个源文件参数,以便用 Ilasm.exe 生成一个 PE 文件。
选项 说明
/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。
/? 显示此工具的命令语法和选项。
注意   Ilasm.exe 的所有选项都不区分大小写,并且根据前三个字母识别。例如,/lis 等效于 /listing/res:myresfile.res 等效于 /resource:myresfile.res。指定参数的选项接受用冒号 (:) 或等号 (=) 作为选项和参数之间的分隔符。例如,/output:file.ext 等效于 /output=file.ext

备注

MSIL 汇编程序有助于工具供应商设计和实现 MSIL 生成器。通过使用 Ilasm.exe,工具和编译器开发人员可以专注于生成 MSIL 和元数据,而无需考虑以 PE 文件格式发出 MSIL。

与面向运行库的其他编译器(如 C# 和 Visual Basic .NET)类似,Ilasm.exe 不产生中间对象文件,并且不需要链接阶段即可形成 PE 文件。

MSIL 汇编程序可以表达以运行库为目标的编程语言的所有现有元数据和 MSIL 功能。这使得用上面任何编程语言编写的托管代码都可以在 MSIL 汇编程序中充分表达并且可以用 Ilasm.exe 编译。

可以将 Ilasm.exe 同它的伙伴工具 Ildasm.exe 一起使用。Ildasm.exe 采用包含 MSIL 代码的 PE 文件并创建相应的文本文件作为 Ilasm.exe 的输入。这很有用,例如当编译用并非支持所有运行库元数据属性的编程语言编写的代码时。通过 Ildasm.exe 编译该代码并运行输出后,可以手动编辑结果 MSIL 文本文件以添加缺少的属性。然后可以通过 Ilasm.exe 运行此文本文件以生成最终的可执行文件。

也可以使用此方法从最初由不同的编译器生成的数个 PE 文件生成一个 PE 文件。

注意   目前,无法对包含嵌入的本机代码的 PE 文件(例如,由 Visual C++ .NET 生成的 PE 文件)使用此技术。

为使 Ildasm.exe 和 Ilasm.exe 的这种组合使用尽可能准确,此汇编程序不执行某些简单的优化,即不推断是使用短格式指令还是使用长格式指令。例如,此工具不会尝试确定它是否可以用短编码替换长编码,这些长编码可能是在 MSIL 源中编写的,也可能是由其他编译器发出的。如果需要短编码,则必须显式编写该格式。但是,此汇编程序在可能的情况下,还是会检查是否有超出范围的条件。

注意   Ildasm.exe 只对磁盘上的文件进行操作。它不对安装在全局程序集缓存中的文件进行操作。

示例

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

ilasm myTestFile

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

ilasm myTestFile /dll 

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

ilasm myTestFile /dll /output:myNewTestFile.dll

MSIL 反汇编程序 (Ildasm.exe)

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

ildasm [options] [PEfilename] [options]

下列选项可用于 .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
有关这些可见性修饰符的定义,请参见 MethodAttributes 枚举

下列选项仅对用于文件或控制台输出的 .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)。
注意   Ildasm.exe 的所有选项不区分大小写,并且由前三个字母识别。例如,/quo 等效于 /quoteallnames。指定参数的选项既可以用冒号 (:) 也可以用等号 (=) 作为选项和参数之间的分隔符。例如,/output:filename 等效于 /output=filename

备注

Ildasm.exe 只对磁盘上的 PE 文件进行操作。它不对安装在全局程序集缓存中的文件进行操作。

Ildasm.exe 生成的文本文件可以用作 MSIL 汇编程序 (Ilasm.exe) 的输入。这很有用,例如当编译用并非支持所有运行库元数据属性的编程语言编写的代码时。通过 Ildasm.exe 编译该代码并运行输出后,可以手动编辑结果 MSIL 文本文件以添加缺少的属性。然后可以通过 MSIL 汇编程序运行此文本文件以生成最终的可执行文件。

注意   目前,无法对包含嵌入的本机代码的 PE 文件(例如,由 Visual C++ .NET 生成的 PE 文件)使用此技术。

可以使用 MSIL 反汇编程序中的默认 GUI,在分层树视图中查看任何现有 PE 文件的元数据和反汇编代码。若要使用此 GUI,请在命令行中键入 ildasm,无需提供 PEfilename 参数或任何选项。从“文件”菜单中可以定位到希望加载到 Ildasm.exe 中的 PE 文件。若要保存为选定的 PE 显示的元数据和反汇编代码,请在“文件”菜单中选择“转储”命令。若要只保存分层树视图,请在“文件”中选择“转储树视图”命令。有关将文件加载到 Ildasm.exe 中和解释输出的详细指南,请参见 Ildasm.exe 教程,该教程位于 .NET Framework SDK 附带的 Samples 文件夹中。

如果用包含嵌入资源的 PEfilename 参数提供 Ildasm.exe,则此工具生成多个输出文件:一个包含 MSIL 代码的文本文件,而每个嵌入的托管资源都有一个用该资源在元数据中的名称生成的 .resources 文件。如果 PEfilename 中有嵌入的非托管资源,则用 /output 选项为 MSIL 输出指定的文件名生成 .res 文件。

注意   Ildasm.exe 只显示 .obj 和 .lib 输入文件的元数据说明。不反汇编这些文件类型的 MSIL 代码。

可以对 .exe 或 .dll 文件运行 Ildasm.exe 来确定该文件是否是托管的。如果该文件不是托管的,则此工具将显示一条信息,说明该文件不包含有效的公共语言运行库头,并且无法反汇编。如果该文件是托管的,则此工具将成功运行。

示例

下面的命令使 PE 文件 MyHello.exe 的元数据和反汇编代码显示在 Ildasm.exe 的默认 GUI 中。

ildasm myHello.exe

下面的命令对 MyFile.exe 文件进行反汇编,并将结果 MSIL 汇编程程序文本存储在 MyFile.il 文件中。

ildasm MyFile.exe /output:MyFile.il

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

ildasm MyFile.exe /text

如果文件 MyApp.exe 包含嵌入的托管和非托管资源,则下面的命令将产生以下 4 个文件:MyApp.ilMyApp.resIcons.resourcesMessage.resources

ildasm MyApp.exe /output:MyApp.il

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

ildasm /item:MyClass::MyMethod MyFile.exe /text

在上面的示例中,可能有几个具有不同签名的 MyMethod 方法。下面的命令对返回类型为 void 且带有参数 int32System.string MyMethod 方法进行反汇编。

ildasm /item:"MyClass::MyMethod(void(int32,class System.String))" MyFile.exe /text
原文在:http://msdn.microsoft.com/library/CHS/cptools/html/cpconmsildisassemblerildasmexe.asp

小提示:如果转载此文,请注明来源于西部e网(www.weste.net),谢谢!

关键词:dotnet

赞助商链接: