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
.