Ildasm.exe Дизассемблер IL

C Sharp > Ildasm.exe Дизассемблер IL
18.12.2017 15:05:28



Статья:

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

Это средство автоматически устанавливается с Visual Studio.    Чтобы применить этот инструмент, воспользуйтесь командной строкой разработчика (или командную строку Visual Studio в Windows 7). 

ildasm [options] [PEfilename] [options]

Доступны следующие параметры для файла EXE, DLL OBJ, LIB и .winmd.

ВАРИАНТ

Описание

/out=имя_файла

Создает выходной файл с заданным именем_файла вместо вывода результатов в графическом интерфейсе пользователя.

/rtf

Создает выходные данные в формате RTF.  Не может использоваться с параметром /text.  

/text

Выводит результаты работы на консоль, а не в графический интерфейс пользователя или выходной файл.

/html

Создает выходные данные в формате HTML.  Может использоваться только с параметром /output.  

/?

Отображает синтаксис команд и параметров для инструмента.

Следующие дополнительные параметры доступны для EXE, DLL и WINMD-файлов.

ВАРИАНТ

Описание

/bytes

Отображает фактические байты в шестнадцатеричном формате в виде комментариев к инструкциям.

/caverbal

Создает двоичные объекты настраиваемых атрибутов в форме команд.  По умолчанию задана двоичная форма.  

/linenum

Включает ссылки на строки исходного файла.

/nobar

Подавляет вывод всплывающего окна с индикатором хода выполнения дизассемблирования.

/noca

Подавляет вывод настраиваемых атрибутов.

/project

Отображает метаданные так, как их видит управляемый код, а не как их видит машинный Среда выполнения Windows.  Если PEfilename не является файлом метаданных .winmd (Windows), то этот параметр не действует.  См. раздел Поддержка приложений для Магазина Windows и среды выполнения Windows в .NET Framework.  

/pubonly

Дизассемблируются только открытые типы и члены.  Этот параметр является эквивалентом параметра /visibility:PUB.  

/quoteallnames

Все имена заключаются в одинарные кавычки.

/raweh

Отображает предложения обработки исключений в исходном виде.

/source

Выводит первоначальные строки исходного кода в виде комментариев.

/tokens

Отображает лексемы метаданных классов и членов.

/visibility:видимость[+видимость...]

Дизассемблируются только типы и члены с заданной областью видимости.  Допустимы следующие значения аргумента область_видимости:  

PUB — открытые

PRI — закрытые

FAM — семейство

ASM — сборка

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

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

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

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

Следующие параметры допустимы для EXE, DLL и WINMD-файлов только для записи в файл или вывода на консоль.

ВАРИАНТ

Описание

/all

Задает сочетание параметров /header, /bytes, /stats, /classlist и /tokens.

/classlist

Содержит список классов, определенных в этом модуле.

/forward

Используется прямое объявление класса.

/headers

Включает сведения из заголовка файла в выходной файл.

/item:класс[::член[(сигнатура]]

В зависимости от заданных аргументов выполняется дизассемблирование следующих объектов:

  • Дизассемблируется указанный класс.

  • Дизассемблируется указанный member этого класса.

  • Дизассемблирует member класса class с указанной подписью 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

Вывод метаданных отдельного файла объекта из заданной библиотеки.

System_CAPS_noteПримечание

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

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

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

System_CAPS_noteПримечание

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

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

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

System_CAPS_noteПримечание

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

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

Начиная с .NET Framework 4.5, Ildasm.exe обрабатывает неизвестный упакованный большой двоичный объект (BLOB), отображая необработанное двоичное содержимое.    Например, в следующем коде показано как выводится упакованный большой двоичный объект (BLOB), созданный программой C#.   

  // 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
System_CAPS_noteПримечание

В версиях 1.0 и 1.1 платформы .NET Framework открывающей скобке, которая следует за именем метода, должна соответствовать закрывающая скобка после подписи: 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.