Ildasm.exe (IL Disassembler)
IL Disassembler je doprovodný nástroj k assembleru IL (Ilasm.exe). Ildasm.exe vezme přenosný spustitelný soubor (PE), který obsahuje kód IL (Intermediate Language) a vytvoří textový soubor vhodný jako vstup pro Ilasm.exe.
Tento nástroj je automaticky nainstalován se sadou Visual Studio. Ke spuštění nástroje použijte Visual Studio Developer Command Prompt nebo Visual Studio Developer PowerShell.
Na příkazovém řádku zadejte následující:
Syntaxe
ildasm [options] [PEfilename] [options]
Parametry
Pro soubory .exe, .dll, .obj, .lib a .winmd jsou k dispozici následující možnosti.
Možnost | Popis |
---|---|
/out= filename |
Vytvoří výstupní soubor se zadaným filename souborem místo zobrazení výsledků v grafickém uživatelském rozhraní. |
/rtf | Vytvoří výstup ve formátu RTF (Rich Text Format). Neplatné s možností /text . |
/Text | Zobrazí výsledky v okně konzoly namísto grafického uživatelského rozhraní nebo výstupního souboru. |
/html | Vytvoří výstup ve formátu HTML. Platné pouze s možností /output . |
/? | Zobrazí syntaxi příkazu a možnosti nástroje. |
Pro soubory .exe, .dll a .winmd jsou k dispozici následující další možnosti.
Možnost | Popis |
---|---|
/byty | Zobrazí skutečné bajty v šestnáctkovém formátu jako komentáře k instrukcím. |
/caverbal | Vytvoří objekty blob vlastních atributů ve slovním vyjádření. Výchozím nastavením je binární vyjádření. |
/linenum | Zahrne odkazy do původních zdrojových řádků. |
/nobar | Potlačí místní okno indikátoru průběhu zpětného překladu. |
/noca | Potlačí výstup vlastních atributů. |
/projekt | Zobrazuje metadata, jak se zdá spravovaný kód, a ne tak, jak se zobrazuje v nativním prostředí Windows Runtime. Pokud PEfilename není soubor metadat windows (.winmd), tato možnost nemá žádný vliv. Viz podpora rozhraní .NET Framework pro aplikace pro Windows Store a prostředí Windows Runtime. |
/pubonly | Zpětně přeloží pouze veřejné typy a členy. Ekvivalent / visibility:PUB. |
/quoteallnames | Vloží všechny názvy do jednoduchých uvozovek. |
/raweh | Zobrazí klauzule zpracování výjimek v nezpracovaném tvaru. |
/zdroj | Zobrazí původní zdrojové řádky jako komentáře. |
/odznaky | Zobrazí tokeny metadat pro třídy a členy. |
/visibility: vis [+vis ...] |
Zpětně přeloží pouze typy nebo členy se zadanou viditelností. Následující hodnoty jsou platné pro vis :PUB — Veřejné PRI – soukromé FAM – Rodina ASM – sestavení FAA – Rodina a sestavení FOA – rodina nebo sestavení PSC – privátní obor Definice těchto modifikátorů viditelnosti naleznete MethodAttributes a TypeAttributes. |
Následující možnosti jsou platné pouze pro soubory .exe, .dll a .winmd pro výstup souboru nebo konzoly.
Možnost | Popis |
---|---|
/všichni | Určuje kombinaci možností /header, /bytes, /stats, /classlist a /tokens . |
/classlist | Zahrne seznam tříd definovaných v modulu. |
/vpřed | Použije dopřednou deklaraci tříd. |
/hlavičky | Zahrne do výstupu informace z hlavičky souboru. |
/item: class [:: member [(sig ]] |
V závislosti na zadaných argumentech zpětně přeloží následující: - Rozebere zadaný class .- Rozebere zadaný parametr member class .- Rozebere member s class určeným podpisem sig . Formát sig je následující:[ instance ] returnType (parameterType1 , , parameterType2 ..., parameterTypeN )Poznámka: V rozhraní .NET Framework verze 1.0 a 1.1 sig musí následovat pravá závorka: (sig) . Počínaje rozhraním Net Framework 2.0 je nutné vynechat pravou závorku: (sig . |
/noil | Potlačí výstup kódu sestavení jazyka IL. |
/statistické údaje | Vloží statistiky o bitové kopii. |
/typelist | Vytvoří úplný seznam typů pro zachování řazení typů při přenosu. |
/unicode | Použije pro výstup kódování Unicode. |
/utf8 | Použije pro výstup kódování UTF-8. Výchozím je ANSI. |
Následující možnosti jsou platné jenom pro soubory .exe, .dll, .obj, .lib a .winmd .
Možnost | Popis |
---|---|
/metadata[=specifier ] |
Zobrazuje metadata, kde specifier je:MDHEADER – Zobrazí informace a velikosti záhlaví metadat. HEX – zobrazit informace v šestnáctkovém i slově. CSV – Zobrazí počty záznamů a velikosti haldy. UNREX – Zobrazení nevyřešených externích objektů SCHÉMA – Umožňuje zobrazit hlavičku metadat a informace o schématu. RAW – Zobrazí nezpracované tabulky metadat. HEAPS - Ukaž nezpracované haldy. VALIDATE – Ověřte konzistenci metadat. Parametr /metadata můžete zadat vícekrát s různými hodnotami pro specifier . |
Následující možnosti jsou platné pouze pro soubory .lib pro soubor nebo výstup konzoly.
Možnost | Popis |
---|---|
/objectfile=filename |
Zobrazí metadata souboru jednoho objektu v zadané knihovně. |
Poznámka:
Všechny možnosti Ildasm.exe nerozlišují malá a velká písmena a rozpoznávají první tři písmena. Například /quo je ekvivalentní /quoteallnames. Možnosti s argumenty přijímají jako oddělovač mezi možností a argumentem dvojtečku (:) nebo symbol rovná se (=). Například /output: název souboru je ekvivalentní souboru /output= název souboru.
Poznámky
Ildasm.exe funguje jenom se soubory PE na disku. Nepracuje se soubory nainstalovanými do globální mezipaměti sestavení.
Textový soubor vytvořený Ildasm.exe lze použít jako vstup do assembleru IL (Ilasm.exe). Toho lze využít například při kompilování kódu v programovacím jazyce, který nepodporuje všechny atributy modulu runtime. Po kompilaci kódu a spuštění výstupu prostřednictvím Ildasm.exe můžete výsledný textový soubor IL ručně upravit a přidat chybějící atributy. Poté lze tento textový soubor zpracovat nástrojem IL Assembler a vytvořit konečný spustitelný soubor.
Poznámka:
Momentálně nelze tuto techniku použít se soubory PE obsahujícími vložený nativní kód (například PE soubory vytvořené jazykem Visual C++).
Chcete-li zobrazit metadata a zpětně přeložený kód libovolného existujícího souboru PE v hierarchickém stromovém zobrazení, lze použít výchozí grafické uživatelské rozhraní nástroje IL Disassembler. Pokud chcete použít grafické uživatelské rozhraní, zadejte na příkazovém řádku ildasm bez zadání argumentu PEfilename nebo jakýchkoli možností. V nabídce Soubor můžete přejít do souboru PE, který chcete načíst do Ildasm.exe. Chcete-li uložit metadata a rozebrat kód zobrazený pro vybrané prostředí PE, vyberte příkaz Výpis paměti z nabídky Soubor . Chcete-li uložit pouze hierarchické stromové zobrazení, vyberte příkaz Dump Treeview z nabídky Soubor . Podrobný průvodce načtením souboru do Ildasm.exe a interpretací výstupu najdete v kurzu Ildasm.exe , který se nachází ve složce Samples, která je součástí sady Windows SDK.
Pokud zadáte Ildasm.exe s argumentem PEfilename , který obsahuje vložené prostředky, nástroj vytvoří více výstupních souborů: textový soubor obsahující kód IL a pro každý vložený spravovaný prostředek soubor .resources vytvořený pomocí názvu prostředku z metadat. Pokud je nespravovaný prostředek vložen do souboru PEfilename, vytvoří se soubor .res pomocí názvu souboru určeného pro výstup IL pomocí možnosti /output .
Poznámka:
Ildasm.exe zobrazuje pouze popisy metadat pro vstupní soubory .obj a .lib. Kód IL není pro tyto typy souborů zpětně překládán.
Můžete spustit Ildasm.exe přes an.exe nebo .dll soubor a určit, jestli je soubor spravovaný. Není-li soubor spravovaný, nástroj zobrazí zprávu oznamující, že soubor neobsahuje žádnou platnou hlavičku modulu CLR a nelze jej zpětně přeložit. Pokud soubor spravovaný je, nástroj se úspěšně spustí.
Informace o verzi
Počínaje rozhraním .NET Framework 4.5 Ildasm.exe zpracovává nerozpoznaný objekt BLOB zařazování (binární velký objekt) zobrazením nezpracovaného binárního obsahu. Následující kód například ukazuje, jak je zobrazen zařazovací objekt BLOB vygenerovaný programem jazyka C#:
public void Test([MarshalAs((short)70)] int test) { }
// IL from Ildasm.exe output
.method public hidebysig instance void Test(int32 marshal({ 46 }) test) cil managed
Počínaje rozhraním .NET Framework 4.5 Ildasm.exe zobrazí atributy použité pro implementace rozhraní, jak je znázorněno v následujícím výňatku z Ildasm.exe výstupu:
.class public auto ansi beforefieldinit MyClass
extends [mscorlib]System.Object
implements IMyInterface
{
.interfaceimpl type IMyInterface
.custom instance void
[mscorlib]System.Diagnostics.DebuggerNonUserCodeAttribute::.ctor() = ( 01 00 00 00 )
…
Příklady
Následující příkaz způsobí, že se metadata a rozložený kód souboru MyHello.exe
PE zobrazí v Ildasm.exe výchozím grafickém uživatelském rozhraní.
ildasm myHello.exe
Následující příkaz soubor rozebere MyFile.exe
a uloží výsledný text IL Assembler do souboru MyFile.il.
ildasm MyFile.exe /output:MyFile.il
Následující příkaz soubor MyFile.exe
rozebere a zobrazí výsledný text jazyka IL Assembler do okna konzoly.
ildasm MyFile.exe /text
Pokud soubor MyApp.exe
obsahuje vložené spravované a nespravované prostředky, vytvoří následující příkaz čtyři soubory: MyApp.il, MyApp.res, Icons.resources a Message.resources:
ildasm MyApp.exe /output:MyApp.il
Následující příkaz rozebere metodu MyMethod
v rámci třídy MyClass
MyFile.exe
a zobrazí výstup do okna konzoly.
ildasm /item:MyClass::MyMethod MyFile.exe /text
V předchozím příkladu může existovat několik metod pojmenovaných MyMethod
s různými podpisy. Následující příkaz rozebere metodu MyMethod
instance s návratovým typem void a typy parametrů int32 a string.
ildasm /item:"MyClass::MyMethod(instance void(int32,string)" MyFile.exe /text
Poznámka:
V rozhraní .NET Framework verze 1.0 a 1.1 musí levá závorka, která následuje za názvem metody, vyvážena pravou závorkou za podpisem: MyMethod(instance void(int32))
. Počínaje rozhraním .NET Framework 2.0 je nutné vynechat pravou závorku: MyMethod(instance void(int32)
.
Chcete-li načíst metodu static
(Shared
metoda v jazyce Visual Basic), vynecháte klíčové slovo instance
. Typy tříd, které nejsou primitivními typy jako int32
a string
musí obsahovat obor názvů a musí předcházet klíčové slovo class
. Před externími typy musí být uveden název knihovny v hranatých závorkách. Následující příkaz rozebere statickou metodu s názvem MyMethod
, která má jeden parametr typu AppDomain a má návratový AppDomaintyp .
ildasm /item:"MyClass::MyMethod(class [mscorlib]System.AppDomain(class [mscorlib]System.AppDomain)" MyFile.exe /text
Před vnořeným typem musí být uvedena třída, která jej obsahuje, oddělená lomítkem. Pokud například MyNamespace.MyClass
třída obsahuje vnořenou třídu s názvem NestedClass
, vnořená třída je identifikována takto: class MyNamespace.MyClass/NestedClass
.