Заголовок exe файла windows

Заголовок exe файла windows

Исследуем формат EXE-файла

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

EXE-файлы появились ещё в DOS и потом они с небольшими изменениями перекочевали в Windows. Формат EXE-файла под Windows называется PE-файлом. Он организован в виде линейного потока данных.

Формат PE-файла

Заголовок MS-DOS
Программа-заглушка
Заголовок PE
Доп. заголовок PE
Массив DataDir
Заголовки сегментов
Тела сегментов
Остальные области данных

Заголовок MS-DOS не нов, он используется начиная с MS-DOS версии 2. Если вы пытаетесь запустить Windows-программу под DOS-ом, то программа-заглушка, которая размещена ниже, сообщит о невозможности этого сделать. Если бы заголовок MS-DOS и программа-заглушка не были бы включены в PE-файл, то скорее всего бы это бы привело к сбою.

Залоговок MS-DOS (размер 40H байт)

Адрес Тип Имя Описание
00h word Magic Магическая сигнатура DOS-файла — два символа «MZ», явно от MZ -club 🙂
02h word LastByteCount Количество байт на последней странице файла
04h word PageCount Количество страниц в файле
06h word RelocCount Количество релокейшенов
08h word HeaderSize Размер заголовка в параграфах
0Ah word MinAlloc Мин. выделение памяти в параграфах
0Ch word MaxAlloc Макс. выделение памяти в параграфах
0Eh word InitSS Начальное (относительное) значение регистра SS
10h word InitSP Начальное значение регистра SP
12h word CheckSum Контрольная сумма
14h word InitIP Начальное значение регистра IP
16h word InitCS Начальное (относительное) значение регистра CS
18h word RelocAddr Адрес на релокейшены и программу-заглушку
1Ah word OverlayCount Количество оверлеев
1Ch word Res1[4] Зарезервировано
24h word OEMIdentifier Для OEMInfo
26h word OEMInfo Информация о программе
28h word Res1[10] Зарезервировано
3Ch dword PEHeaderAddr Адрес в файле заголовка PE

Для Windows-программы заголовок MS-DOS не содержит релокейшины (пока даже и не знаю что это такое), то есть Relocations = 0, поэтому RelocAddr указывает сразу на программу-заглушку. Но нам важен заголовок PE, его адрес находиться в PEHeaderAddr.

Залоговок PE (размер 18H байт)

Адрес Тип Имя Описание
00h dword Magic Магическая сигнатура PE-файла 4550H или «PE», 0H, 0H
04h word CPUType Тип процессора
06h word SectionCount Количество сегментов
08h dword DateTime Дата/время создания/модификации линкером
0Сh dword SymbolTableAddr Адрес местонахождения таблицы символов
10h dword SymbolTableSize Размер таблицы символов
14h word OptionalHeaderSize Размер доп. заголовка PE
16h word Flags Предназначение программы

Сразу за основным заголовком идёт дополнительный заголовок PE.

Доп. залоговок PE (размер 18H — 77H байт)

Адрес Тип Имя Описание
18h word Magic Всегда 10Bh
1Ah byte MajorLinkVer Версия линкера, создавшего данный файл
1Bh byte MinorLinkVer
1Ch dword CodeSize Размер исполнительного кода
20h dword InitDataSize Размер инициализированных данных
24h dword UnInitDataSize Размер неинициализированных данных
28h dword EntryPointAddr Адрес, относительно ImageBase, по которому передаётся управление при запуске программы или адрес инициализации/завершения библиотеки
2Ch dword CodeBase Относительное смещение сегмента кода
30 dword DataBase Относительное смещение сегмента неинициализированных данных
34h dword ImageBase Предподчтительный адрес для загрузки исполнимого файла (по умолчанию 400000H)
38h dword SectionAlign Выравнивание программных секций (по умолчанию 1000H)
3Ch dword FileAlign Минимальная гранулярность сегментов, то есть размер сегментов должен быть кратен FileAlign, должен быть равен значению степени 2 между 200H и 10000H (по умолчанию 200H)
40h word MajorOSVer Старший номер версии OS, необходимый для запуска программы
42h word MinorOSVer Младший номер версии OS
44h word MajorImageVer Пользовательский старший номер версии, задается пользователем при линковке программы и им же и используется
46h word MinorImageVer Пользовательский младший номер версии, задается пользователем при линковке программы и им же и используется
48h word MajorSubSysVer Старший номер версии Win32
4Ah word MinorSubSysVer Младший номер версии Win32
4Ch dword Res1
50h dword ImageSize Виртуальный размер в байтах всего загружаемого образа, вместе с заголовками, кратен ObjectAlign
54h dword HeaderSize Общий размер всех заголовков: MS-DOS, PE, доп PE и всех сегментов
58h dword CheckSum Контрольная сумма (не используется и равна 0)
5Ch word SubSystem Подсистема, необходимая для запуска данного файла //(0 — неизвестная подсистема, 1 — не требует подсистему, 2 — Windows GUI, 3 — Windows консоль. )
5Eh word DllFlags Специальные флаги при загрузке, начиная с NT 3.5 не используются
60h dword StackReserveSize Память, требуемая для стека приложения, память резервируется, но выделяется только StackCommitSize байтов, следующая страница является охранной. Когда приложение достигает этой страницы, то страница становится доступной, а следующая страница — охранной, и так до достижения нижней границы, после чего Windows убивает программу с сообщением о конце стека
64h dword StackCommitSize Объем памяти, отводимый в стеке немедленно после загрузки
68h dword HeapReserveSize Максимальный возможный размер локального хипа
6Ch dword HeapComitSize Отводимый при загрузке хип
70h dword LoaderFlags Данный параметр устарел
74h dword DataDirSize Указывает размер массива DataDir, расположенный ниже (по умолчанию 10h)
Читайте также:  Windows mobile для виртуальной машины

Далее идёт массив DataDir, 8-байтные элементы которого состоят из двух 4-х байтных: адрес и размер.

Массив DataDir (размер 78H — F8H байт)

Адрес Тип Имя Описание
78h qword ExportDir Каталог экспортируемых объектов
80h qword ImportDir Каталог импортируемых объектов
88h qword ResourceDir Каталог ресурсов
90h qword ExceptionDir Каталог исключений
98h qword SecurityDir Каталог безопастности
A0h qword BaseRelocDir Каталог переадресаций
A8h qword DebugDir Отладочный каталог
B0h qword CopyrightDir Каталог описаний
B8h qword CpuSpecDir Каталог значений, специфичных для процессора
C0h qword TLSDir Каталог TLS (Thread local storage — локальная память потоков)
C8h qword ConfigDir Каталог конфигураций загрузки
D0h qword ResDir11
D8h qword ResDir12
E0h qword ResDir13
E8h qword ResDir14
F0h qword ResDir15

Элемент массива DataDir (размер 8 байт)

Адрес Тип Имя Описание
00h dword Addr Адрес каталога
04h dword Size Размер каталога

Далее идёт подряд несколько сегментов, количество указано в SectionCount.

Заголовок сегмента (размер 2Ch байт)

Адрес Тип Имя Описание
00h char[8] SectName Имя секции, если имя Практически любая программа под Windows работает с такими её DLL-ками: kernel32.dll, user32.dll, gdi32.dll и т.д.. Поэтому, EXE-шник должен уметь импортировать функции данных библиотек, то есть работать с каталогом импорта ImportDir. Каталог импорта сразу же начинается с таблицы импорта ImportDirTable, которая описывает остальную информацию об импорте. Такая таблица состоит из элементов ImportDirTableItem, указывающих, как минимум, на каждую импортируемую библиотеку. Последний элемент, указывающий на конец таблицы, заполнен нулями.

Элемент таблицы каталога импортируемых объектов ImportDirTableItem (размер 14h байт)

Адрес Тип Имя Описание
00h dword FuncNameList Список имён импортируемых функций
04h dword Res1
08h dword Res2
0Ch dword LibName Имя библиотеки
10h dword FuncAddrList Список адресов импортируемых функций

Параметр LibName указывает на имя библиотеки, которое должно заканчиваться нулём. FuncNameList указывает на список адресов (0-ой адрес — конец списка), по которым находится сначала Hint — (укороченный идентификатор точки входа), а затем имя функции, заканчивающееся нулём. Параметр FuncAddrList указывает на точно такой же список адресов, находящийся (по моим наблюдениям) перед ImportDirTable.

Формат EXE-файла здесь описан не полностью. Остальное будет описано позже. Однако, этого уже достаточно для создания компилятора.

Для глубокого изучения EXE-шника, написана специальная программа «EXE-исследователь». Последнюю версию данной программы можно скачать на страничке Download

Приложение А Форматы заголовков EXE-файлов

Приложение А Форматы заголовков EXE-файлов

Формат заголовка обычного EXE-файла

В начале EXE-файла расположена форматированная часть заголовка EXE-файла (Таблица А-1).

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

Таблица А-1. Формат заголовка обычного EXE-файла

Формат заголовка NE-executable EXE-файла

В состав старого заголовка входят:

– обычный EXE-заголовок (Таблица A-2);

– указатель на новый заголовок (если в ЕХЕ-заголовке в начале таблицы перемещаемых элементов – по смещению18h – стоит 40h или больше, то слово, расположенное по смещению 3С^ содержит смещение начала нового заголовка);

Таблица A-2. Формат обычного EXE-заголовка в NE-executable EXE-файле

В состав нового заголовка входят:

– инфоблок (Таблица A-3);

– таблица сегментов (Таблица A-4);

– таблица ресурсов (Таблица A-5);

Таблица A-3. Формат NE-заголовка

Таблица A-4. Формат таблицы сегментов

Таблица A-5. Формат таблицы ресурсов

– таблица резидентных имен;

– таблица ссылок на модули;

– таблица импортируемых имен;

– таблица входов (Таблицы A-6 и A-7);

– таблица нерезидентных имен.

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

Сразу за заголовком находится таблица сегментов. В ней содержится описание каждого сегмента исполняемого файла.

Таблица ресурсов. Ресурсами являются все основные объекты интерфейса – диалоговые окна, меню, курсоры, растровые изображения, значки и так далее.

Формат таблицы ресурсов (смещения относительно начала входа каждого ресурса). Значения в диапазоне смещений 02-12h повторяются в таблице до тех пор, пока величина по смещению 02h не станет равной нулю. Значения в диапазоне от 0Ah до 12h повторяются столько раз, сколько указано по адресу 04h.

Таблица A-6. Таблица входов перемещаемого сегмента

Таблица A-7. Таблица входов фиксированного сегмента

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

Данные в таблице находятся в виде:

– длина строки (равна нулю, если в таблице нет дополнительных строк);

– строка резидентного имени (первая строка – имя модуля);

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

Таблица ссылок на модули. В ней содержится список смещений имен модулей, хранящихся в таблице импортируемых имен. Каждый вход в таблице есть двубайтное последовательное число.

Таблица импортируемых имен. В ней записаны имена модулей, импортируемых в исполняемый файл. Каждый вход состоит из двух частей – байта длины строки и собственно строки.

Таблица входов. В ней содержатся группы точек входа в исполняемый файл.

Эти группы создаются редактором связей и последовательно пронумерованы (начиная с 1). Каждая группа начинается с двухбайтного заголовка, который содержит число входов в группе (00h – конец таблицы) и дополнительную информацию о сегменте (FFh – перемещаемый, FEh – вход относится к константе, определенной внутри модуля, иначе вход является индексом сегмента). Для перемещаемых сегментов каждый вход состоит из шести байт, а для фиксированных – из трех.

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

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

– тип адресации (только сегмент, только смещение, или и то, и другое);

– тип перемещения (внутренняя ссылка, импортируемый порядковый номер, импортируемое имя);

– номер сегмента или порядковый ID (для внутренних ссылок);

– индекс таблицы ссылок или порядковый номер функции;

– индекс таблицы ссылок или смещение таблицы имен (для импортируемых имен).

Формат заголовка PE-executable EXE-файла

В состав старого заголовка входят:

– обычный EXE-заголовок (Таблица A-8);

– указатель на PE-заголовок (если в ЕХЕ-заголовке в начале таблицы перемещаемых элементов – по смещению 18h – стоит 40h или больше, то слово, расположенное по смещению 3С^ содержит смещение начала PE-заголовка);

В состав нового заголовка входят:

– PE-заголовок (Таблица A-9);

– таблица объектов (Таблица A-10);

– таблицы ресурсов, импортируемых и экспортируемых имен, настройки адресов.

Таблица A-8. Формат обычного EXE-заголовка в PE-executable EXE-файле

Таблица A-9. Формат PE-заголовка

Таблица A-10. Формат таблицы объектов

Данный текст является ознакомительным фрагментом.

Продолжение на ЛитРес

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

Форматы файлов и форматы кодирования

Форматы файлов и форматы кодирования Форматов мультимедийных файлов существует не меньше, чем форматов файлов графических. Как и в случае с интернет-графикой, Web-обозреватели поддерживают далеко не все мультимедийные форматы, а только немногие. (Хотелось бы автору

Форматы исполняемых файлов

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

Форматы файлов шрифтов

Форматы файлов шрифтов Существуют два типа шрифтов: растровые и контурные (контурные шрифты часто называют масштабируемыми). Эти типы шрифтов имеют разные свойства и обрабатываются различными способами. Большинство серверов шрифтов, предназначенных для выполнения в

Форматы файлов и форматы кодирования

Форматы файлов и форматы кодирования Форматов мультимедийных файлов существует не меньше, чем форматов файлов графических. Как и в случае с интернет-графикой, Web-обозреватели поддерживают далеко не все мультимедийные форматы, а только немногие. (Хотелось бы автору

11.4.2. Форматы файлов шрифтов

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

Форматы графических файлов

Форматы графических файлов Adobe InDesign может импортировать графические файлы различных форматов – как наиболее распространенные AI, BMP, EPS, GIF, JPEG, PDF, PSD, TIFF, так и более редкие DCS, EMF, PCX, PICT, PNG, SCT (ScitexCT), WMF.Все графические форматы и файлы разделяются по типу информации, которую они

Форматы графических файлов

Форматы графических файлов Любое графическое изображение независимо от того, векторное оно или растровое, может храниться в компьютере исключительно за счет записывания его в отдельный файл. Каждый файл всегда имеет какой-то определенный формат.Формат указывает на то,

3.1.6. Двоичные форматы файлов

3.1.6. Двоичные форматы файлов Если в операционной системе применяются двоичные форматы для важных данных (таких как учетные записи пользователей), вполне вероятно, что традиции использования читабельных текстовых форматов для приложений не сформируются. Более подробно

3.1.6. Двоичные форматы файлов

3.1.6. Двоичные форматы файлов Если в операционной системе применяются двоичные форматы для важных данных (таких как учетные записи пользователей), вполне вероятно, что традиции использования читабельных текстовых форматов для приложений не сформируются. Более подробно о

Глава 4 Форматы графических файлов

Глава 4 Форматы графических файлов Для хранения растровой графики существует большое количество различных форматов файлов. Среди них есть как универсальные форматы, не привязанные к какой-либо конкретной программе, так и специфические «персональные» форматы растровых

Форматы графических файлов

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

Форматы файлов

Форматы файлов Существует множество способов сохранить информацию об изображении и, следовательно, множество форматов файлов. Внимание! Чтобы избежать потерь данных, при работе с изображениями сохраняйте их в формате TIFF или в «родном» формате программы-редактора. JPEGВ

Читайте также:  Windows 10 правильная сборка
Оцените статью