Поделиться через


Ildasm.exe (дизассемблер IL)

Дизассемблер IL является сопутствующим инструментом ассемблера IL (Ilasm.exe). Ildasm.exe принимает переносимый исполняемый файл (PE-файл), содержащий код на промежуточном языке (IL), и создает на его основе текстовый файл, который может служить входным файлом для Ilasm.exe.

Эта программа автоматически устанавливается вместе с Visual Studio. Для запуска этого средства используйте Командную строку разработчика или PowerShell для разработчиков в Visual Studio.

Введите в командной строке: .

Синтаксис

ildasm [options] [PEfilename] [options]

Параметры

Перечисленные ниже параметры допустимы для файлов EXE, DLL, OBJ, LIB и WINMD.

Вариант Описание
/out= filename Создает выходной файл с заданным параметром filename вместо вывода результатов в графический пользовательский интерфейс.
/rtf Выводит данные в формате RTF. Не может использоваться с параметром /text.
/text Отображает результаты в окне консоли вместо вывода в графический пользовательский интерфейс или выходной файл.
/html Выводит данные в формате HTML. Может использоваться только с параметром /output.
/? Отображает синтаксис команд и параметров для средства.

Перечисленные ниже дополнительные параметры допустимы для файлов EXE, DLL и WINMD.

Вариант Описание
/bytes Отображает фактические байты в шестнадцатеричном формате в виде комментариев к инструкциям.
/caverbal Создает большие двоичные объекты настраиваемых атрибутов в текстовом виде. По умолчанию задана двоичная форма.
/linenum Включает ссылки на строки исходного файла.
/nobar Подавляет вывод всплывающего окна с индикатором хода выполнения дизассемблирования.
/noca Подавляет вывод настраиваемых атрибутов.
/project Отображает метаданные в представлении для управляемого кода, а не так, как их представляет среда выполнения Windows в машинном коде. Если параметр PEfilename не является файлом метаданных Windows (WINMD-файлом), этот параметр не учитывается. См. раздел Поддержка приложений для Магазина Windows и среды выполнения Windows в .NET Framework.
/pubonly Дизассемблирует только открытые типы и члены. Эквивалентен /visibility:PUB.
/quoteallnames Заключает все имена в одинарные кавычки.
/raweh Отображает предложения обработки исключений в исходном виде.
/source Отображает строки исходного кода в виде комментариев.
/tokens Отображает токены метаданных классов и членов.
/visibility: vis[+vis...] Дизассемблирует только типы и члены с заданной областью видимости. Допустимы следующие значения аргумента vis:

PUB — открытый;

PRI — закрытый;

FAM — семейство;

ASM — сборка;

FAA — семейство и сборка;

FOA — семейство или сборка;

PSC — закрытая область.

Определения модификаторов видимости см. в описании MethodAttributes и TypeAttributes.

Перечисленные ниже параметры допустимы для файлов EXE, DLL и WINMD только при выводе в файл или окно консоли.

Вариант Описание
/all Задает сочетание параметров /header, /bytes, /stats, /classlist и /tokens.
/classlist Включает список классов, определенных в этом модуле.
/forward Использует прямое объявление класса.
/headers Включает сведения заголовка файла в выходные данные.
/item: class[:: member[(sig]] В зависимости от заданных аргументов выполняет дизассемблирование:

дизассемблируется указанный class;
дизассемблируется указанный член member этого класса class;
дизассемблируется член member класса class с указанной сигнатурой sig. Формат sig выглядит следующим образом:
[instance] returnType(parameterType1, parameterType2..., ..., parameterTypeN)
Примечание. В .NET Framework версий 1.0 и 1.1 за атрибутом sig должна следовать закрывающая скобка: (sig). В .NET Framework 2.0 и последующих версиях закрывающая скобка должна быть опущена: (sig.
/noil Подавляет вывод кода сборки IL.
/stats Включает статистику по образу.
/typelist Создает полный список типов, чтобы сохранить упорядочение типов в круговом пути.
/unicode Использует для выходных данных кодировку Юникод.
/utf8 Использует для выходных данных кодировку UTF-8. ANSI является значением по умолчанию.

Перечисленные ниже параметры допустимы для файлов EXE, DLL, OBJ, LIB и WINMD только при выводе в файл или окно консоли.

Вариант Описание
/metadata[=specifier] Отображает метаданные, при этом параметр specifier может принимать следующие значения:

MDHEADER — показывать сведения и размеры заголовка метаданных;

HEX — показывать сведения в шестнадцатеричном и текстовом формате;

CSV — показывать количество записей и размеры кучи;

UNREX — показывать неразрешенные внешние элементы;

SCHEMA — показывать сведения о заголовке и схеме метаданных;

RAW — показывать необработанные таблицы метаданных;

HEAPS — показывать необработанные кучи;

VALIDATE — проверять согласованность метаданных.

Параметр /metadata можно задать несколько раз с различными значениями аргумента specifier.

Перечисленные ниже параметры допустимы для LIB-файлов только при выводе в файл или окно консоли.

Вариант Описание
/objectfile=filename Вывод метаданных отдельного объектного файла из заданной библиотеки.

Примечание.

Параметры программы Ildasm.exe не учитывают регистр и распознаются по первым трем буквам. Например, команда /quo эквивалентна команде /quoteallnames. Разделителем параметра и его аргумента может служить двоеточие (:) или знак равенства (=). Например, команда /output: имя_файла эквивалентна команде /output= имя_файла.

Замечания

Программа Ildasm.exe работает только с PE-файлами, расположенными на жестком диске. Программа не обрабатывает файлы, установленные в глобальном кэше сборок.

Текстовый файл, созданный программой Ildasm.exe, можно передавать в качестве входных данных в ассемблер IL (Ilasm.exe). Это полезно, к примеру, при компиляции кода на языке программирования, не поддерживающем все атрибуты метаданных среды выполнения. После компиляции кода и обработки результатов с помощью Ildasm.exe можно вручную добавить недостающие атрибуты в полученный текстовый файл IL. Чтобы создать окончательный исполняемый файл, следует обработать этот текстовый файл ассемблером IL.

Примечание.

На данный момент такая технология не применяется к PE-файлам, содержащим встроенный машинный код (например, к PE-файлам, созданным компилятором Microsoft Visual C++).

Для просмотра метаданных и дизассемблированного кода PE-файлов в иерархическом представлении в виде дерева применяется графический пользовательский интерфейс по умолчанию дизассемблера IL. Чтобы запустить графический пользовательский интерфейс, введите в командной строке команду ildasm без аргумента имя_PE-файла и без параметров. В меню Файл можно перейти к PE-файлу, который требуется загрузить в программу Ildasm.exe. Чтобы сохранить метаданные и дизассемблированный код, отображаемый для выбранного PE-файла, выберите в меню Файл команду Дамп. Чтобы сохранить только иерархическое представление в виде дерева, выберите в меню Файл команду Дерево дампа. Дополнительные инструкции по загрузке файла в программу Ildasm.exe и интерпретации выходных данных см. в руководстве по Ildasm.exe, которое находится в папке Samples в Windows SDK.

Если программе Ildasm.exe задан аргумент имя_PE-файла, содержащий внедренные ресурсы, будет создано несколько выходных файлов: текстовый файл с IL-кодом и RESOURCES-файл для каждого внедренного управляемого ресурса (название файла соответствует названию ресурса в метаданных). Если в аргумент имя_PE-файла внедрены неуправляемые ресурсы, будет создан RES-файл с именем, указанным для IL-вывода в параметре /output.

Примечание.

Для входных файлов OBJ и LIB программа Ildasm.exe отображает только описания метаданных. IL-код для файлов этих типов не дизассемблируется.

Чтобы определить, является ли файл EXE или DLL управляемым, обработайте его программой Ildasm.exe. Если файл не является управляемым, программа выдаст сообщение, что у файла отсутствует допустимый заголовок среды CLR и он не может быть дизассемблирован. Если файл является управляемым, программа будет выполнена без ошибок.

Сведения о версии

Начиная с платформа .NET Framework 4.5, Ildasm.exe обрабатывает нераспознанный маршал BLOB (двоичный большой объект), отображая необработанное двоичное содержимое. В следующем примере показано, как отображается маршалинговый объект BLOB, созданный программой 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

Начиная с версии платформа .NET Framework 4.5 Ildasm.exe отображает атрибуты, применяемые к реализации интерфейса, как показано в следующем фрагменте из выходных данных Ildasm.exe:

.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 )
      …

Примеры

Следующая команда выводит метаданные и дизассемблированный код PE-файла MyHello.exe в стандартный графический пользовательский интерфейс программы Ildasm.exe.

ildasm myHello.exe

Следующая команда дизассемблирует файл MyFile.exe и сохраняет выходной текст ассемблера IL в файле MyFile.il.

ildasm MyFile.exe /output:MyFile.il

Следующая команда дизассемблирует файл MyFile.exe и выводит выходной текст ассемблера IL в окно консоли.

ildasm MyFile.exe /text

Если файл MyApp.exe содержит внедренные управляемые и неуправляемые ресурсы, при выполнении следующей команды будет создано четыре файла: MyApp.il, MyApp.res, Icons.resources и Message.resources.

ildasm MyApp.exe /output:MyApp.il

Следующая команда дизассемблирует метод MyMethod класса MyClass в файле MyFile.exe и выводит результат в окно консоли.

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

В предыдущем примере допустимо наличие нескольких методов с именем MyMethod и различными сигнатурами. Следующая команда дизассемблирует метод экземпляра MyMethod с типом возвращаемого значения void и типами параметров int32 и string.

ildasm /item:"MyClass::MyMethod(instance void(int32,string)" MyFile.exe /text

Примечание.

В .NET Framework версии 1.0 и 1.1 открывающей скобке, которая следует за именем метода, должна соответствовать закрывающая скобка после сигнатуры: MyMethod(instance void(int32)). В .NET Framework 2.0 и более поздних версий закрывающая скобка должна быть опущена: MyMethod(instance void(int32).

Чтобы извлечь метод static (метод Shared в Visual Basic), следует опустить ключевое слово instance. Типы классов, которые не являются простыми типами (такими как int32 и string), должны включать пространство имен и перед ними необходимо указывать ключевое слово class. Перед внешними типами должно быть указано имя соответствующей библиотеки в квадратных скобках. Следующая команда дизассемблирует статический метод с именем MyMethod, имеющий один параметр типа AppDomain, и возвращает значение типа AppDomain.

ildasm /item:"MyClass::MyMethod(class [mscorlib]System.AppDomain(class [mscorlib]System.AppDomain)" MyFile.exe /text

Перед вложенным типом необходимо указывать содержащий его класс, отделенный косой чертой (/). Например, если класс MyNamespace.MyClass содержит вложенный класс с именем NestedClass, вложенный класс указывается следующим образом: class MyNamespace.MyClass/NestedClass.

См. также