Ildasm где находится windows 10

Обновлено: 04.07.2024

Для установки на компьютер большинства программ достаточно просто вставить компакт диск с программой в дисковод и, следуя несложным инструкциям, скопировать ее на жесткий диск . В результате мы получаем возможность запускать программу одним из нескольких способов — щелкая на ярлыке на Рабочем столе, выбирая ее группу в меню Пуск или просто дважды щелкая на файле, расширение которого связано с этой программой. Мы не задумываемся, из каких частей состоит программа , как они взаимодействуют, а некоторые пользователи даже не представляют, где эти части находятся. В этой лекции мы научимся создавать дистрибутивы, или пакеты установки, предоставляющие возможность распространять программы с минимумом усилий со стороны конечного пользователя.

Сборки. Утилита ildasm.exe

Приложение всегда состоит из одной или более сборок. Сборка — это функциональная единица, имеющая версию и описание, которую можно использовать в других приложениях. Для каждой сборки можно прописывать отдельные разрешения (подробнее о разрешениях см. "Безопасность Windows-форм" ).

В самом простом случае, сборка — это приложение, которое состоит из одного функционального модуля — класса. В большинстве случаев в приложении может быть несколько сборок, и каждая может иметь свои вспомогательные файлы. При выполнении все сборки приложения должны существовать и к ним должен быть открыт доступ. Каждая сборка должна быть независимой. У любой сборки есть метаданные, которые описывают сборку и содержат версию.

Содержимое сборки можно просмотреть, запустив дизассемблер " Microsoft Intermediate Language Disassembler " (ildasm.exe). Рассмотрим следующий пример — создадим простое консольное приложение, которое выводит на экран строку Hello World :

После того как приложение запустится, откроем только что созданную сборку (файл SimpleApp.exe из папки bin/Debug), (рис. 9.1).

Сборка SimpleApp, открытая с помощью утилиты ildasm.exe


Рис. 9.1. Сборка SimpleApp, открытая с помощью утилиты ildasm.exe

Как мы знаем, у класса всегда есть конструктор. Если он не был создан вручную, компилятор создаст конструктор по умолчанию. В утилите он называется .ctor. Также в созданной нами программе есть метод Main, который принимает строковый массив и не возвращает значений. Щелкаем на методе Main два раза. Открывается окно с MSIL ( Microsoft Intermediate Language ) кодом этого метода. Здесь видим строковую переменную ldstr со значением "Hello World" и запуск статического метода WriteLine класса Console (рис. 9.2).

MSIL-код метода Main

На рис. 9.2 я снова привел окно утилиты ildasm.exe: щелкнув на кнопку прокрутки, замечаем номер версии сборки — 1.0.2300.26912.

Частные сборки

Частные сборки отвечают тем же требованиям, что и обычные, но используются они, как правило, только в одном приложении. При этом файл сборки может находиться в корневой или вложенных папках корневого каталога, используемого приложением. Приложение связывается со сборкой по ее частному имени, содержащемуся в коде MSIL. Среда CLR, использующая код MSIL, ищет частную сборку по ее имени.

Частные сборки отвечают тем же требованиям, что и обычные, но предназначены они для использования только в одном приложении и, как правило, лежат в той же папке, что и использующее их приложение. Частная сборка может находиться не только в корневой папке, но и во вложенных папках корневого каталога. Приложение ссылается на частную сборку по ее частному имени, которое содержится в метаданных. Когда среда CLR ищет частную сборку для применения, она использует частное имя сборки для поиска, причем поиск осуществляется в корневом каталоге и дочерних подкаталогах. Среда не будет искать сборку в родительской папке каталога.

Если мы хотим использовать любой путь для размещения сборки, то следует воспользоваться методом LoadFrom класса Assembly и указать ему адрес нахождения файла со сборкой. Класс Assembly находится в пространстве имен System.Reflection. Создайте новое консольное приложение и назовите его SimpleAssembly. Удалите все фрагменты кода, оставив только следующий участок:

Скомпилировав приложение (Ctrl+Shift+B), мы получим сборку SimpleAssembly.dll. Теперь создадим еще одно консольное приложение — UsingLoadFrom , в папку bin/Debug которого помещаем файл SimpleAssembly.dll. В методе LoadFrom считываем содержимое сборки SimpleAssembly.dll:

Результатом запуска этого приложения будет вывод на экран строки Hellow World — результата метода HelloWorld сборки SimpleAssembly.dll.

Рассматриваемые листинги предельно просты. Тем не менее на диске, прилагаемом к книге, вы найдете приложения SimpleAssembly и UsingLoadFrom (Code\Glava9\ SimpleAssembly и UsingLoadFrom).

Важнейшие свойства CIL могут быть сформулированы следующим образом:

  • объектная ориентация и применение интерфейсов
  • строгое различие между типами значений и типами ссылок
  • строгая типизация данных
  • обработка ошибок через использование исключений
  • применение атрибутов

Давайте рассмотрим первые два свойства более подробно:

Поддержка объектной ориентации и интерфейсов

Так же, язык CIL имеет способность языкового взаимодействия, под которой подразумевается возможность для классов, написанных на одном языке, напрямую обращаться к классам, написанным на другом языке, т.е.:

класс, написанный на одном языке, может быть унаследован от класса, реализованного на другом языке

класс может содержать экземпляр другого класса, независимо от того, на каких языках написан каждый из них

объект может напрямую вызывать методы другого объекта, написанного на другом языке

объекты (или ссылки на объекты) могут передаваться между методами

при вызове методов между языками можно шагать в отладчике по вызовам, даже если это означает необходимость перемещения между фрагментами исходного кода, написанными на разных языках

Как и любой язык программирования, IL предлагает множество предопределенных примитивных типов данных. Одна из особенностей IL, однако, заключается в том, что он делает четкое различие между значениями и ссылочными типами. — это те переменные, которые непосредственно хранят данные, в то время как ссылочные типы — это те переменные, которые просто хранят адрес, по которому соответствующие данные могут быть найдены.

В терминах С++ ссылочные типы можно рассматривать, как будто они обращаются к переменным через указатель, в то время как для Visual Basic лучшая аналогия для ссылочных типов — это объекты, обращение к которым в Visual Basic 6 всегда осуществляется по ссылке. В языке IL также установлена своя спецификация относительно хранения данных: экземпляры ссылочных типов всегда хранятся в области памяти, известной как managed heap, в то время как типы значений обычно хранятся в стеке (хотя, если типы значений объявлены как поля внутри ссылочных типов, то они также будут сохранены в managed heap).

Утилита ildasm.exe

Утилиту ildasm.exe также легко запустить, открыв в Visual Studio 2010 окно Command Prompt (Командная строка), введя в нем слово ildasm и нажав клавишу Enter:

Вызов утилиты ildasm.exe

Давайте сначала составим простейшую сборку:

Скомпилируем и откроем .exe файл через утилиту ildasm.exe:

Утилита ildasm.exe

Помимо содержащихся в сборке пространств имен, типов и членов, утилита ildasm.ехе также позволяет просматривать и CIL-инструкции, которые лежат в основе каждого конкретного члена. Например, в результате двойного щелчка на методе Main в классе Program открывается отдельное окно с CIL-кодом, лежащим в основе этого метода.

CIL-код сборки

Для просмотра метаданных типов, которые содержатся в загруженной в текущий момент сборке, необходимо нажать комбинацию клавиш <Ctrl+M>.

Метаданные типов

И, наконец, чтобы просмотреть содержимое манифеста сборки, необходимо дважды щелкнуть на значке MANIFEST.

Данные манифеста

Несомненно, утилита ildasm.ехе обладает большим, чем было показано здесь количеством функциональных возможностей; все остальные функциональные возможности этой утилиты будут демонстрироваться позже в данном руководстве при рассмотрении соответствующих аспектов.

Последнее обновление: 07/01/2021 [Необходимое время для чтения:

Файл ildasm.exe впервые был создан 04/12/2010 для ОС Windows 10 в Microsoft Visual Studio 2010 Ultimate 2010. По нашим данным, это самая последняя дата выпуска от компании Microsoft.

Ниже приведены подробные сведения, порядок устранения неполадок, возникших с файлом EXE, и бесплатные загрузки различных версий файла ildasm.exe.




Совместимость с Windows 10, 8, 7, Vista, XP и 2000

Средняя оценка пользователей

Сведения о файле
Набор символов: Unicode
Код языка: English (U.S.)
Флаги файлов: Private build
Маска флагов файлов: 0x003f
Точка входа: 0x401a4
Размер кода: 271872

✻ Фрагменты данных файлов предоставлены участником Exiftool (Phil Harvey) и распространяются под лицензией Perl Artistic.

ildasm.exe — ошибки выполнения

Ошибки выполнения — это ошибки Microsoft Visual Studio 2010 Ultimate, возникающие во время «выполнения». Термин «выполнение» говорит сам за себя; имеется в виду, что данные ошибки EXE возникают в момент, когда происходит попытка загрузки файла ildasm.exe — либо при запуске приложения Microsoft Visual Studio 2010 Ultimate, либо, в некоторых случаях, во время его работы. Ошибки выполнения являются наиболее распространенной разновидностью ошибки EXE, которая встречается при использовании приложения Microsoft Visual Studio 2010 Ultimate.

К числу наиболее распространенных ошибок ildasm.exe относятся:

Не удается запустить программу из-за отсутствия ildasm.exe на компьютере. Попробуйте переустановить программу, чтобы устранить эту проблему.

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

Шаг 1. Восстановите компьютер до последней точки восстановления, «моментального снимка» или образа резервной копии, которые предшествуют появлению ошибки.

Чтобы начать восстановление системы (Windows XP, Vista, 7, 8 и 10):

Если на этапе 1 не удается устранить ошибку ildasm.exe, перейдите к шагу 2 ниже.


Шаг 2. Если вы недавно установили приложение Microsoft Visual Studio 2010 Ultimate (или схожее программное обеспечение), удалите его, затем попробуйте переустановить Microsoft Visual Studio 2010 Ultimate.

Чтобы удалить программное обеспечение Microsoft Visual Studio 2010 Ultimate, выполните следующие инструкции (Windows XP, Vista, 7, 8 и 10):

После полного удаления приложения следует перезагрузить ПК и заново установить Microsoft Visual Studio 2010 Ultimate.

Если на этапе 2 также не удается устранить ошибку ildasm.exe, перейдите к шагу 3 ниже.


Microsoft Visual Studio 2010 Ultimate 2010

Шаг 3. Выполните обновление Windows.


Если ни один из предыдущих трех шагов по устранению неполадок не разрешил проблему, можно попробовать более агрессивный подход (примечание: не рекомендуется пользователям ПК начального уровня), загрузив и заменив соответствующую версию файла ildasm.exe. Мы храним полную базу данных файлов ildasm.exe со 100%-ной гарантией отсутствия вредоносного программного обеспечения для любой применимой версии Microsoft Visual Studio 2010 Ultimate . Чтобы загрузить и правильно заменить файл, выполните следующие действия:

Windows 10: C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\x64\
Windows 10: C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\
Windows 10: C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\x64\
Windows 10: C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\

Если этот последний шаг оказался безрезультативным и ошибка по-прежнему не устранена, единственно возможным вариантом остается выполнение чистой установки Windows 10.

После изучения основ реверс-инжиниринга NET-приложений, настало время более подробно рассмотреть язык MSIL. В этой статье не ставится цель научиться вас программировать на этом языке.

image

Автор: Суфиан Тахири (Soufiane Tahiri)

После изучения основ реверс-инжиниринга NET-приложений, настало время более подробно рассмотреть язык MSIL. В этой статье не ставится цель научиться вас программировать на этом языке. Я постараюсь разъяснить новые нюансы по использованию и управлению IL-кодом посредством новых инструментов. Также я представлю вам технику «циклической разработки» (которая применяется не только при разработке NET-приложений) и расскажу о преимуществах, которые может дать эта техника реверс-инженеру.

В этой статье мы ознакомимся более подробно с IL-кодом и двумя взаимосвязанными инструментами, которые помогут нам удалить первую защиту у Crack Me, специально сделанного для этой цели. Как только вы научитесь работать с этими инструментами и узнаете основы циклической разработки, в следующей статье я расскажу о продвинутых методах циклической разработки для удаления второй защиты Crack Me. Так что сделайте глубокий вдох, и мы начинаем!

Понятие «Циклической разработки»

Первоначально IL-ассемблер и дизассемблер были созданы как внутренние инструменты, используемые при разработке среды CLR. Когда обе утилиты стали в достаточной мере синхронизированными, на базе ILAsm начали появляться (наряду с библиотекой классов NET Frameworks) сторонние компиляторы, ориентированные на платформу NET.

Замечание: Управляемые NET-приложения называются «сборками», а управляемые исполняемые файлы NET называются «модулями».

В этой статье мы будем работать только с двумя инструментами, официально представленными компанией Microsoft в рамках Windows SDK: IL-ассемблер (ILASM) и IL-дизассемблер (ILDASM, который мы использовали в прошлой статье). В принципе, мы можем исследовать любую NET-сборку / модуль при помощи этих двух утилит.

Прежде чем приступить к анализу Crack ME (о нем я еще не рассказывал), я подробнее остановлюсь на некоторых аспектах платформы NET и начну со среды Common Language Runtime.

Среда CLR является промежуточным звеном между NET-сборками и операционной системой, в которой запускаются сборки; на данный момент (я надеюсь) вы знаете, что каждая NET-сборка «транслируется» в низкоуровневый промежуточный язык (Common Intermediate Language – CIL или Microsoft Intermediate Language – MSIL). Несмотря на разработку на высокоуровневом языке, сборка независима от целевой платформы. Такой вид «абстракции» позволяет вести разработку на разных языках.

Common Intermediate Language опирается на набор спецификаций, гарантирующих совместное сосуществование разных языков; этот набор спецификаций известен как Common Language Specifications – CLS, как это определено в спецификации общеязыковой структуры (Common Language Infrastructure), стандарте Ecma International, и международной организации по стандартизации (International Organization for Standardization – ISO; ссылку для загрузки Раздела I можно найти в разделе «Ссылки»).

NET-сборки и модули, спроектированные для запуска в среде Common Language Runtime (CLR), состоят в основном из метаданных и управляемого кода.

Управляемый код состоит из набора инструкций, которые являются «сердцем» сборки / модуля и представляет собой набор функций и методов закодированный в абстрактной и стандартизированной форме известной как MSIL (или CIL), что позволяет опознать управляемый исходный код, который запускается исключительно в среде CLR.

С другой стороны, термин «метаданные» является довольно неоднозначным (метаданные можно еще назвать как «данные, описывающие данные»). В нашем случае метаданные – это система дескрипторов, касающихся «содержимого» сборки. Метаданные относятся к структуре данных, находящихся внутри низкоуровневого CIL-кода, и описывают структуру высокоуровневого кода: отношения между классами, их членами, возвращаемыми типами, глобальными элементами и параметрами методов. Если обобщить все вышесказанное (всегда учитывайте контекст среды CLR), метаданные описывают все элементы, которые задекларированы (или на которые есть ссылка) внутри модуля.

Таким образом, можно сказать, что модуль состоит из двух компонентов: метаданных и IL-кода; среда CLR подразделяется на две подсистемы: «загрузчик» и JIT-компилятор.

Загрузчик разбирает метаданные и создает в памяти нечто вроде схемы / паттерна представления внутренней структуры модуля, а затем в зависимости от результата предыдущей операции, JIT-компилятор (также называемый jitter) компилирует IL-код в машинный код конкретной платформы.

Рисунок ниже описывает механизм создания и запуска управляемого модуля:


Наш третий объект исследования – управляемый модуль «CrackMe3-InfoSecInstitute-dotNET-Reversing.exe» (ссылка для загрузки представлена в разделе «Ссылки) выглядит так:



Наша задача – удалить всплывающее окно и подобрать серийный номер. Далее мы рассмотрим методы циклической разработки для обхода обеих защит этого Crack Me.

Шаг 1: Дизассемблирование

Первым делом дизассемблируем наш Crack Me, используя ILDASM и посмотрим встроенный IL-код управляемого модуля. Сосредоточим внимание на двух узлах:


Управляемый модуль содержит одну форму Form1 и один класс GetSerial. Рассмотрим первый узел (с формой):


Дважды щелкните по методу Form_Load, чтобы увидеть IL-код:

.method private instance void Form1_Load(object sender, class [mscorlib]System.EventArgs e) cil managed
<
// Code size 19 (0×13)
.maxstack 8
IL_0000: ldstr “I’m a nag screen, remove me.”
IL_0005: ldc.i4.s 16
IL_0007: ldstr “Nagging you!”
IL_000c: call valuetype [Microsoft.VisualBasic]Microsoft.VisualBasic.MsgBoxResult [Microsoft.VisualBasic]Microsoft.VisualBasic.Interaction::MsgBox(object, valuetype [Microsoft.VisualBasic]Microsoft.VisualBasic.MsgBoxStyle, object)
IL_0011: pop
IL_0012: ret
> // end of method Form1::Form1_Load

Для повышения читабельности кода все служебные слова ILAsm (читай инструкции) выделены жирным шрифтом. Рассмотрим детально механизм работы этого участка кода и наши дальнейшие действия.

Понимание механизма работы метода Form_Load():

.method private instance void Form1_Load(…) cil managed элемент метаданных Method Definition.

Служебные слова private и instance определяют флаги элемента Method Definition. Ключевое слово public означает, что метод Frm1_Load() доступен всем членам, для которых видим «материнский» класс (тот, который содержит этот метод). Служебное слово instance говорит нам о том, что метод связан с объектом, а не классом.

Служебное слово void в явной форме определяет тип возвращаемого значения (по умолчанию) текущего метода. Void означает, что метод ничего не возвращает.

Служебные слова cil и managed означают, что тело метода представлено IL-кодом и определяют флаги реализации Method Definition.

.maxstack 8 – директива, определяющая максимальное число элементов, которое может находиться в стеке вычислений во время выполнения метода.

IL_0000 – метка, не занимающая места в памяти. ILDASM помечает каждую строку (инструкцию) подобными метками. Метки не компилируются и используются исключительно для идентификации некоторых смещений внутри IL-кода во время компиляции программы.

Как вы знаете, IL является строго стековым языком. Все должно проходить через стек вычислений. Каждая инструкция помещает или извлекает что-то (или ничего) из вершины стека вычислений. Когда мы говорим о помещении / извлечении элементов в / из стека, мы говорим об элементах, не обращая внимание на их размеры.

Ldstr «I’m a nag screen, remove me». Создает объект типа строка из передаваемой строковой константы и помещает ссылку на этот объект в стек вычислений. Подобные константы хранятся в метаданных. Эта строковая константа общеязыковой среды выполнения или строковая константа метаданных всегда хранится в формате Unicode (UTF-16).

call valuetype [Microsoft.VisualBasic]Microsoft.VisualBasic.MsgBoxResult [Microsoft.VisualBasic]Microsoft.VisualBasic.Interaction::MsgBox(object, valuetype [Microsoft.VisualBasic]Microsoft.VisualBasic.MsgBoxStyle, object); valuetype используется перед объектом, который мы хотим создать. Указывается полное имя класса, включая имя библиотеки, так происходит вызов (не виртуального?) метода. Ключевое слово valuetype обязательно для экземпляров общего типа, поскольку они представлены в метаданных как TypeSpecs.

Инструкция pop удаляет из стека строку «Nagging you!».

После выполнения инструкции ret происходит возврат из текущего метода, и в стек вычислений помещается значение определенного типа. В нашем случае метод возвращает значение типа void, что означает отсутствие какого-либо значения в стеке вычисления во время возврата из метода.

Теперь мы знаем, что метод Form1_Load делает одну единственную вещь: инициализирует и выводит всплывающее окно, от которого нам нужно избавиться.

Технически нам нужно на основе нашей сборки сгенерировать файл .il (выгрузив его из ILDasm), произвести необходимые манипуляции и собрать его заново. Однако перед этим нам нужно выяснить версию сборки, чтобы не было проблем с повторной компиляцией (используя ILASM).

Информацию о версии можно узнать, если посмотреть содержимое манифеста сборки:


Директива .ver указывает номер версии:


Рисунок 1. Версия сборки

Теперь выгрузим сборку. Выполните команду File->Dump->Ok (или Ctrl+D) и выберите директорию, куда сохранять файлы. В результате получится нечто подобное:


Файл с расширением .il содержит все IL-инструкции управляемого модуля. Откройте его в текстовом редакторе и найдите метод Form1_Load:


Теперь мы можем пойти несколькими путями. Например, удалить все инструкции внутри метода или удалить весь метод, поставив в начало инструкцию ret. Я предпочитаю удалить содержимое так, чтобы метод Form1_Load() не выполнял вообще никаких операций.

Удалите строки с 1192 до 1201 и сохраните изменения:


После всех манипуляций нам нужно реассемблировать измененный .il файл. Мы будем использовать утилиту ILAsm, которая поставляется вместе с Visual Studio и Windows SDK. С помощью ILAsm мы сможем собрать исполняемый файл из файла инструкций на языке Microsoft Intermediate Language.

Шаг 2: Реассемблирование

Переходим в командную строку Microsoft Windows Command (CMD) или Visual Studio Command Prompt (в любом случае результат будет один и тот же).

Выполните команду Start->Run->CMD.

Filename = полный путь к .il файлу

Параметр –res необязательный и используется для сохранения ресурсов из первоначальной сборки (например, иконок)


Resolving local member refs: 0 -> 0 defs, 0 refs, 0 unresolved
Writing PE file
Operation completed successfully

И в новой версии уже не будет всплывающего окна:


Замечание: вы также можете изменить текст, появляющийся во всплывающем окне посредством изменения строки, которая загружается в стек вычисления, или поменять стиль всплывающего окна:

Читайте также: