Описание заголовка РЕ
II
В таблице, представленной ниже мы даем описание заголовка РЕ.
00h | DWORD | Signature Bytes | Сигнатура. Первые два байта "PE" 4550Н. Еще два байта обязательно должны быть равны нулю. |
04h | WORD | CPU Type | Данное поле указывает на процессор, который следует предпочесть при запуске программы. Вот возможное значение этого поля: |
06h | WORD | Num of Objects | Поле указывает на число реальных входов в Object Table (см. таб. ниже). |
08h | DWORD | Time/Date Stamp | Дата и время, которые устанавливаются при компоновке программы. |
0Ch | DWORD | Pointer to COFF table | Дополнительный указатель, определяющий местонахождение отладочной COFF-таблицы в файлах. Это поле используется только в OBJ-файлах и РЕ-файлах, содержащих отладочную COFF-информацию. |
10h | DWORD | COFF table size | Количество символов в COFF-таблице. |
14h | WORD | NT Header Size | Размер заголовка РЕ-файла, начиная с поля Magic - таким образом, общий размер заголовка РЕ-файла составляет NT Header Size + 18h. |
16h | WORD | Flags | Указывает на предназначение программы. Значение флагов: |
18h | WORD | Magic | Слово-сигнатура, определяющее состояние отображенного файла. Определены следующие значения: |
1Ah | BYTE | Link Major | Старший номер версии использовавшегося при создании модуля компоновщика. Десятичный вид. |
1Bh | BYTE | Link Minor | Младший номер версии использовавшегося при создании модуля компоновщика. Десятичный вид. |
1Ch | DWORD | Size of Code | Размер именно программного кода в файле. KERNEL использует это значение для фактического отведения памяти под загружаемую программу. Установка этого значения слишком маленьким приведет к выдаче сообщения о нехватке памяти. Обычно большинство модулей имеют только одну программную секцию .text. |
20h | DWORD | Size of Init Data | Размер секции инициализированных данных, очевидно, не используется в Windows 95, но используется в Windows NT. Назначение аналогично приведенному выше. |
24h | DWORD | Size of UnInit Data | Размер секции неинициализированных данных. Неинициализированные данные обычно содержатся в секции .bss. Данная секция не занимает на диске никакого места, но при загрузке модуля в память загрузчик отводит под нее память. |
28h | DWORD | Entry point RVA | Адрес относительно Image Base, no которому передается управление при запуске программы или адрес инициализации/завершения библиотеки. |
2Ch | DWORD | Base of Code | Адрес секции относительно базового адреса (40000Н), содержащей программный код. Этот адрес обычно равен 1000Н для компоновщика Microsoft и 10000H для компоновщика Borland. |
30h | DWORD | Base of Data | Адрес относительно базового (40000H), с которого начинаются секции данных файла. Секции данных обычно идут последними в памяти, после заголовка РЕ и программных секций. |
34h | DWORD | Image Base | При создании компоновщик помещает сюда адрес, куда будет отображен исполняемый файл в памяти. Если загрузчик отобразит файл именно по этому адресу, то дополнительной настройки не потребуется. |
38h | DWORD | Object align | Выравнивание программных секций. После отображения в память каждая секция будет обязательно начинаться с виртуального адреса, кратного данной величине. |
3Ch | DWORD | File align | В случае РЕ- файла исходные данные, которые входят в состав каждой секции, будут обязательно начинаться с адреса, кратного данной величине. Значение по умолчанию составляет 200Н. |
40h | WORD | OS Major | Старший номер версии операционной системы, необходимый для запуска программы. |
42h | WORD | OS Minor | Младший номер версии операционной системы. |
44h | WORD | USER Major | Пользовательский номер версии, задается пользователем при линковке программы. Старшая часть. |
46h | WORD | USER Minor | Пользовательский номер версии, младшая часть. |
48h | WORD | SubSys Major | Старший номер версии подсистемы. |
4Ah | WORD | SubSys Minor | Младший номер версии подсистемы. Типичное значение версии 4.0, что означает Windows 95. |
4Ch | DWORD | Reserved | Зарезервировано. |
50h | DWORD | Image Size | Представляет общий размер всех частей отображения, находящихся под контролем загрузчика. Эта величина равна размеру области памяти, начиная с базового адреса отображения и заканчивая адресом конца последней секции. Адрес конца секции выровнен на ближайшую верхнюю границу секции. |
54h | DWORD | Header Size | Общий размер всех заголовков: DOS Stub + РЕ Header + Object Table |
58h | DWORD | File CheckSum | Контрольная сумма всего файла. Как и в операционной системе MS DOS, ее никто не контролирует, а программа редактирования связей устанавливает ее в 0. Предполагалось ее рассчитывать как инверсию суммы всех байтов файла. |
5Ch | WORD | Subsystem | Операционная подсистема, необходимая для запуска данного файла. Вот значения этого поля: | 1 - подсистема не требуется (NATIVE). 2 - запускается в подсистеме Windows GUI. 3 - запускается в подсистеме Windows character (терминальное или консольное приложение). 5 - запускается в подсистеме OS/2. 7 - запускается в подсистеме Posix.
5Eh | WORD | DLL Flags | Указывает на специальные потребности при загрузке, начиная с операционной системы NT 3.5. Устарел и не используется. |
60h | DWORD | Stack Reserve Size | Память, требуемая для стека приложения. Память резервируется, но выделяется только Stack Commit Size байтов. Следующая страница является охранной. Когда приложение достигает этой страницы, то она становится доступной, а следующая страница - охранной, и так до достижения нижней границы, после чего Windows 95 убивает программу. |
64h | DWORD | Stack Commit Size | Объем памяти, отводимой для стека немедленно после загрузки. |
68h | DWORD | Heap Reserve Size | Максимально возможный размер локальной кучи. |
6Ch | DWORD | Heap Comit Size | Отводимый размер кучи при загрузке. |
70h | DWORD | Loader Flags | Начиная с Windows NT 3.5 объявлено неиспользуемым, назначение неясно, но в целом связано с поддержкой отладки. |
74h | DWORD | Num of RVA and Sizes | Указывает размер массива VA/Size, который следует ниже, данное поле зарезервирована под будущие расширения формата. В данный момент его значение всегда равно 10h. |
78h | DWORD | Export Table RVA | Относительный адрес (относительно базового адреса) таблицы экспорта. |
7Ch | DWORD | Export Data Size | Размер таблицы экспорта. |
80h | DWORD | Import Table RVA | Относительный адрес (относительно базового адреса) таблицы импорта. |
84h | DWORD | Import Data Size | Размер таблицы импорта. |
88h | DWORD | Resource Table RVA | Относительный адрес (относительно базового адреса) таблицы ресурсов. |
8Ch | DWORD | Resource Data Size | Размер таблицы ресурсов. |
90h | DWORD | Exception Table RVA | Относительный адрес таблицы исключений. |
94h | DWORD | Exception Data Size | Размер таблицы исключений. |
98h | DWORD | Security Table RVA | Адрес таблицы безопасности. По-видимому, не используется. |
9Ch | DWORD | Security Data Size | Размер таблицы безопасности. |
A0h | DWORD | Fix Up's Table RVA | Относительный адрес таблицы настроек. |
A4h | DWORD | Fix Up's Data Size | Размер таблицы настроек. |
A8h | DWORD | Debug Table RVA | Относительный адрес таблицы отладочной информации. |
ACh | DWORD | Debug Data Size | Размер таблицы отладочной информации. |
B0h | DWORD | Image Description RVA | Относительный адрес строки описания модуля. |
B4h | DWORD | Description Data Size | Размер строки описания модуля. |
B8h | DWORD | Machine Specific RVA | Адрес таблицы значений, специфичных для микропроцессора. |
BCh | DWORD | Machine Data Size | Размер таблицы значений, специфичных для микропроцессора. |
C0h | DWORD | TLS RVA |
Элемент таблицы секций содержит полную базу данных об одной секции.
00h | 08h | Object Name | Имя объекта, остаток заполнен нулями. Если имя объекта имеет длину 8 символов, то заключительного 0 нет. Вот несколько возможных имен: | .text - исполняемый код общего назначения.
08h | DWORD | Virtual Size | Виртуальный размер секции - именно столько памяти будет отведено под секцию. Если Virtual Size превышает Physical Size, то разница заполняется нулями, так определяются секции неинициализированных данных (Physical Size = 0). |
0Ch | DWORD | Section RVA | Размещение секции в памяти, ее виртуальный адрес относительно Image Base. Позиция каждой секции выровнена на границу Object align (степень 2 от 512 до 256М включительно, по умолчанию 64К), секции упакованы вплотную друг к другу, впрочем, можно это не соблюдать. Для объектных файлов поле не имеет смысла. |
10h | DWORD | Physical Size | Размер секции (ее инициализированной части) в файле кратно полю File align в заголовке РЕ Header, должно быть меньше или равно Virtual Size. Для объектных файлов это поле содержит точный размер секции, сгенерированный компилятором или ассемблером. Другими словами, для объектных файлов оно эквивалентно полю Virtual Size. |
14h | DWORD | Physical Offset | Физическое смещение относительно начала ЕХЕ-файла, выровнено на границу File align поля заголовка РЕ Header. Смещение используется загрузчиком для поиска. |
18h | DWORD | Pointer to Linenumber | Файловое смещение таблицы номеров строк. Используется для объектных файлов. |
1Ch | WORD | Number of Relocations | Количество перемещений в таблице поправок. Используется только для объектных файлов. |
1Eh | WORD | Number of Linenumbers | Количество номеров строк в таблице номеров строк для данной секции. Используется для объектных файлов. |
20h | 08h | Reserved | Зарезервировано для объектных файлов. |
28h | DWORD | Object Flags | Битовые флаги секции: |
00000004h - используется для кода с 16-битными смещениями.
00000020h - секция кода.
00000040h - секция инициализированных данных.
00000080h - секция неинициализированных данных.
00000200h - комментарии или любой другой тип информации.
00000400h - оверлейная секция.
00000800h - не будет являться частью образа программы.
00001000h - общие данные.
00500000h - выравнивание по умолчанию, если не указано иное.
02000000h - может быть выгружен из памяти.
04000000h - не кэшируется.
08000000h - не подвергается страничному преобразованию.
10000000h - разделяемый.
20000000h - выполнимый.
40000000h - можно читать.
80000000h - можно писать.
Страницы образов секций. Здесь мы изучим некоторые секции.