Статья [0x01] Исследуем Portable Executable (EXE-файл) [Формат PE-файла]
Доброго времени суток, форумчане. Сегодня, мы немного поговорим, рассмотрим и изучим под микроскопом структуру исполняемых файлов Windows ( Portable EXEcutable , или просто PE ), а в следующих статьях изучим технику модифицирования (инфицирования) PE-файлов, для того, чтобы исполнять свой собственный код после запуска чужого исполняемого файла (кстати, эта техника используется многими вирусами, для собственного "паразитического" распространения) и другие "хаки" с использованием знаний о структуре PE.
Portable Executabe файл (PE-файл) — это отдельный исполняемый модуль с расширением .exe (или .dll), получаемый в процессе сборки (компиляции и линковкии). В него включены код, ресурсы (иконки и другие данные), библиотеки, данные программы и т.д..
Давайте проведём аналогию между квартирой и PE-файлом. У каждой квартиры есть свой этаж, своя дверь, прихожая, гостинная, кладовка, свои комнаты, также у каждой квартиры есть своя схема планировки. Вся информация о квартире и сама эта квартира хранится в PE-файле. Взглянем на структуру исполняемого файла, а потом разберём основные части.
- Заголовки
- Секции
Если формально и без аналогий, то заголовки — структуры содержащие необходимые данные для загрузки программы, а секции — блоки данных с различным содержимым произвольного размера. Этим содержимым может быть код, ресурсы, виртуальные адреса функций и т.д..
- DOS заголовок
- Заглушка DOS
- PE заголовок
- Таблица секций
Как я и сказал, заголовки хранят необходимую информацию для загрузки PE-файла. Поэтому данный заголовок является обязательным для загрузки PE-файла, хоть и не несёт в себе большой смысловой информации.
Заголовок состоит из полей, как список состоит из пунктов свойств. Каждый пункт хранит в себе какое-либо значение. Естественно, в файле всё это представленно в байтовом представлении. Не все поля нужны для загрузки (запуска) PE-файла. Поэтому комментировать и рассматривать мы будем только поля, необходимые для загрузки файла в память.
Вот его структура на языке C/C++.
-
e_magic
Двухбайтовое поле e_magic хранит в себе специальную сигнатуру. Эта сигнатура нужна, чтобы указать что это действительно исполняемый файл. Вот она — "MZ". Каждый PE-файл обязан начинаться с неё. Если это не так, файл просто не запустится.
Я выделил самым большим красный прямоугольником область DOS-заголовка. Здесь мы можем увидеть байты в шестнадцатеричном представлении.
Вы можете поинтересоваться, для чего же другие поля? Дело в том, что система Windows построена на базе старой системы MS DOS (была до Windows). И на самом деле, это заголовок для DOS программы. Так вот, эти поля хранятся на случай, если кто-то попытается запустить PE-файл в DOS . В наше время никто практически ей не пользуется, но они остаются, так как если поменяют формат PE-файла, то перестанут работать программы с нынешним стандартом.
Дальше у нас по списку PE-заголовок, который на самом деле, состоит из трёх частей: сигнатуры, файлового подзаголовка и дополнительного подзаголовка.
Вот его структура на языке C/C++:
-
Signature
Это четырёхбайтовое поле содержит сигнатуру, а именно значение 50 45 00 00 (или "PE\x00\x00"). Эта сигнатура указывает на то, что перед нами действительно PE-файл (Ага, ещё одна проверка).
На C/C++ структура данного заголовка выглядит так:
-
Machine
Данное двухбайтовое поле содержит информацию о характеристике процессора, на котором может быть выполнена данная программа. Вот 3 основных значения, которые может принять этот заголовок:
1. IMAGE_FILE_MACHINE_I386 ( 0x014c ) — означает, что программа может выполняться на x32
2. IMAGE_FILE_MACHINE_IA64 ( 0x0200 ) — означает, что программа может выполняться на процессорах Intel Itanium (Intel x64).
3. IMAGE_FILE_MACHINE_AMD64 ( 0x8664 ) — означает, что программа может выполняться на процессорах AMD64 (x64).
Структура дополнительного заголовка представлена следующий C/C++ кодом.
-
Magic
Это двухбайтовое поле отвечает за битность программы (x32/x64). Оно может принимать следующие значения:
1. IMAGE_NT_OPTIONAL_HDR32_MAGIC ( 0x10b ) — означает, что это x32 (x86) исполняемый образ.
2. IMAGE_NT_OPTIONAL_HDR64_MAGIC ( 0x20b ) — означает, что это x64 исполняемый образ.
3. IMAGE_ROM_OPTIONAL_HDR_MAGIC ( 0x107 ) — означает, что это ROM образ.
Heaventools
English
Deutsch
Русский
- Программы
- Ссылки:
Я системный архитектор драйверов устройств под NT/XP, и я использовал PE Explorer для изуче- ния .SYS файлов. Меня интересовали способы взаимодействия этих фай- лов между собой, и ваша программа помогла мне лучше понять это взаимо- действие.
Dominick Cafarelli,
Sniffer Technologies,
Network Associates
Хочу сказать, что PE Explorer, возможно, самая лучшая программа из тех, что мне попадались. Раньше, чтобы получить тот же самый результат, мне приходилось исполь- зовать много разных отдельных программ, некоторые из которых уже довольно старые, еще в духе командной строки. Теперь в них нет больше необходимости. Всё, что надо, есть в PE Explorer на тулбаре.
Chris LaJoie
Я пишу на ассемблере, C и C++. Спустя всего несколько месяцев ис- пользования PE Explorer я поражаюсь, как это я раньше мог обходиться без него. Он стоит каждого цента потра- ченных денег. Спасибо за создание такой замеча- тельной программы.
Robert Limoges
PE Explorer — Список возможностей
PE Explorer содержит средства для дизассемблирования и изучения исполняемых файлов, а также изменения их свойств и ресурсов.
Просмотр и редактирование Portable Executable (PE) файлов
- Работа с 32-битными PE файлами — такими как .EXE, .DLL, драйвера устройств (.SYS, .ACM), ActiveX Controls (.OCX), библиотеки Borland (.DPL и .BPL), файлы визуальных стилей (.MSSTYLES), апплеты контрольной панели (.CPL), скринсейверы (.SCR) и любые другие win32 исполняемые файлы.
- Работа с поврежденными и запакованными файлами: такие файлы открываются в Safe режиме.
- Проверка целостности файла при открытии.
- Вычисление и коррекция контрольной суммы файла.
- Модификация значения точки входа.
- Модификация свойств файлов .
- Автоматичесие распаковщики для UPX, Upack и NSPack.
- Возможно подключение пользовательских плагинов для обработки файлов при открытии.
Средства просмотра
- Headers Info Viewer отображает сводную таблицу данных из заголовка PE файла.
- Data Directories Viewer отображает каталог Data Directories, описывающий содержащиеся в файле данные.
- Sections Header Viewer позволяет просматривать количество секций в файле, их названия, адреса, извлекать или удалять секции из файла.
- Export, Import и Delay Import Viewers отображают списки экспорта и импорта.
- Function Syntax Viewer служит для просмотра и редактирования описаний функций.
- Digital Signature Viewer отображает детали сертификата в блоке цифровой подписи.
- Dependency Scanner показывает цепочку зависимостей и полный путь к каждому модулю.
- Relocation Viewer показывает информацию о базовых поправках, содержащихся в таблице релокаций.
- Debug Information Viewer отображает отладочную информацию, содержащуюся в файле.
- Resource Viewer позволяет просматривать, удалять или извлекать любой тип ресурсов.
Редакторы
- Редактор ресурсов служит для редактирования или замены ресурсов в файле.
- Мастер создания манифестов позволяет добавлять в ресурсы манифест приложения.
- Редактор характеристик изменяет набор флагов в поле Characteristics в заголовке файла.
- Редактор секций служит для редактирования названия и размера секции, восстановления утраченных значений и коррекции характеристик секции.
- Редактор описаний позволяет добавлять комментарии или изменять значения в описаниях функций.
- Средства удаления Debug Information и Relocations
- TimeDateStamp Adjuster позволяет выбрать и изменить значение штампа времени.
Дизассемблер
- Поддерживает Intel 80×86, процессоры семества Pentium и совместимые с ним.
- Набор инструкций x86 (MMX, SSE, SSE2 и SSE3), расширения AMD K6-2 3D-Now!
- Удобная навигация по коду с использованием панелей, поиска и истории переходов.
- Нахождение всех текстовых строк и объектов VCL внутри EXE файла.
- Сохранение сессии и последующее открытие ассемблерного листинга и внесенных изменений.
Дизассемблер, входящий в состав PE Explorer, разработан с целью дать разработчикам и исследователям простой и удобный инструмент для выполнения экспресс-анализа исполняемых файлов.
Чтобы избавить пользователя от рутинной работы и уменьшить объём ручной правки, дизассемблер использует очень гибкий и интелектуальный алгоритм дизассемблирования, способный реконструировать ассемблерный код изучаемого исполняемого файла с высокой степенью достоверности. [ подробнее. ]
Общие настройки программы
- Список из 20-ти последних открывавшихся файлов.
- Добавление часто открывающихся файлов в список избранных.
- Опциональная интеграция с контекстным меню Проводника Windows.
- Настраиваемый внешний вид и цвет у панелей и шрифтов.
- Создание резервной копии редактируемого файла (включено по умолчанию).
- Отображение событий и сообщений в окне лога, запись событий в лог файл.
Скачайте бесплатную ознакомительную версию!
PE Explorer работает на всех версиях Windows
от Windows 95 до XP, Vista, 7, 8, 10 и 11.
Минимальные системные требования:
Процессор Intel Pentium® или AMD K5 166 MHz
16 MB RAM
Если ваша единственная задача — это редактирование ресурсов, и вам совершенно не нужна расширенная функциональность PE Explorer, то вы можете попробовать Resource Tuner — это программа представляет собой редактор ресурсов из PE Explorer, выделенный в отдельный продукт.
Битва потрошителей. Выбираем лучший редактор для вскрытия исполняемых файлов Windows

Так как мы в основном исследуем исполняемые файлы и динамические библиотеки для Windows, я брал только те РЕ-редакторы, которые работают в этой ОС. Если какой-то из инструментов поддерживает другие операционные системы и их исполняемые файлы (например, ELF), то это только плюс, но в данном случае для нас особого значения не имеет.
Мы будем выбирать утилиты на основе разумных и понятных факторов: функциональность, цена, удобство использования и частота обновления. Совсем старые решения, позволяющие редактировать бинарники для MS-DOS или Windows 9x, нам рассматривать ни к чему. Если какой-то из редакторов распространяется платно, то мы воспользуемся ознакомительной версией и отдельно отметим, какие функции в ней доступны. Но самый главный критерий будет состоять во взломе настоящего кракми.
Чтобы не тратить время на создание подопытной программы, мы воспользуемся уже готовой — passCompare35 . Именно на ней и будем испытывать разные тулзы. По большому счету, чтобы взломать наш простой крякмис, PE-редактору надо обладать не такой уж широкой функциональностью: перейти по указанному адресу и переписать команду (желательно в дизассемблерном листинге). Править циферки в шестнадцатеричном дампе мне совсем не хочется (вероятно, тебе тоже), поэтому наличие встроенного дизассемблера запишем в ключевые свойства.
Как ты помнишь, с помощью отладчика мы нашли в памяти адрес инструкции (см. четвертую статью «Фундаментальных основ»), которая определяет ход выполнения программы при вводе пароля. А благодаря сведениям из третьей статьи этот виртуальный адрес у нас получилось преобразовать в физический, находящийся на носителе. Таким образом, перейдя в исполняемом файле по адресу 0x402801 и заменив там инструкцию test на xor , мы получим программу, принимающую любые пароли. Меньше слов, больше дела!
PE-Explorer
Разработчик: Heaventools Software
Сайт: http://www.heaventools.ru/pe-explorer.htm
Дата выхода последней версии: Октябрь, 2009
Стоимость: $129 – персональная лицензия
Под первым номером идет довольно распространенный редактор PE-Explorer. В отличие от своего собрата Resource Tuner, он способен редактировать не только ресурсы приложения, но и код. Несмотря на свой почтенный возраст, исправно работает даже в Windows 10. К сожалению, PE-Explorer умеет работать только с 32-битными файлами и при попытке открыть 64-битный бинарник сообщает об ошибке.
Утилита обладает богатой функциональностью: отображает все элементы заголовка РЕ, определяет, к каким DLL происходит обращение, предсказывает поведение программ и логику взаимодействия с другими модулями и даже открывает запакованные UPX, UPack или NSPack файлы. Кроме того, она позволяет просматривать и редактировать секции PE-файла, исследовать содержимое таблиц импорта и экспорта и проверять наличие и целостность цифровой подписи. В качестве «вишенки на торте» тут присутствует полноценный дизассемблер.
Но это только на словах, а на деле мы его сейчас проверим. Из-за того что продукт платный, я использовал триальную версию, готовую работать на протяжении 30 дней. Об урезанных функциях ничего сказано не было.
Запустим редактор и сразу же откроем наше подопытное приложение. PE-Explorer первым делом выводит информацию о заголовке PE-файла. Для получения сведений об остальных разделах достаточно пощелкать кнопки на панели инструментов. Жмем пиктограмму Disassembler и открываем окно для выбора поддерживаемых инструкций: SSE, SSE2 и прочее. Указываем необходимые и начинаем процесс нажатием кнопки Start Now .
В открывшемся окне большую часть занимает область с дизассемблерным листингом, чуть ниже располагается шестнадцатеричный дамп. Если в заголовке нижней панели выбрать вкладку Strings, то отобразятся все строки в исследуемом приложении. Так что поиском можно найти и эталонный пароль. Однако для этого пришлось бы перебрать весь внушительный список доступных строк, так что отложим этот вариант до худших времен.
Так как мы с помощью отладчика нашли адрес инструкции, которая отвечает за ход выполнения программы, то попробуем проверить этот адрес в PE-Explorer: нажимаем Ctrl-F (или Search → Find) и вводим адрес для поиска: 402801 .
Что ж, я немного разочарован результатом дизассемблирования. Даже отладчик в этом месте показывает мне инструкцию test , а здесь я вижу лишь начало ее шестнадцатеричного кода: 0х85 . При этом я не могу редактировать код! Зачем мне все эти возможности, если утилита не позволяет делать самую базовую вещь?
Я даже не могу списать этот недочет на ограничения демоверсии, так как о ее отличиях от платной ничего толком не сказано. Допускаю, что с теми целями, для которых этот продукт предназначен (статическое изучение приложения и вектора его выполнения), он справляется хорошо. Однако нашим требованиям программа не соответствует, поэтому смело вычеркиваю PE-Explorer из списка кандидатов.
FlexHex
Разработчик: Heaventools Software
Сайт: http://www.heaventools.ru/flexhex-hex-editor.htm
Дата выхода последней версии: Июль, 2018
Стоимость: $59,95
Думаю, нужно дать разработчику еще один шанс, поэтому рассмотрим другую утилиту Heaventools Software — hex-редактор FlexHex. Это инструмент для редактирования любых файлов, процессов или устройств в двоичном формате, ASCII и Unicode. По словам авторов, редактор умеет работать с файлами просто гигантского размера — 8 эксабайт. Кроме того, он поддерживает множество типов данных: байты, слова, двойные слова, восьмибитовые слова, различные десятичные значения со знаком и без, 32- и 64-битовые целые.
Сложные типы данных тут могут быть определены самим пользователем — это структуры, объединения, массивы, перечисления, строки и их сочетания. Обещают прямое редактирование любых значений, в том числе шестнадцатеричных, строковых, изменение областей памяти и типизированных данных. Поддерживаются битовые операции (NOT, AND, OR и XOR над блоками данных) и, конечно же, арифметические операции: сложение, вычитание, умножение, деление и взятие остатка.
Однако главная особенность FlexHex — это возможность сравнения файлов целиком или отдельными блоками. При этом использование карт сравнения позволяет сделать процесс более интуитивным и наглядным.
Все это хорошо, но как утилита справится со взломом — нашей элементарной задачкой? Отсутствие дизассемблера сразу намекает нам, что придется работать в hex-кодах. Запустим FlexHex и откроем с его помощью наш крякмис.
Первым делом попробуем найти смещение 402801 . Кликаем Navigate → Go To и в списке слева выбираем пункт Address, а в поле Enter address вводим значение для поиска. Убеждаемся, что включен режим Hex , и нажимаем кнопку Go To.
Однако результат поиска выносит нас далеко за границы приложения. Обрати внимание, что последние читаемые символы находятся по смещению 0x3659F0 . Если напрячь память, то вспоминается, что в заголовке РЕ базовый адрес (или адрес загрузки модуля) прописан как 0x400000 . А здесь он даже не учитывается!
Ладно, как говорил дедушка Ленин, мы «пойдем другим путем». Строго говоря, FlexHex не понимает формат РЕ и потому его нельзя признать полноценным PE-редактором. Так что нам ничего не остается, как править байтики. Из того же отладчика, где мы нашли проверяющую пароли инструкцию, возьмем уникальную последовательность байтов: 85 C0 74 3C 68 . Она покрывает ассемблерные команды:
Я выбрал такую длинную последовательность, чтобы не было ложных срабатываний. За ключевым байтом 0x74 тут скрывается ассемблерная инструкция JZ . Чтобы сделать из нее JNZ , достаточно переписать как 0x75 . В итоге мы получим программу, кушающую любые пароли, кроме эталонного.
С помощью Search → Find открываем окно и указываем в качестве типа для поиска Hex Bytes и направление. В поле ввода пишем нашу последовательность байтов: 85 C0 74 3C 68 . Есть совпадение! Теперь ставим курсор на 74 , нажимаем Delete и вписываем на этом месте 75 . Сохраняем результат и закрываем редактор. Проверь «пропатченное» приложение, оно теперь должно работать значительно лучше.
В целом я бы не сказал, что этот редактор отличается значительным удобством и соответствует нюансам работы благородного крекера. Поэтому отдавать за него 60 долларов кровных лично я бы не стал.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.

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