MSIL反匯編程序(Ildasm.exe)和MSIL匯編程序(Ilasm.exe)

2010-08-28 10:49:44來源:西部e網(wǎng)作者:

MSIL 匯編程序 (Ilasm.exe)

MSIL 匯編程序從 MSIL 匯編語言生成可移植可執(zhí)行的 (PE) 文件?梢赃\行結(jié)果可執(zhí)行文件(該文件包含 MSIL 和所需的元數(shù)據(jù))以確定 MSIL 是否按預(yù)期執(zhí)行。

ilasm [options] filename [[options]filename...]
參數(shù) 說明
filename .il 源文件的名稱。該文件包含元數(shù)據(jù)聲明指令和符號化 MSIL 指令?梢蕴峁┒鄠源文件參數(shù),以便用 Ilasm.exe 生成一個 PE 文件。
選項 說明
/alignment=integer 將 FileAlignment 設(shè)置為由 NT Optional 標(biāo)題中的 integer 指定的值。如果在文件中指定了 .alignment IL 指令,則此選項將重寫它。
/base=integer 將 ImageBase 設(shè)置為由 NT Optional 標(biāo)題中的 integer 指定的值。如果在文件指定了 .imagebase IL 指令,則此選項將重寫它。
/clock 為指定的 .il 源文件測量并報告下列編譯時間(以毫秒為單位):
總運行時間
執(zhí)行后面的所有特定操作所花費的總時間。
啟動
加載并打開文件。

分析

發(fā)出 MD
發(fā)出元數(shù)據(jù)。
定義引用解析
解析對文件中的定義的引用。

修正和鏈接

CEE 文件生成
在內(nèi)存中生成文件映像。
PE 文件寫入
將映像寫入 PE 文件。
/debug 包括調(diào)試信息(局部變量名和參數(shù)名以及行號)。
/dll 生成 .dll 文件作為輸出。
/exe 生成可執(zhí)行文件作為輸出。這是默認(rèn)值。
/flags=integer 將 ImageFlags 設(shè)置為由公共語言運行庫標(biāo)題中的 integer 指定的值。如果在文件中指定了 .corflags IL 指令,則此選項將重寫它。有關(guān) integer 的有效值的列表,請參見 CorHdr.h 中的 COMIMAGE_FLAGS。
/key:keyFile 使用 keyFile 中包含的私鑰編譯具有強簽名的 filename。
/key:@keySource 使用在 keySource 中生成的私鑰編譯具有強簽名的 filename
/listing 在標(biāo)準(zhǔn)輸出上生成列表文件。如果省略此選項,則不生成列表文件。
/nologo 取消顯示 Microsoft 啟動標(biāo)題。
/output:file.ext 指定輸出文件名和擴展名。默認(rèn)情況下,輸出文件名與第一個源文件名相同。默認(rèn)擴展名為 .exe。如果指定 /dll 選項,則默認(rèn)擴展名為 .dll。
注意   指定 /output:myfile.dll 并不會設(shè)置 /dll 選項。如果不指定 /dll,則會生成名為 myfile.dll 的可執(zhí)行文件。
/quiet 指定安靜模式;不報告程序集進度。
/resource:file.res 在生成的 .exe 或 .dll 文件中包括 *.res 格式的指定資源文件。使用 /resource 選項只能指定一個 .res 文件。
/subsystem=integer 將 subsystem 設(shè)置為由 NT Optional 標(biāo)題中的 integer 指定的值。如果在文件中指定了 .subsystem IL 指令,則此命令將重寫它。有關(guān) integer 的有效值的列表,請參見 winnt.h 中的 IMAGE_SUBSYSTEM。
/? 顯示此工具的命令語法和選項。
注意   Ilasm.exe 的所有選項都不區(qū)分大小寫,并且根據(jù)前三個字母識別。例如,/lis 等效于 /listing/res:myresfile.res 等效于 /resource:myresfile.res。指定參數(shù)的選項接受用冒號 (:) 或等號 (=) 作為選項和參數(shù)之間的分隔符。例如,/output:file.ext 等效于 /output=file.ext。

備注

MSIL 匯編程序有助于工具供應(yīng)商設(shè)計和實現(xiàn) MSIL 生成器。通過使用 Ilasm.exe,工具和編譯器開發(fā)人員可以專注于生成 MSIL 和元數(shù)據(jù),而無需考慮以 PE 文件格式發(fā)出 MSIL。

與面向運行庫的其他編譯器(如 C# 和 Visual Basic .NET)類似,Ilasm.exe 不產(chǎn)生中間對象文件,并且不需要鏈接階段即可形成 PE 文件。

MSIL 匯編程序可以表達以運行庫為目標(biāo)的編程語言的所有現(xiàn)有元數(shù)據(jù)和 MSIL 功能。這使得用上面任何編程語言編寫的托管代碼都可以在 MSIL 匯編程序中充分表達并且可以用 Ilasm.exe 編譯。

可以將 Ilasm.exe 同它的伙伴工具 Ildasm.exe 一起使用。Ildasm.exe 采用包含 MSIL 代碼的 PE 文件并創(chuàng)建相應(yīng)的文本文件作為 Ilasm.exe 的輸入。這很有用,例如當(dāng)編譯用并非支持所有運行庫元數(shù)據(jù)屬性的編程語言編寫的代碼時。通過 Ildasm.exe 編譯該代碼并運行輸出后,可以手動編輯結(jié)果 MSIL 文本文件以添加缺少的屬性。然后可以通過 Ilasm.exe 運行此文本文件以生成最終的可執(zhí)行文件。

也可以使用此方法從最初由不同的編譯器生成的數(shù)個 PE 文件生成一個 PE 文件。

注意   目前,無法對包含嵌入的本機代碼的 PE 文件(例如,由 Visual C++ .NET 生成的 PE 文件)使用此技術(shù)。

為使 Ildasm.exe 和 Ilasm.exe 的這種組合使用盡可能準(zhǔn)確,此匯編程序不執(zhí)行某些簡單的優(yōu)化,即不推斷是使用短格式指令還是使用長格式指令。例如,此工具不會嘗試確定它是否可以用短編碼替換長編碼,這些長編碼可能是在 MSIL 源中編寫的,也可能是由其他編譯器發(fā)出的。如果需要短編碼,則必須顯式編寫該格式。但是,此匯編程序在可能的情況下,還是會檢查是否有超出范圍的條件。

注意   Ildasm.exe 只對磁盤上的文件進行操作。它不對安裝在全局程序集緩存中的文件進行操作。

示例

下面的命令對 MSIL 文件 myTestFile.il 進行匯編并產(chǎn)生可執(zhí)行文件 myTestFile.exe

ilasm myTestFile

下面的命令對 MSIL 文件 myTestFile.il 進行匯編并產(chǎn)生 .dll 文件 myTestFile.dll。

ilasm myTestFile /dll 

下面的命令對 MSIL 文件 myTestFile.il 進行匯編并產(chǎn)生 .dll 文件 myNewTestFile.dll。

ilasm myTestFile /dll /output:myNewTestFile.dll

MSIL 反匯編程序 (Ildasm.exe)

MSIL 反匯編程序是 MSIL 匯編程序 (Ilasm.exe) 的伙伴工具。Ildasm.exe 采用包含 Microsoft 中間語言 (MSIL) 代碼的可移植可執(zhí)行 (PE) 文件,并創(chuàng)建相應(yīng)的文本文件作為 Ilasm.exe 的輸入。

ildasm [options] [PEfilename] [options]

下列選項可用于 .exe、.dll、.obj 和 .lib 文件。

選項 說明
/output:filename 創(chuàng)建具有指定 filename 的輸出文件,而不是在對話框中顯示結(jié)果。
/text 將結(jié)果顯示到控制臺窗口,而不是顯示在對話框中或顯示為輸出文件。
/? 顯示此工具的命令語法和選項。

下列附加選項可用于 .exe 和 .dll 文件。

選項 說明
/bytes 以十六進制格式顯示作為指令注釋的實際字節(jié)。
/linenum 包含對原始源行的引用。
/nobar 取消反匯編進度指示器彈出窗口的顯示。
/pubonly 只反匯編公共類型和公共成員。等效于 /visibility:PUB。
/quoteallnames 在單引號中包含所有名稱。
/raweh 以原始格式顯示異常處理子句。
/source 顯示作為注釋的原始源行。
/tokens 顯示類和成員的元數(shù)據(jù)標(biāo)記。
/visibility:vis [+vis ...] 只反匯編具有指定可見性的類型或成員。以下是 vis 的有效值。
PUB
Public
PRI
Private
FAM
Family
ASM
Assembly
FAA
Family 和 Assembly
FOA
Family 或 Assembly
PSC
Private Scope
有關(guān)這些可見性修飾符的定義,請參見 MethodAttributes 枚舉

下列選項僅對用于文件或控制臺輸出的 .exe 和 .dll 文件有效。

選項 說明
/all 指定 /header/bytes/tokens 選項的組合。
/header 在輸出中包含文件頭信息。
/noil 取消 MSIL 程序集代碼輸出。
/unicode 對輸出使用 Unicode 編碼。
/utf8 對輸出使用 UTF-8 編碼。默認(rèn)值是 ANSI。

下列選項僅對用于文件或控制臺輸出的 .exe、.dll、.obj 和 .lib 文件有效。

選項 說明
/item:class[::method [(sig)]] 根據(jù)所提供的參數(shù)反匯編下列內(nèi)容:
  • 反匯編指定的 class。
  • 反匯編 class 的指定 method。
  • 反匯編具有指定簽名 sigclassmethod。指定具有返回類型的簽名和所需的任意多個參數(shù)。例如,returntype (param1, param2,..paramn)。
注意   Ildasm.exe 的所有選項不區(qū)分大小寫,并且由前三個字母識別。例如,/quo 等效于 /quoteallnames。指定參數(shù)的選項既可以用冒號 (:) 也可以用等號 (=) 作為選項和參數(shù)之間的分隔符。例如,/output:filename 等效于 /output=filename。

備注

Ildasm.exe 只對磁盤上的 PE 文件進行操作。它不對安裝在全局程序集緩存中的文件進行操作。

Ildasm.exe 生成的文本文件可以用作 MSIL 匯編程序 (Ilasm.exe) 的輸入。這很有用,例如當(dāng)編譯用并非支持所有運行庫元數(shù)據(jù)屬性的編程語言編寫的代碼時。通過 Ildasm.exe 編譯該代碼并運行輸出后,可以手動編輯結(jié)果 MSIL 文本文件以添加缺少的屬性。然后可以通過 MSIL 匯編程序運行此文本文件以生成最終的可執(zhí)行文件。

注意   目前,無法對包含嵌入的本機代碼的 PE 文件(例如,由 Visual C++ .NET 生成的 PE 文件)使用此技術(shù)。

可以使用 MSIL 反匯編程序中的默認(rèn) GUI,在分層樹視圖中查看任何現(xiàn)有 PE 文件的元數(shù)據(jù)和反匯編代碼。若要使用此 GUI,請在命令行中鍵入 ildasm,無需提供 PEfilename 參數(shù)或任何選項。從“文件”菜單中可以定位到希望加載到 Ildasm.exe 中的 PE 文件。若要保存為選定的 PE 顯示的元數(shù)據(jù)和反匯編代碼,請在“文件”菜單中選擇“轉(zhuǎn)儲”命令。若要只保存分層樹視圖,請在“文件”中選擇“轉(zhuǎn)儲樹視圖”命令。有關(guān)將文件加載到 Ildasm.exe 中和解釋輸出的詳細指南,請參見 Ildasm.exe 教程,該教程位于 .NET Framework SDK 附帶的 Samples 文件夾中。

如果用包含嵌入資源的 PEfilename 參數(shù)提供 Ildasm.exe,則此工具生成多個輸出文件:一個包含 MSIL 代碼的文本文件,而每個嵌入的托管資源都有一個用該資源在元數(shù)據(jù)中的名稱生成的 .resources 文件。如果 PEfilename 中有嵌入的非托管資源,則用 /output 選項為 MSIL 輸出指定的文件名生成 .res 文件。

注意   Ildasm.exe 只顯示 .obj 和 .lib 輸入文件的元數(shù)據(jù)說明。不反匯編這些文件類型的 MSIL 代碼。

可以對 .exe 或 .dll 文件運行 Ildasm.exe 來確定該文件是否是托管的。如果該文件不是托管的,則此工具將顯示一條信息,說明該文件不包含有效的公共語言運行庫頭,并且無法反匯編。如果該文件是托管的,則此工具將成功運行。

示例

下面的命令使 PE 文件 MyHello.exe 的元數(shù)據(jù)和反匯編代碼顯示在 Ildasm.exe 的默認(rèn) GUI 中。

ildasm myHello.exe

下面的命令對 MyFile.exe 文件進行反匯編,并將結(jié)果 MSIL 匯編程程序文本存儲在 MyFile.il 文件中。

ildasm MyFile.exe /output:MyFile.il

下面的命令對 MyFile.exe 文件進行反匯編,并將結(jié)果 MSIL 匯編程序文本顯示到控制臺窗口中。

ildasm MyFile.exe /text

如果文件 MyApp.exe 包含嵌入的托管和非托管資源,則下面的命令將產(chǎn)生以下 4 個文件:MyApp.ilMyApp.res、Icons.resourcesMessage.resources

ildasm MyApp.exe /output:MyApp.il

下面的命令對 MyFile.exeMyClass 類中的 MyMethod 方法進行反匯編,并將輸出顯示到控制臺窗口中。

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

在上面的示例中,可能有幾個具有不同簽名的 MyMethod 方法。下面的命令對返回類型為 void 且?guī)в袇?shù) 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

小提示:如果轉(zhuǎn)載此文,請注明來源于西部e網(wǎng)(virtualinteriordefine.com),謝謝!

關(guān)鍵詞:dotnet

贊助商鏈接: