Ассемблер для Windows


Описание заголовка РЕ



II

В таблице, представленной ниже мы даем описание заголовка РЕ.

СмещениеДлина поляНазвание поляОписание поля



0000h - неизвестный процессор.

014Ch - i386

014Dh - i486

014Eh - i586

0162h - MIPS Mark I (R2000, R3000)

0163h - MIPS Mark II (R6000)

0166h - MIPS Mark III (R4000)

Чаще всего данное поле указывает на процессор 386.

0000h - это программа;

0001h - файл не содержит перемещений и таблицы перемещаемых элементов;

0002h - образ в файле можно запускать. Если этот бит не установлен, то это обычно указывает на ошибку, обнаруженную на этапе линковки, или же на то, что код был инкрементально отлинкован (инкрементальная линковка - частичная линковка кода при изменении участка программы, а не тотальная перекомпиляция проекта);

0200h - загружать в память фиксированно. Указывает на то, что программу можно грузить только по адресу, записанному в Image Base, если это невозможно, то такой файл лучше вообще не запускать.

2000h - это библиотека.



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 Слово-сигнатура, определяющее состояние отображенного файла. Определены следующие значения:
107Н - отображение ПЗУ. 10BH - нормально исполняемое отображение.
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 Выравнивание программных секций. После отображения в память каждая секция будет обязательно начинаться с виртуального адреса, кратного данной величине.
1 - подсистема не требуется (NATIVE). 2 - запускается в подсистеме Windows GUI. 3 - запускается в подсистеме Windows character (терминальное или консольное приложение). 5 - запускается в подсистеме OS/2. 7 - запускается в подсистеме Posix.
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 Операционная подсистема, необходимая для запуска данного файла. Вот значения этого поля:
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

Указатель на локальную область данных цепочек. C4h DWORD TLS Data Size Размер области данных цепочек. C8h DWORD Load Config RVA Предназначение неизвестно. CCh DWORD Load Config Data Size Предназначение неизвестно. D0h 08h Reserved Зарезервировано. D8h DWORD IAT RVA Используется в NT. В Windows 95, судя по всему, нет. DCh DWORD IAT Data Size Размер описанного поля. E0h 08h Reserved Зарезервировано. E8h 08h Reserved Зарезервировано. F0h 08h Reserved Зарезервировано. Между заголовком РЕ и данными для секций расположена таблица секций. Вот элемент этой таблицы.
Элемент таблицы секций содержит полную базу данных об одной секции.

Смещение
Длина поля
Название поля
Описание поля
.text - исполняемый код общего назначения.

CODE - исполняемый код, помещаемый компоновщиками фирмы BORLAND.

.icode - переходники (jump'ы), помещаемые сюда старой версией TLINK32.

.data - инициализированные данные, помещаются компоновщиком фирмы Microsoft.

DATA - инициализированные данные, помещаемые сюда компоновщиком TLINK32.

.bss - неинициализированные глобальные и статические переменные.

.CRT - еще одна секция для хранения инициализированных данных.

.rsrc - секция для хранения ресурсов.

.idata - секция импорта.

.edata - секция экспорта.

.reloc - секция настроек. Данная информация может понадобиться загрузчику, если он не сможет загрузить модуль по базовому адресу.

.tls - данные для запуска цепочек.

.rdata - данная секция в основном содержит отладочную информацию.

.debug$s и .debug$t - данные секции есть только в COFF-объектных файлах. Они содержат информацию о символах Code View и их типах.

.drective - в данной секции содержится текст программ для компоновки. Данная секция есть только в объектных файлах. Секции, содержащие символ $. Такие секции обрабатываются особым образом. Компоновщик объединяет все секции, имеющие одинаковые символы в имени до символа $. Именем получившейся секции считается то, что стоит перед указанным символом.

00h 08h Object Name Имя объекта, остаток заполнен нулями. Если имя объекта имеет длину 8 символов, то заключительного 0 нет. Вот несколько возможных имен:
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 - можно писать.
Страницы образов секций. Здесь мы изучим некоторые секции.

Содержание раздела