Есть две утилиты, которые заменяют ассемблер и дизассемблер. Первая утилита имеет имя ILasm.exe, она формирует EXE файл на основе языка MSIL. И есть вторая утилита с именем ildasm.exe, которая переводит из EXE в язык MSIL. Ну давайте посмотрим, как этот ассемблер выглядит. Итак, давайте напишем BAT файл, который проведет дизассемблирование нашего примера из 1 шага.
Ildasm.exe 1.exe /output:1.il
Запустим его и посмотрим, что там внутри:
// Microsoft (R) .NET Framework IL Disassembler. Version 1.0.2914.16 // Copyright (C) Microsoft Corp. 1998-2001. All rights reserved. // VTableFixup Directory: // No data. .assembly extern mscorlib { .publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4.. .ver 1:0:2411:0 } .assembly '1' { // --- The following custom attribute is added automatically, do not uncomment ------- // .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(bool, // bool) = ( 01 00 00 01 00 00 ) .hash algorithm 0x00008004 .ver 0:0:0:0 } .module '1.exe' // MVID: {7FC658C1-CFED-4A2F-AE42-8AA970A29D5D} .imagebase 0x00400000 .subsystem 0x00000003 .file alignment 512 .corflags 0x00000001 // Image base: 0x03000000 .class private auto ansi beforefieldinit MainApp extends [mscorlib]System.Object { .method public hidebysig static void Main() cil managed { .entrypoint // Code size 11 (0xb) .maxstack 8 IL_0000: ldstr "Hello World using C#!" IL_0005: call void [mscorlib]System.Console::WriteLine(string) IL_000a: ret } // end of method MainApp::Main .method public hidebysig specialname rtspecialname instance void .ctor() cil managed { // Code size 7 (0x7) .maxstack 8 IL_0000: ldarg.0 IL_0001: call instance void [mscorlib]System.Object::.ctor() IL_0006: ret } // end of method MainApp::.ctor } // end of class MainApp //*********** DISASSEMBLY COMPLETE *********************** // WARNING: Created Win32 resource file 1.res
Нда, новый ассемблер. Ну и обратную операцию. Нужно собрать из il обычный EXE. Пишем bat файл. Все получается.