Приложение А
Форматы заголовков ЕХЕ-файлов
Формат заголовка обычного ЕХЕ-файла
Таблица А-1. Формат заголовка обычного ЕХЕ-файла.
Смещ. |
Описание |
+00h |
Signature - сигнатура ЕХЕ-файла ('MZ'). Инициалы Марка Збиковски, |
+02h |
PartPag - длина последней станицы |
+04h |
PageCnt - длина файла в страницах (по 512 байт) |
+06h |
ReloCnt - число элементов в таблице настройки адресов |
+08h |
HdrSize - длина заголовка в параграфах (по 16 байт) |
+OAh |
MinMem - минимальный объем памяти, которую нужно выделить после |
+OCh |
MaxMem - максимальный объем памяти, которую нужно выделить после |
+OEh |
ReloSS - сегментное смещение сегмента стека (для установки SS) |
+10h |
ExeSP - значение SP, устанавливаемое при входе |
+12h |
ChkSum - контрольная сумма |
+14h |
ExelP - значение IP, устанавливаемое при входе (стартовый адрес) |
+16h |
ReloCS - сегментное смещение сегмента кода (для установки CS) |
+18h |
TablOff - смещение в файле первого элемента таблицы настройки адресов |
+lAh |
Overlay - номер оверлея (0 - для корневого модуля) |
В начале ЕХЕ-файла расположена форматированная часть заголовка
ЕХЕ-файла (Таблица А-1).
Далее следует таблица настройки адресов (Relocation Table), состоящая
из длинных указателей (смещение:сегмент) на те слова в загрузочном
модуле, которые содержат настраиваемые сегментные адреса. Примеча-
ние: элементы таблицы настройки могут быть расположены не по
порядку.
Формат заголовка NE-executable ЕХЕ-файла
В состав старого заголовка входят:
- обычный ЕХЕ-заголовок (Таблица А-2);
- зарезервированная часть;
- указатель на новый заголовок (если в ЕХЕ-заголовке в начале таб-
лицы перемещаемых элементов - по смещению 18h - стоит 40h или
больше, то слово, расположенное по смещению 3Ch, содержит сме-
щение начала нового заголовка);
- DOS-программа (STUB).
В состав нового заголовка входят:
- инфоблок (Таблица А-3);
- таблица сегментов (Таблица А-4);
- таблица ресурсов (Таблица А-5);
- таблица резидентных имен;
- таблица ссылок на модули;
/
Смещ. |
Описание |
+00h |
HdrSize - длина заголовка в параграфах (по 16 байт) |
+20h |
Резерв |
+3Ch |
Смещение начала нового заголовка |
+40h |
DOS-программа (STUB) |
Таблица А-3. Формат NE-заголовка.
Смещ. |
Описание |
|
+00h |
Сигнатура NE-executable ('NE') |
|
+02h |
Версия редактора связей |
|
+03h |
Номер версии редактора связей |
|
+04h |
Смещение таблицы входов (относительно начала заголовка) |
|
+06h |
Длина таблицы входов (в байтах) |
|
+08h |
Зарезервировано: 32-битная контрольная сумма |
|
+OCh |
Набор флагов: (16 бит) |
|
Бит 0 |
SINGLEDATA, в файле содержится только один сегмент данных. |
Таблица А-3. Формат NE-заголовка. (Продолжение}
Смещ. |
Описание |
|
+OCh |
Набор флагов: (16 бит) |
|
|
Бит1 |
MULTIPLEDATA, в файле содержится несколько сегментов |
|
Бит 2 |
Зарезервировано |
|
БитЗ |
Файл может быть загружен только в защищенном режиме |
|
Бит 8 |
Содержится код, не совместимый с библиотеками MSWindows для |
|
Бит 9 |
Код, совместимый с библиотеками MS Windows |
|
Бит 11 |
В первом сегменте содержится код, загружающий прикладную |
Бит 13 |
Файл был создан, несмотря на обнаруженные редактором связи |
|
Бит 14 |
Исполняемый файл размещается в EMS |
|
Бит 15 |
Библиотечный модуль. При загрузке библиотеки CS:IP указывает модуля |
|
+OEh |
Число автосегментов данных: если SINGLEDATA равен нулю, |
|
+10h |
Начальный размер (в байтах) локальной кучи. При ее отсутствии равен нулю |
|
+12h |
Начальный размер стека (в байтах). Равен нулю, если SS не равно DS, |
|
+14h |
CS:IP |
|
+18h |
SS:SP |
|
+lCh |
Число входов в таблице сегментов |
|
+lEh |
Число входов в таблице ссылок на модули |
|
+20h |
Число байт в таблице нерезидентного имени i |
|
+22h |
Относительное смещение начала таблицы сегментов от начала нового |
|
+24h |
Относительное смещение начала таблицы ресурсов от начала нового |
|
+26h |
Относительное смещение начала таблицы резидентного имени от начала |
Таблица А-3. Формат NE-заголовка. (Окончание)
Смещ. |
Описание |
|
+28h |
Относительное смещение начала таблицы ссылок на модули от начала |
|
+2Ah |
Относительное смещение начала таблицы импортируемых имен от начала |
|
+2Ch |
Относительное смещение начала таблицы нерезидентных имен от начала |
|
+30h |
Число перемещаемых точек входа^- |
|
+32h |
Множитель смещении. Используется при размещении логических секторов. |
|
+34h |
Число ресурсных сегментов |
|
+36h |
Флаги, определяющие рабочую операционную систему |
|
Бит 0 |
Неизвестная |
|
Бит1 |
OS/2 |
|
Бит 2 |
Microsoft Windows |
|
БитЗ |
Зарезервировано |
|
Бит 4 |
Зарезервировано |
|
+37h |
Дополнительные флаги |
|
Бит1 |
Программа для Windows 2.x. Может быть запущена в защищенном |
|
Бит 2 |
Программа для 2.x. Может использовать пропорциональные |
|
БитЗ |
В файле содержится область быстрой загрузки |
|
+38h |
Указатель начала области быстрой загрузки (используется только Windows) |
|
+3Ah |
Длина области быстрой загрузки (используется только Windows) |
|
+3Ch |
Зарезервировано ' |
|
+3Eh |
Версия Windows (используется только Windows) |
Таблица А-4. Формат таблицы сегментов.
Смещ. |
Описание |
|
+00h |
Смещение логического сектора (в байтах)относительно начала файла. При |
|
+02h |
Длина сегмента в файле. Если значение 0, то смещение 64 Кбайт |
|
+04h |
Флаги |
|
|
Бит 0 |
Сегмент данных, иначе сегмент кода |
|
Бит 1 |
В загрузчике имеется память, отведенная для сегмента |
|
Бит 2 |
Сегмент загружен |
|
БитЗ |
Зарезервировано |
Бит 4 |
MOVEABLE сегмент, иначе - FIXED |
|
БитЗ |
Сегмент PURE или SHAREABLE, иначе - IMPURE или |
|
Бит 6 |
PRELOAD сегмент, иначе - LOADONCALL |
|
Бит? |
Для сегмента кода - EXECUTEONLY, для сегмента данных - |
|
Бит 8 |
В сегменте содержатся перемещаемые данные |
|
Бит 9 |
Подстраивающийся сегмент |
|
Биты 10,11 |
Зарезервировано |
|
Бит 12 |
Сбрасываемый (discardable) сегмент |
|
Биты 13-15 |
Зарезервировано |
|
+06h |
Минимальный объем (в байтах), необходимый для размещения сегмента |
Таблица А-5. Формат таблицы ресурсов.
Смещ. |
Описание |
+00h |
Единица смещения данных ресурса |
+02h |
Тип ресурса. Если установлен старший бит, то это один из типов ресурсов, |
+04h |
Число ресурсов данного типа |
+06h |
Зарезервировано |
+OAh |
Смещение данных ресурса относительно начала файла в единицах, |
Таблица А-5. Формат таблицы ресурсов. (Окончание) |
||
Смещ. |
Описание |
|
+OCh |
Длина ресурса (в байтах) |
|
+OEh |
Флаги |
|
Бит 4 |
MOVEABLE |
|
Бит 5 |
PURE - возможность совместного использования |
|
Бит 6 |
PRELOAD - предварительно загружаемый |
|
+10h |
Определяет (если старший бит равен единице) или указывает на ID ресурса |
|
+12h |
Зарезервировано |
|
+16h |
Длина или имя типа. Ноль находится в конце таблицы ресурсов |
|
+17h |
Определяет тип ресурса или текст имени. В имени различаются кейсы |
|
Таблица А-6. Таблица входов перемещаемого сегмента. |
||
Смещ. |
Описание |
|
+00h |
Флаги |
|
|
Бит 0 |
Экспортируемый вход |
|
Бит1 |
Сегмент совместно использует глобальный сегмент данных |
|
Биты 3-7 |
Если в ЕХЕ-файле содержится код, выполняющий кольцевые |
+01h |
Инструкция INT 3Fh |
|
+03h |
Номер сегмента |
Таблица А-7. Таблица входов фиксированного сегмента.
Смещ. Описание |
|||
+00h |
Флаги |
||
Бит 0 |
Экспортируемый вход ' |
||
Бит1 |
Сегмент совместно использует глобальный сегмент данных |
||
Биты 3-7 |
Если в ЁХЕ-файле содержится код, выполняющий кольцевые |
||
+01h |
Смещение сегмента |
- таблица импортируемых имен;
- таблица входов (Таблицы А-6 и А-7);
- таблица нерезидентных имен.
В заголовке нового стиля содержится вся информация, необходимая
для сегментированного исполняемого файла - заголовки таблицы сег-
ментов, ресурсов и имен.
Сразу за заголовком находится таблица сегментов. В ней содержится
описание каждого сегмента исполняемого файла.
Таблица ресурсов. Ресурсами являются все основные объекты интер-
фейса - диалоговые окна, меню, курсоры, растровые изображения, знач-
ки и так далее.
Формат таблицы ресурсов (смещения относительно начала входа каж-
дого ресурса). Значения в диапазоне смещений 02-12h повторяются
в таблице до тех пор, пока величина по смещению 02h не станет равной
нулю. Значения в диапазоне от OAh до 12h повторяются столько раз,
сколько указано по адресу 04h.
Таблица резидентных имен. В ней содержатся строки, идентифициру-
ющие экспортируемые функции исполняемого файла. Постоянно нахо-
дятся в памяти и никогда не сбрасываются на диск. Верхний и нижний
регистры различаются, ноль в конце отсутствует.
Данные в таблице находятся в виде:
- длина строки (равна нулю, если в таблице нет дополнительных
строк);
- строка резидентного имени (первая строка - имя модуля);
- порядковый номер, идентифицирующий строку. Может использо-
ваться в качестве индексного выхода в таблицу.
Таблица ссылок на модули. В ней содержится список смещений имен
модулей, хранящихся в таблице импортируемых имен. Каждый вход
в таблице есть двубайтное последовательное число.
Таблица импортируемых имен. В ней записаны имена модулей, импор-
тируемых в исполняемый файл. Каждый вход состоит из двух частей -
байта длины строки и собственно строки.
Таблица входов. В ней содержатся группы точек входа в исполняемый
файл.
Эти группы создаются редактором связей и последовательно пронуме-
рованы (начиная с 1). Каждая группа начинается с двухбайтного заго-
ловка, который содержит число входов в группе (OOh - конец таблицы)
и дополнительную информацию о сегменте (FFh - перемещаемый,
FEh - вход относится к константе, определенной внутри модуля, иначе
вход является индексом сегмента). Для перемещаемых сегментов каж-
дый вход состоит из шести байт, а для фиксированных - из трех.
Таблица нерезидентных имен. Содержит имена экспортируемых функ-
ций, содержащихся в исполняемом файле. Эти имена не всегда остают-
ся резидентными в памяти. Структура полностью совпадает со структу-
рой таблицы резидентных имен.
Сегменты кода и данных. Если в сегменте кода содержатся вызовы
функций, определенных в других сегментах, то для таких вызовов необ-
ходимо использовать таблицы перемещений. Они располагаются непо-
средственно за кодом или данными в сегменте. В двух первых байтах
содержится число элементов таблицы.
Таблица содержит:
- тип адресации (только сегмент, только смещение, или и то, и другое);
- тип перемещения (внутренняя ссылка, импортируемый порядковый
номер, импортируемое имя);
- номер сегмента или порядковый ID (для внутренних ссылок);
- индекс таблицы ссылок или порядковый номер функции;
- индекс таблицы ссылок или смещение таблицы имен (для импорти-
руемых имен).
Формат заголовка PE-executable EXE-файла
В состав старого заголовка входят:
- обычный ЕХЕ-заголовок (Таблица А-8);
- зарезервированная часть;
Таблица А-8. Формат обычного ЕХЕ-заголовка в PE-executable ЕХЕ-файле.
Смещ. |
Описание |
+00h |
DOS-заголовок |
+20h |
Резерв |
+3Ch |
Смещение начала РЕ-заголовка |
+40h |
DOS-программа (STUB) |
Таблица А-9. Формат РЕ-заголовка.
—————г |
— — — - — — — 1— — — — —•— —-—!—————————1 |
+00h |
РЕ' • Сигнатура |
+04h |
Тип процессора: 14Dh - 80486 14Eh - 80586 |
+06h |
Количество входов в таблице объектов |
+08h |
Время и дата создания или модификации файла линкером |
+OCh |
Зарезервировано |
+14h |
Количество необходимых байт в NT-заголовке |
+16h |
Флаги: |
+18h |
Зарезервировано |
+lAh |
Версия и подверсия линковщика, создавшего данный файл |
+lCh |
Зарезервировано |
+28h |
Виртуальный адрес точки входа или процедуры инициализации |
+2Ch |
Зарезервировано |
+34h |
Смещение первого файла данных в файле |
+38h |
Выравнивание объектов. Содержит величину степени 2 числа, на которое |
+3Ch |
Выравнивание файла. Содержит величину степени 2 числа, на которое |
+40h |
Номера версии и подверсии операционной системы, необходимой для |
+44h |
Номера пользовательской версии и подверсии. Устанавливаются во время |
Таблица А-9. Формат РЕ-эаголовка. (Продолжение)
Смещ. |
Описание |
+48h |
Номера версии и подверсии подсистемы NT, необходимой для запуска |
+4Ch |
Зарезервировано |
+50h |
Виртуальный размер данных программы (в байтах) |
+54h |
Полный размер заголовка (в байтах), включая DOS-заголовок (старый), |
+58h |
Контрольная сумма файла для запуска. |
+5Ch |
NT подсистема, необходимая для запуска данной программы: |
+5Eh |
Флаги DLL: |
+60h |
Размер стека, необходимый программе |
+64h |
Обязательный размер стека |
+68h |
Размер локальной кучи, резервируемый для программы |
+6Ch |
Обязательный размер локальной кучи |
+70h |
Зарезервировано |
+74h |
Размер массива смещений/размеров, расположенного ниже |
+78h |
Смещение таблицы экспорта. Смещение отсчитывается от значения поля |
+7Ch |
Полный размер таблицы экспорта |
+80h |
Смещение таблицы импорта. Смещение отсчитывается от значения |
+84h |
Полный размер таблицы импорта |
+88h |
Смещение таблицы ресурсов. Смещение отсчитывается от значения поля |
+8Ch |
Полный размер таблицы ресурсов |
Таблица А-9. Формат РЕ-заголовка. /Окончание)
- указатель на РЕ-заголовок (если в ЕХЕ-заголовке в начале таблицы
перемещаемых элементов - по смещению 18h - стоит 40h или боль-
ше, то слово, расположенное по смещению 3Ch, содержит смещение
начала РЕ-заголовка);
- DOS-программа (STUB).
В состав нового заголовка входят:
- РЕ-заголовок (Таблица А-9);
- таблица объектов (Таблица А-10);
- таблицы ресурсов, импортируемых и экспортируемых имен, на-
стройки адресов.
Таблица А-10. Формат таблицы объектов.
Смещ. |
Описание |
+00h |
Имя объекта в формате ASCII, дополненное до восьми байт нулями |
+08h |
Виртуальный размер объекта. Размер памяти, который необходимо |
+OCh |
Смещение объекта в файле. Смещение отсчитывается от значения поля |
+10h |
Физический размер инициализированных данных объекта. |
+14h |
Физическое смещение первой страницы объекта в файле. Смещение |
+18h |
Зарезервировано |
+24h |
Флаги объекта: |