683.50K
Category: softwaresoftware

Формат PE

1.

Формат PE

2.

Формат PE
• Исполняемые модули Windows (.exe и .dll
файлы) имеют формат PE (Portable
Executable - переносимый исполняемый)
• PE представляет собой модифицированную
версию COFF формата файла для Unix.
(PE/COFF - альтернативный термин)
• PE представляет все данные необходимые
для проецирования (отображения) файла в
память.
• Предполагается, что модуль будет загружен
по определенным адресам в памяти, но в
случае необходимости он может быть
перемещен
• Модуль может использовать другие модули
(быть зависимым от других модулей). В этом
случае Windows загружает необходимые
модули автоматически.

3.

Формат PE
Пример запуска программы
Windows
1. Пользователь запускает
приложение Program.exe. Модуль
должен быть загружен по адресу
0x03 и зависит от других модулей:
• user32.dll
• kernel32.dll
• proglib.dll
Windows размещает Program.exe по
адресу 0x03, но управление модулю
не передается, пока не будут
загружены библиотеки, от которых он
зависит.

4.

Формат PE
Пример запуска программы
Windows
1. Windows загружает
соответствующие модули в
память.
Каждый модуль содержит адрес, по
которому его необходимо загрузить.
Если модуль отсутствует, приложение
Program.exe запущено не будет
Модуль proglib.dll зависит от
модуля add.dll, который должен
быть загружен по адресу 0x22

5.

Формат PE
Пример запуска программы
Windows
add.dll не может быть загружен по
адресу 0x22, так как произойдет
конфликт с kernel32.dll
Модуль содержит данные для
перемещения его по другим
адресам памяти. Windows загрузит
его по адресу 0xE1

6.

Формат PE
Пример запуска программы
Windows
1. add.dll загружается по адресу
0xE1
Программа готова к работе

7.

Формат PE
Общая структура PE файла
Заголовок DOS присутствует для
совместимости.
Заголовок Windows хранит основную
информацию о модуле, например
для какого процессора он
скомпилирован, по какому адресу
нужно загрузить модуль в память
Таблица объектов располагается
сразу после заголовков. Она хранит
информацию о разделах:
•Название раздела
•Смещение раздела в файле.
•Адрес, по которому необходимо
загрузить раздел.
•Размер раздела.

8.

Формат PE
Заголовок DOS
DOS_magic всегда равен 0x5A4D.
Это соответствует символам “MZ” инициалы Марка Збиковски, одного
из создателей MS-DOS.
DOS_lfarlc позволяет различать DOS
и Windows программы. Если
значение поля >=0x40, значит файл
содержит еще один заголовок
(обычно заголовок Windows)
DOS_lfanew содержит смещение
другого заголовка

9.

Формат PE
Программа-заглушка
Любая программа для Windows содержит в себе также программу
для DOS. По умолчанию компоновщик добавляет небольшую
программу, сообщающую, что программа не может выполняться в
DOS.

10.

Формат PE
Заголовок Windows
Обязательный заголовок
Заголовок Windows состоит из
•Обязательного заголовка
•Необязательного заголовка
IMAGE_NT_SIGNATURE –
сигнатура заголовка,
соответствует строке «PE»
Machine – код процессора, для
которого скомпилирован файл
0x14C – Intel 386
0x8666 – AMD64
NumberOfSections – количество
разделов в файле
Characteristics – слово, каждый
бит которого является флагом
Примеры флагов:
•Исполняемый файл
•DLL
•32-битный файл

11.

Формат PE

12.

Формат PE
Необязательный заголовок
IMAGE_DIRECTORY_ENTRY_EXPORT
Информация о функциях, которые
данный модуль делает доступными для
других модулей
IMAGE_DIRECTORY_ENTRY_IMPORT
Информация о модулях, от которых
зависит данный модуль. Содержит также
имена функций, которые планируется
импортировать из других модулей
IMAGE_DIRECTORY_ENTRY_RESOURCE
Информация о ресурсах (иконки, курсоры,
изображения), которые содержит данный
модуль
IMAGE_DIRECTORY_ENTRY_BASERELOC
Информация для правильного
перемещения файла в памяти

13.

Формат PE
Таблица объектов (разделов)
Таблица объектов представляет
собой массив структур, каждая из
которых описывает раздел
Name – имя раздела
Misc/VirtualSize – точный размер
раздела в виртуальной памяти
VirtualAddress – адрес раздела в
памяти
SizeOfRawData – размер раздела
в файле, округленный до
значения FileAlignment
необязательного заголовка
PointerToRawData – смещение
раздела относительно начала
файла
Characteristics – флаги раздела.
Примеры флагов:
•Readable
•Executable
•Contains code

14.

Формат PE

15.

Формат PE
Типичные разделы
.text – раздел программного кода
(иногда называется CODE)
.data – инициализированные
данные (иногда DATA)
.textbss – неинициализированные
данные (иногда .bss)
.rdata – данные только для чтения
.rsrc – ресурсы
.idata – данные об импортируемых
функциях
.edata – данные об экспортируемых
функциях
.reloc – данные для перемещения

16.

Формат PE
Экспорт функций
Модуль экспортирует
функцию по имени или по
номеру.
Структуры, описывающие
экспорт, содержат всю
информацию, необходимую
для нахождения адреса
функции.
В данном примере для
функции не хранится
спецификация, т.е. тот, кто
будет ее вызывать обязан
знать количество и тип
параметров и тип
возвращаемого значения
Просмотр user32.dll с помощью PE Browser:

17.

Формат PE
Импорт функций
Просмотр explorer.exe с помощью PE Browser:
Для импорта модуль хранит
имя другого модуля и список
функций
Программный код,
использующий импортируемую
функцию, вызывает ее через
косвенную адресацию
«вызвать функцию,
находящуюся по адресу,
записанному вот в эту ячейку».
Загрузчик обязан сделать так,
чтобы к моменту начала
работы программы в «этой
ячейке» был правильный адрес

18.

Формат PE
Искажение имен функций
English     Русский Rules