Как дизассемблировать файл exe

Обновлено: 04.07.2024

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

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

В командной строке введите следующее.

Синтаксис

Параметры

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

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

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

PUB — открытый;

PRI — закрытый;

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

ASM — сборка;

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

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

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

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

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

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

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

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

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

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

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

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

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

Перечисленные ниже параметры допустимы для 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-код для файлов этих типов не дизассемблируется.

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

Примеры

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

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

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

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

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

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

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

Как декомпилировать EXE-файлы

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

Способы декомпиляции EXE-файлов

Декомпиляция может быть полезной автору ПО, который потерял исходные коды, или просто пользователям, желающим узнать свойства той или иной программы. Для этого существуют специальные программы-декомпиляторы.

Способ 1: VB Decompiler

Первым рассмотрим VB Decompiler, который позволяет декомпилировть программы, написанные на Visual Basic 5.0 и 6.0.

    Нажмите «Файл» и выберите пункт «Открыть программу» (Ctrl+O).

Стандартное открытие программы в VB Decompiler

Открытие EXE в VB Decompiler

Запуск декомпиляции в VB Decompiler

Просмотр исходного кода через VB Decompiler

Сохранение декомпилированного проекта в VB Decompiler

Способ 2: ReFox

В плане декомпиляции программ, скомпилированных через Visual FoxPro и FoxBASE+, неплохо себя зарекомендовал ReFox.

    Через встроенный обозреватель файлов найдите нужный EXE-файл. Если его выделить, то справа будет отображаться краткая информация о нём.

Поиск EXE через ReFox

Переход к декомпиляции в ReFox

Запуск декомпиляции в ReFox

Завершение декомпиляции в ReFox

Можно просмотреть результат в указанной папке.

Способ 3: DeDe

А DeDe будет полезна для декомпиляции программ на Delphi.

Добавление файла в DeDe

Добавление EXE в DeDe

Запуск декомпиляции в DeDe

Завершение декомпиляции в DeDe

В отдельные вкладки будет выведена информация о классах, объектах, формах и процедурах.

Способ 4: EMS Source Rescuer

Декомпилятор EMS Source Rescuer позволяет работать с EXE-файлами, скомпилированными при помощи Delphi и C++ Builder.

  1. В блоке «Executable File» нужно указать нужную программу.
  2. В «Project name» пропишите имя проекта и нажмите «Next».

Выбор исходника и имя проекта в EMS Source Rescuer

Предпросмотр и сохранение проекта в EMS Source Rescuer

Мы рассмотрели популярные декомпиляторы для файлов EXE, написанных на разных языках программирования. Если Вам известны другие рабочие варианты, напишите об этом в комментариях.

Закрыть

Мы рады, что смогли помочь Вам в решении проблемы.

Отблагодарите автора, поделитесь статьей в социальных сетях.

Закрыть

Опишите, что у вас не получилось. Наши специалисты постараются ответить максимально быстро.


Пятнадцать лет назад эпический труд Криса Касперски «Фундаментальные основы хакерства» был настольной книгой каждого начинающего исследователя в области компьютерной безопасности. Однако время идет, и знания, опубликованные Крисом, теряют актуальность. Редакторы «Хакера» попытались обновить этот объемный труд и перенести его из времен Windows 2000 и Visual Studio 6.0 во времена Windows 10 и Visual Studio 2019.

Ссылки на другие статьи из этого цикла ищи на странице автора.

С легкой руки Денниса Ритчи повелось начинать освоение нового языка программирования с создания простейшей программы «Hello, World!». Не будем нарушать эту традицию и оценим возможности IDA Pro следующим примером.

Чтобы все было как в статье, компилируй примеры с помощью Visual C++ 2017 вызовом cl.exe first.cpp /EHcs . Флаг /EHcs нужен, чтобы подавить возражение компилятора и вместе с тем включить семантику уничтожения объектов.

Компилятор сгенерирует исполняемый файл объемом почти 190 Кбайт, большую часть которого займет служебный, стартовый или библиотечный код. Попытка дизассемблирования с помощью таких средств, как W32Dasm, не увенчается быстрым успехом, поскольку над полученным листингом размером в два с половиной мегабайта (!) можно просидеть не час и не два. Легко представить, сколько времени уйдет на серьезные задачи, требующие изучения десятков и сотен мегабайтов дизассемблированного текста.

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

Результат работы IDA Pro

Результат работы IDA Pro

Чтобы открыть текстовое представление, надо из контекстного меню выбрать пункт Text view.

Какую версию IDA Pro выбрать?

Последней версией IDA Pro на момент написания статьи была 7.3. Ее цена может быть великовата для покупки в исследовательских целях. Как известно, Ильфак Гильфанов очень строго относится к утечкам и появлению продуктов своей компании в интернете и не допускает подобного.

Однако на сайте компании Hex-Rays в публичный доступ выложена бесплатная версия дизассемблера с функциональными ограничениями. Например, она не получает обновления после достижения майлстоуна целой версии, то есть сейчас для свободной загрузки доступна версия 7.0. Также она поддерживает только архитектуры x86 и x64.

Тем не менее этого вполне достаточно для наших целей. Потому что нам не придется разбираться в коде для процессоров ARM, Motorola, Sparc, MIPS или Zilog. Еще одно ограничение накладывается на использование в коммерческих целях, но и тут наша совесть чиста.

Закончив автоматический анализ файла first.exe , IDA переместит курсор к строке .text:0040628B — точке входа в программу. Не забудь из графического режима отображения листинга переключиться в текстовый. Также обрати внимание на строчку .text:00406290 start endp ; sp-analysis failed , выделенную красным цветом в конце функции start . Так IDA отмечает последнюю строку функции в случае, если у нее в конце return и значение указателя стека на выходе из функции отличается от такового на входе.

Среди начинающих программистов широко распространено заблуждение, что якобы программы, написанные на языке С, начинают выполняться с функции main . В действительности это не совсем так. На самом деле сразу после загрузки файла управление передается на функцию Start , вставленную компилятором. Она подготавливает глобальные переменные:

  • argc — количество аргументов командной строки;
  • argv — массив указателей на строки аргументов;
  • _environ — массив указателей на строки переменных окружения.

Заполняется структура OSVERSIONINFOEX , которая среди прочего включает:

  • dwBuildNumber — билд;
  • dwMajorVersion — старшую версию операционной системы;
  • dwMinorVersion — младшую версию операционной системы;
  • _winver — полную версию операционной системы;
  • wServicePackMajor — старшую версию пакета обновления;
  • wServicePackMinor — младшую версию пакета обновления.

Далее Start инициализирует кучу (heap) и вызывает функцию main, а после возвращения управления завершает процесс с помощью функции Exit . Для получения значений структуры OSVERSIONINFOEX используется функция GetVersionEx .

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

CRtO.demo.c

Прототип функции main как будто указывает, что приложение не принимает никаких аргументов командной строки, но результат работы программы говорит об обратном и на моей машине выглядит так (приводится в сокращенном виде):

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

Например, Visual C++ всегда, независимо от прототипа функции main , передает ей три аргумента: указатель на массив указателей переменных окружения, указатель на массив указателей аргументов командной строки и количество аргументов командной строки, а все остальные функции стартового кода принимают меньшее количество аргументов.

Рекомендую ознакомиться с исходниками стартовых функций популярных компиляторов. Для Visual C++ 14 в соответствии с архитектурой они находятся в подпапках каталога %\Program Files (x86)\Microsoft Visual Studio 14.0\VC\crt\src\ . Их изучение упростит анализ дизассемблерного листинга.

Ниже в качестве иллюстрации приводится фрагмент стартового кода программы first.exe , полученный в результате работы W32Dasm.

//******************** Program Entry Point ********************
:0040628B E802070000 call 00406992
:00406290 E974FEFFFF jmp 00406109

* Referenced by a CALL at Addresses:
|:0040380C , :004038B2 , :0040392E , :00403977 , :00403A8E
|:00404094 , :004040FA , :00404262 , :00404BF4 , :00405937
|:004059AE
|

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004062B6(U)
|
:00406295 8B4DF4 mov ecx, dword ptr [ebp-0C]
:00406298 64890D00000000 mov dword ptr fs:[00000000], ecx
:0040629F 59 pop ecx
:004062A0 5F pop edi
:004062A1 5F pop edi
:004062A2 5E pop esi
:004062A3 5B pop ebx
:004062A4 8BE5 mov esp, ebp
:004062A6 5D pop ebp
:004062A7 51 push ecx
:004062A8 F2 repnz
:004062A9 C3 ret
.

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

Поэтому способности дизассемблера тесно связаны с его версией и полнотой комплекта поставки — далеко не все версии IDA Pro в состоянии работать с программами, сгенерированными современными компиляторами.

.text:0040628B start proc near
.text:0040628B
.text:0040628B ; FUNCTION CHUNK AT .text:00406109 SIZE 00000127 BYTES
.text:0040628B ; FUNCTION CHUNK AT .text:00406265 SIZE 00000026 BYTES
.text:0040628B
.text:0040628B call sub_406992
.text:00406290 jmp loc_406109
.text:00406290 start endp ; sp-analysis failed
.text:00406290
.text:00406295 ; [00000015 BYTES: COLLAPSED FUNCTION __EH_epilog3. PRESS CTRL-NUMPAD+ TO EXPAND]
.text:004062AA ; [00000011 BYTES: COLLAPSED FUNCTION __EH_epilog3_GS. PRESS CTRL-NUMPAD+ TO EXPAND]
.text:004062BB ; [00000034 BYTES: COLLAPSED FUNCTION __EH_prolog3. PRESS CTRL-NUMPAD+ TO EXPAND]
.text:004062EF ; [00000037 BYTES: COLLAPSED FUNCTION __EH_prolog3_GS. PRESS CTRL-NUMPAD+ TO EXPAND]
.text:00406326 ; [00000037 BYTES: COLLAPSED FUNCTION __EH_prolog3_catch. PRESS CTRL-NUMPAD+ TO EXPAND]
.text:0040635D
.text:0040635D ; =============== S U B R O U T I N E ===============
.text:0040635D
.text:0040635D ; Attributes: thunk
.text:0040635D
.text:0040635D sub_40635D proc near ; CODE XREF: sub_4042FD+19↑p
.text:0040635D jmp sub_406745
.text:0040635D sub_40635D endp
.text:0040635D
.text:00406362
.

Текстовое отображение результата работы IDA

Текстовое отображение результата работы IDA

Давай разбираться в получившемся листинге. Первое и в данном случае единственное, что нам надо найти, — это функция main . В начале стартового кода после выполнения процедуры sub_406992 программа совершает прыжок на метку loc_406109 :

.text:0040628B start proc near
.text:0040628B call sub_406992
.text:00406290 jmp loc_406109

Для перехода на метку достаточно поставить на нее текстовый курсор и нажать Enter. Если подвести курсор мыши к метке или вызову функции, появится окно, в котором будет показано начало выбранной функции или место листинга, куда переводит метка, что очень удобно.

В данном случае, как мы видим по комментарию, IDA отправила нас в начало стартового куска кода. Немного прокрутим листинг вниз, обращая внимание на плавные переходы по меткам.

В итоге доходим до вызова функции: call sub_4010D0 . Похоже, это и есть функция main , поскольку здесь дизассемблер смог распознать строковую переменную и дал ей осмысленное имя aHelloSailor , а в комментарии, расположенном справа, для наглядности привел оригинальное содержимое Hello, Sailor!\n . Смещение этой строки компилятор закинул на вершину стека, а затем ниже через строчку, по всей видимости, происходит вызов функции вывода на экран:

Чтобы убедиться в этом, зайдем в последнюю процедуру. Разобраться в ней без пива не представляется возможным, разве что огромное количество параметров намекает нам на схожесть с функцией printf .

Если поместить курсор в границы имени aHelloSailor и нажать Enter, IDA автоматически перейдет к строке, в которой выполняется определение переменной:

.rdata:0041E1A0 aHelloSailor db 'Hello, Sailor!',0Ah,0 ; DATA XREF: sub_4010D0+3↑o

Выражение DATA XREF: sub_4010D0+3↑o называется перекрестной ссылкой и свидетельствует о том, что в третьей строке процедуры sub_4010D0 произошло обращение к текущему адресу по его смещению ( o от слова offset), а стрелка, направленная вверх, указывает на относительное расположение источника перекрестной ссылки.

Если навести курсор на выражение sub_4010D0+3↑o и нажать Enter, то IDA Pro перейдет к следующей строке:

Нажатие Esc отменяет предыдущее перемещение, возвращая курсор в исходную позицию.

К слову, дизассемблер W32Dasm даже не смог распознать строковую переменную.

Что не так с IDA?

Положа руку на сердце — я был слегка разочарован, ибо ожидал, что IDA распознает больше библиотечных процедур. Поэтому я решил натравить «Иду» на такую же программу, но сгенерированную более ранней версией компилятора. Подопытным кроликом выступил Visual C++ 8.0 (VS 2005).

Сравним результаты работы компиляторов. Тот же исходник, компиляция из командной строки (папка first05 ). Загрузим итоговый экзешник в «Иду». Листинг приводится в сокращенном виде для экономии пространства.



Мало того что стартовый код меньше по объему, так еще было автоматически определено большее количество библиотечных функций, среди которых: GetVersionExA, GetProcessHeap, HeapFree и ряд других. Среди них достаточно просто найти вызов main и перейти на саму функцию.



Тем не менее VC++ 8.0 — ушедшая эпоха, и в пример я ее привел только для ознакомления.

На этом анализ приложения first.cpp можно считать завершенным. Для полноты картины остается переименовать функцию sub_4010D0 в main . Для этого подводи курсор к строке .text:004010D0 (началу функции) и жми N. В появившемся диалоге можешь ввести main . Результат должен выглядеть так:

Обрати внимание: IDA в комментарии подставила прототип функции, а ниже параметры по умолчанию.

Продолжение доступно только участникам

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

Вариант 2. Открой один материал

Крис Касперски

Известный российский хакер. Легенда ][, ex-редактор ВЗЛОМа. Также известен под псевдонимами мыщъх, nezumi (яп. 鼠, мышь), n2k, elraton, souriz, tikus, muss, farah, jardon, KPNC.

Юрий Язев

Широко известен под псевдонимом yurembo. Программист, разработчик видеоигр, независимый исследователь. Старый автор журнала «Хакер».

главная программы pe explorer обзорный тур

Простота, ясность и удобство навигации

Дизассемблер, входящий в состав PE Explorer, разработан с целью дать разработчикам и исследователям простой и удобный инструмент для выполнения экспресс-анализа исполняемых файлов. Чтобы сделать процесс дизассемблирования быстрым и лёгким, некоторая часть функциональности, встречаемая в других дизассемблерах, была специально убрана. Таким образом, дизассемблер в PE Explorer сфокусирован на простоте, ясности и удобстве навигации, в то же время являясь ничуть не менее мощным, чем более сложные и дорогие конкурирующие продукты.

Главное окно дизассемблера

Мы попытались достичь уровня IDA Pro, при этом не требуя от пользователя специфических знаний и умений, поскольку большинство стадий процесса дизассемблирования в PE Explorer автоматизированы. Во многих случаях использование IDA Pro для быстрого анализа кода файла напоминает стрельбу из очень тяжёлой и дорогой пушки по очень маленьким воробьям. Мы же сделали просто хороший дизассемблер по очень доступной цене. И если ваша повседневная работа включает реверсинг и исследование уязвимостей программного кода, восстановление исходных кодов и поиск параметров, тестирование или изучение поведения неизвестных файлов, PE Explorer сэкономит вам немало часов и во многом упростит вашу работу.

Использование дизассемблера PE Explorer предполагает последующее редактирование полученного листинга вручную. Однако, чтобы избавить пользователя от значительного количества рутинной работы и уменьшить объём ручной правки, дизассемблер использует очень гибкий и интелектуальный алгоритм дизассемблирования, способный реконструировать ассемблерный код изучаемого исполняемого файла с высокой степенью достоверности.

Одной из причин, по которой я купил PE Explorer, был дизассемблер. Отличная вещь.

После сравнения PE Explorer с другими продуктами я полагаю, что выбрал самое лучшее предложение на рынке за свои деньги - вместо того, чтобы платить $400 за Ida Pro.

Основная проблема дизассемблирования заключается в правильности интерпретации изучаемых данных. Отделить код от данных - задача невероятно сложная, особенно когда код включает в себя специальные меры противодействия для затруднения дизассемблирования. Специально для таких случаев мы разработали особую модель алгоритма, позволяющую снизить ошибки определения типа данных.

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

Процесс дизассемблирования

Дизассемблер запускается в своём отдельном окне, и вы можете переключаться из окна дизассемблера в основное окно PE Explorer. Дизассемблер поддерживает основные наборы инструкций Intel x86 и расширения MMX, 3D Now!, SSE, SSE2 и SSE3. В начале процесса окно Options предлагает выбрать следующие опции:

Окно опций дизассемблера

Нажатие кнопки Start Now запускает процесс, кнопка Start Later откладывает запуск.

Verify Offsets - При включении этой опции дизассемблер особо тщательно проверяет, является ли анализируемое значение смещением.

Reverse Offset Checking Order - По умолчанию, дизассемблер рассматривает необработанные данные как код, и только потом как смещения к данным. При включении этой опции дизассемблер будет рассматривать необработанные данные как данные.

В большинстве случаев включение этой опции либо ничего не изменит, либо сделает качество листинга хуже. Однако, в некоторых случаях (например, с программами, написанными на Visual Basic) изменение порядка определения смещений может дать лучший результат. Автоматизировать применение этой опции затруднительно, поэтому рекомендуется использовать эту опцию только в ситуациях, когда настройки по умолчанию приводят к неудовлетворительным результатам.

Find ANSI and Unicode Strings - При включении этой опции дизассемблер автоматически обнаруживает текстовые ANSI и Unicode строки длиннее 3-х символов. В отдельных случаях, если результаты анализа позволяют однозначно интерпретировать данные как строку, эта длина может быть и менее 3-х символов.

Find Alignment - Поскольку доступ к выравненным данным происходит быстрее, многие компиляторы выравнивают код, добавляя лишние команды, не влияющие не ход выполнения программы, такие как nop, mov eax,eax и т.п.
При включении этой опции дизассемблер интерпретирует подобный код/данные как выравнивание.

Forcible Find Offsets - При включении этой опции дизассемблер автоматически обнаруживает смещения к данным в коде, который остался нераспознанным после первого прохода по файлу.
Используйте эту опцию с осторожностью, так как правильно определить, являются ли найденные данные смещением или фрагментами кода/данных, довольно сложно. Не рекомендуется использовать эту опцию без особых причин.

Analyze Uprocessed Data - Во время дизассемблирования отдельные фрагменты кода по причине отсутствия явных на них ссылок могут оказаться нераспознанными. При включении данной опции дизассемблер проводит дополнительный анализ таких блоков и пытается определить, являются ли эти фрагменты кодом или данными. Включение этой опции улучшает качество листинга.

Окно Processing Info отображает информацию о ходе процесса дизассемблирования:

Окно информации о ходе процесса

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

Нахождение всех текстовых строк внутри EXE файла

Дизассемблер отображает все найденные в сегменте данных текстовые строки в отдельной закладке Strings. Если вы пытаетесь найти какие-то зацепки в изучаемом файле в виде осмысленного текста, подобный список строк может дать вам подсказки о назначении тех или иных функций и процедур, вызываемых файлом, или даже какую-нибудь информацию о происхождении файла.

В отличие от существующих разнообразных утилит, занимающихся поиском и нахождением текстовых строк в исполняемых файлах, PE Explorer делает это аккуратнее и качественнее, поскольку опирается в своем поиске на результаты анализа кода кода приложения.

Нахождение VCL объектов и методов Delphi

Дизассемблер отображает список всех найденных VCL объектов и методов в отдельных закладках VCL Objects и VCL Methods:

Известные ограничения

Важно понимать, что PE Explorer не декомпилирует код. Он дизассемблирует код, т.е. преобразует машинный код в ассемблерный код. При этом он не генерирует код на С или С++ из полученного листинга. Сама по себе эта задача невероятной сложности, так еще при этом часто в исполняемом файле либо нет никаких упоминаний о том, какой язык программирования был использован для создания программы, либо оригинальный язык был совсем не С++.

Дизассемблирование файлов размером более 1 Мб может занять несколько минут. Во многом скрость зависит от возможностей вашего компьютера. В общем случае, для каждого байта дизассемблируемого файла требуется 40 байт памяти. Т.е. для файла размером в 1 Мб требуется 40 Мб памяти, для 2 Мб - 40 Мб памяти, и так далее.

Полученный дизассемблерный листинг не может быть заново скомпилирован "как есть". Мы не ставили перед собой задачи формировать листинг, который мог бы быть рекомпилирован. Это не имеет большого смысла для сколь-либо значимого размера входного файла. Нашей целью было получить продукт, способный БЫСТРО и достаточно качественно дать представление о содержимом исполняемого файла, обнаружить в нём интересующие исследователя места и проанализировать их. Получение же листинга, способного быть откомпилированным, представляется нам задачей мало применимой в реальной жизни в силу внушительных размеров современных исполняемых файлов и, как следствие, КРАЙНЕ ВЫСОКОЙ СЛОЖНОСТИ качественного анализа ВСЕХ данных, содержащихся в программе. Нам кажется, что имеет смысл вести разговор только о возможности извлечь какую-либо процедуру из листинга для использования ее в своих целях (естественно, в рамках действующего законодательства).

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