3/18/2009

MSIL 反組譯工具 (Ildasm.exe)

.NET Framework 工具
MSIL 反組譯工具 (Ildasm.exe)

MSIL 反組譯工具是 MSIL 組譯工具 (Ilasm.exe) 的附屬工具。Ildasm.exe 使用包含 Microsoft Intermediate Language (MSIL) 程式碼之可移植的執行檔 (PE),並建立可以做為 Ilasm.exe 之輸入檔的文字檔。


ildasm [options] [PEfilename] [options]
參數
下列選項可用於 .exe、.dll、.obj 和 .lib 檔。

選項 描述
/output= filename
建立具有指定 filename 的輸出檔,而非在圖形化使用者介面中顯示結果。

/rtf
以 Rich Text Format (.rtf 檔案) 產生輸出。使用 /text 選項時無效。

.NET Framework 2.0 版的新功能。

/text
顯示結果到主控台 (Console) 視窗,而非在圖形化使用者介面中顯示或做為輸出檔。

/html
以 HTML 格式產生輸出。僅使用 /output 選項時才有效。

.NET Framework 2.0 版的新功能。

/?
顯示工具的命令語法和選項。


下列額外的選項可用於 .exe 和 .dll 檔。

選項 描述
/bytes
以十六進位格式顯示實際位元組做為指令註解。

/caverbal
以動詞化格式產生自訂屬性 BLOB (二進位大型物件)。預設為二進位格式。

.NET Framework 2.0 版的新功能。

/linenum
包含原始程式行的參考。

/nobar
隱藏反組譯碼進度指示器快顯視窗 (Pop-Up Window)。

/noca
隱藏自訂屬性的輸出。

.NET Framework 2.0 版的新功能。

/pubonly
僅反組譯公用型別和成員。等同於 /visibility:PUB。

/quoteallnames
在單引號內包含所有的名稱。

/raweh
以未經處理格式顯示例外處理 (Exception Handling) 子句。

/source
顯示原始程式行做為註解。

/tokens
顯示類別和成員的中繼資料語彙基元 (Token)。

/visibility: vis [+vis ...]
以指定的可視性僅反組譯型別或成員。下列都是 vis 的有效值:

PUB — Public

PRI — Private

FAM — Family

ASM — Assembly

FAA — Family 和 Assembly

FOA — Family 或 Assembly

PSC — Private Scope

如需這些可視性修飾詞 (Modifier) 的定義,請參閱 MethodAttributes 和 TypeAttributes。


下列選項對 .exe 和 .dll 檔有效,僅適用於檔案或主控台輸出。

選項 描述
/all
指定 /header、/bytes、/stats、/classlist 和 /tokens 選項的組合。

注意事項
在 .NET Framework 1.0 和 1.1 版中,指定 /header、/bytes 和 /tokens 選項的組合。


/classlist
包括在模組中定義的類別清單。

.NET Framework 2.0 版的新功能。

/forward
使用 forward 類別宣告。

.NET Framework 2.0 版的新功能。

/header
在輸出中包含檔頭資訊。

/item: class[::method [(sig)]]
根據提供的引數反組譯下列項目:

反組譯指定的 class。

反組譯指定之 class 的 method。

以指定的簽名 sig 反組譯 class 的 method。以傳回型別 (Return Type) 以及所需的參數指定簽名。例如,returntype (param1, param2,..paramn)。

/noil
隱藏 MSIL 組譯碼輸出。

/stats
包括映像的統計資料。

.NET Framework 2.0 版的新功能。

/typelist
產生型別完整清單,以保留來回之間的型別順序。

.NET Framework 2.0 版的新功能。

/unicode
輸出使用 Unicode 編碼方式。

/utf8
輸出使用 UTF-8 編碼方式。ANSI 是預設值。


下列選項對 .exe、.dll、.obj 和 .lib 檔有效,僅適用於檔案或主控台輸出。

選項 描述
/metadata[=specifier]
顯示中繼資料 (Metadata),其中 specifier 是:

MDHEADER — 顯示中繼資料的標頭資訊和大小。

HEX — 使用十六進位和文字顯示資訊。

CSV — 顯示記錄計數和堆積大小。

UNREX — 顯示無法解析的外部符號。

SCHEMA — 顯示中繼資料的標頭和結構描述資訊。

RAW — 顯示原始中繼資料的表格。

HEAPS — 顯示原始的堆積。

VALIDATE — 驗證中繼資料的一致性。

您可以多次指定 /metadata,每次使用不同的 specifier 值。

.NET Framework 2.0 版的新功能。


下列選項只對適用於檔案或主控台輸出的 .lib 檔有效。

選項 描述
/objectfile=filename
在指定的程式庫中顯示單一物件檔案的中繼資料。

.NET Framework 2.0 版的新功能。


注意事項
所有 Ildasm.exe 的選項都不區分大小寫,並且是以前三個字母識別。例如,/quo 就相當於 /quoteallnames。指定引數的選項可以接受冒號 (:) 或等號 (=) 做為選項與引數之間的分隔符號。例如,/output:filename 等同於 /output=filename。


備註
Ildasm.exe 只在磁碟上的 PE 檔上作業。它無法在安裝於全域組件快取中的檔案上作業。

Ildasm.exe 所產生的文字檔可以被用來做為 MSIL 組譯工具 (Ilasm.exe) 的輸入。這非常有用,例如在不支援所有執行階段中繼資料屬性的程式語言中編譯程式碼時。在編譯程式碼並透過 Ildasm.exe 執行其輸出之後,可以手動編輯產生的 MSIL 文字檔來加入遺漏的屬性。然後可以透過 MSIL 組譯工具執行這個文字檔來產生最後的可執行檔。

注意事項
目前您無法將這項技術用於包含內嵌機器碼的 PE 檔 (例如,由 Visual C++ 所產生的 PE 檔)。


您可以使用 MSIL 反組譯工具中的預設 GUI,來檢視在階層式樹狀檢視中任何現有 PE 檔的中繼資料和反組譯碼。若要使用 GUI,請在命令列輸入 ildasm,但不提供 PEfilename 引數或任何選項。您可以從 [檔案] 功能表,巡覽至要載入到 Ildasm.exe 的 PE 檔。若要儲存為所選的 PE 所顯示的中繼資料和反組譯程式碼,請從 [檔案] 功能表中選取 [傾印] 命令。若只要儲存階層式樹狀檢視,請從 [檔案] 功能表中選取 [傾印樹狀檢視] 命令。如需載入檔案到 Ildasm.exe 和解譯輸出的詳細指引,請參閱<Ildasm.exe 教學課程>,位於與 .NET Framework SDK 一起推出的 Samples 資料夾中。

如果您提供 Ildasm.exe 和包含內嵌資源的 PEfilename 引數,這個工具就會產生多個輸出檔案:包含 MSIL 程式碼的文字檔,以及對每個內嵌的 Managed 資源,使用來自中繼資料 (Metadata) 的資源名稱所產生的 .resources 檔。如果 Unmanaged 資源是內嵌於 PEfilename,.res 檔是使用由 /output 選項輸出的 MSIL 的指定檔名所產生。

注意事項
Ildasm.exe 僅會顯示 .obj 和 .lib 輸入檔的中繼資料描述。這些檔案類型的 MSIL 程式碼是不被反組譯的。


您可以在 .exe 或 .dll 檔上執行 Ildasm.exe 來判斷這個檔案是否為 Managed。如果這個檔案不是 Managed,工具便會顯示訊息,說明這個檔案沒有有效的 Common Language Runtime 標頭而且無法反組譯。如果這個檔案是 Managed,工具就會順利執行。

範例
下列命令會使得 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 含有內嵌 Managed 和 Unmanaged 資源,則下列命令會產生四個檔案:MyApp.il、MyApp.res、Icons.resources, 和 Message.resources:

複製程式碼
ildasm MyApp.exe /output:MyApp.il下列命令會反組譯 MyFile.exe 中類別 MyClass 內的方法 MyMethod,並且將輸出顯示到主控台視窗。

複製程式碼
ildasm /item:MyClass::MyMethod MyFile.exe /text在上述範例中,可能有好幾個具有不同簽名碼的 MyMethod 方法。下列命令會以 void 和參數 int32 和 System.String 的傳回型別反組譯 MyMethod 方法。

複製程式碼
ildasm /item:"MyClass::MyMethod(void(int32,class System.String))" MyFile.exe /text 請參閱
參考
.NET Framework 工具
MSIL 組譯工具 (Ilasm.exe)
SDK 命令提示字元

概念
編譯為 MSIL