0. Таблица секций - это база данных из заголовков секций, для всех секций , используемых в PE файле. После окончания опционального заголовка сразу следует таблица секций. Таблица секций представляет собой массив элементов типа TImageSectionHeader. Количество элементов этого типа определяется полем NumberOfSections заголовка FileHeader. Входы в таблице секций нумеруются, начиная с 1.
1. Элемент типа TImageSectionHeader подробно расписан в файле Windows.pas комплекта Delphi 7.0:
-----------------------------
PImageSectionHeader = ^TImageSectionHeader;
_IMAGE_SECTION_HEADER = packed record
Name: packed array[0..IMAGE_SIZEOF_SHORT_NAME-1] of Byte;
Misc: TISHMisc;
VirtualAddress: DWORD;
SizeOfRawData: DWORD;
PointerToRawData: DWORD;
PointerToRelocations: DWORD;
PointerToLinenumbers: DWORD;
NumberOfRelocations: Word;
NumberOfLinenumbers: Word;
Characteristics: DWORD;
end;
{$EXTERNALSYM _IMAGE_SECTION_HEADER}
TImageSectionHeader = _IMAGE_SECTION_HEADER;
IMAGE_SECTION_HEADER = _IMAGE_SECTION_HEADER;
{$EXTERNALSYM IMAGE_SECTION_HEADER}
------------------------------
2. Описание полей структуры из статьи ФОРМАТ ИСПОЛНЯЕМЫХ ФАЙЛОВ PortableExecutables (PE) написанной Hard Wisdom
Немного исправил названия, согласно файлу Windows.pas
-=====T=======T=======================T=================================¬
¦ ¦ Size ¦ ¦ ¦
¦Base ¦ or ¦ Name Of field ¦ Brief description ¦
¦ ¦ Type ¦ ¦ ¦
¦=====+=======+=======================+=================================¦
¦ 00h ¦ 08h ¦ Name ¦ Имя объекта, остаток заполнен ¦
¦ ¦ ¦ ¦ нулями, если имя объекта имеет ¦
¦ ¦ ¦ ¦ длину 8 символов, то заключи- ¦
¦ ¦ ¦ ¦ тельного 0 нет. Некоторые PE ¦
¦ ¦ ¦ ¦ дамперы падают на этом факте. ¦
¦ ¦ ¦ ¦ Имя - штука отфонарная и никого ¦
¦ ¦ ¦ ¦ ни к чему не обязывает. ¦
+-----+-------+-----------------------+---------------------------------+
¦ 08h ¦ DWord ¦ ¦ Виртуальный размер секции, ¦
¦ ¦ ¦ Misc.VirtualSize ¦ именно столько памяти будет от- ¦
¦ ¦ ¦ ¦ ведено под секцию. Если Virtual ¦
¦ ¦ ¦ ¦ Size превышает SizeOfRawData, ¦
¦ ¦ ¦ ¦ то разница заполняется нулями, ¦
¦ ¦ ¦ ¦ так определяются секции неини- ¦
¦ ¦ ¦ ¦ циализированных данных ( ¦
¦ ¦ ¦ ¦ SizeOfRawData = 0) ¦
+-----+-------+-----------------------+ - - - - - - - - - - - - - - - - +
¦ 0Ch ¦ DWord ¦ VirtualAddress ¦ Размещение секции в памяти, ¦
¦ ¦ ¦ ¦ виртуальный ее адрес относитель-¦
¦ ¦ ¦ ¦ но Image Base. Позиция каждой ¦
¦ ¦ ¦ ¦ секции выравнена на границу ¦
¦ ¦ ¦ ¦ SectionAlignment(степень2 от 512¦
¦ ¦ ¦ ¦ до 256М включительно, по умол- ¦
¦ ¦ ¦ ¦ чанию 64К) и секции упакованы ¦
¦ ¦ ¦ ¦ впритык друг к другу, впрочем, ¦
¦ ¦ ¦ ¦ можно это не соблюдать. ¦
+-----+-------+-----------------------+---------------------------------+
¦ 10h ¦ DWord ¦ SizeOfRawData ¦ Размер секции (ее инициализиро- ¦
¦ ¦ ¦ ¦ ванной части) в файле, кратно ¦
¦ ¦ ¦ ¦ полю FileAlignment в заголовкеPE¦
¦ ¦ ¦ ¦ Header, обычно он меньше или ¦
¦ ¦ ¦ ¦ равен VirtualSize. Играя с ¦
¦ ¦ ¦ ¦ этим полем можно добиться неко- ¦
¦ ¦ ¦ ¦ торых результатов ;-) загрузчик ¦
¦ ¦ ¦ ¦ по идее хлопает всю секцию в ¦
¦ ¦ ¦ ¦ отведенное ОЗУ! SizeOfRawData ¦
¦ ¦ ¦ ¦ может быть больше, чем Virtual ¦
¦ ¦ ¦ ¦ Size. Это происходит, когда ¦
¦ ¦ ¦ ¦ "умный" линкер заявляет строгий ¦
¦ ¦ ¦ ¦ размер секции (не кратный ¦
¦ ¦ ¦ ¦ SectionAlignment).В таком случае¦
¦ ¦ ¦ ¦ хвост секции теоретически не ¦
¦ ¦ ¦ ¦ используется. ¦
+-----+-------+-----------------------+ - - - - - - - - - - - - - - - - +
¦ 14h ¦ DWord ¦ PointerToRawData ¦ Физическое смещение относитель- ¦
¦ ¦ ¦ ¦ но начала EXE файла, выровнено ¦
¦ ¦ ¦ ¦ на границу FileAlignment поля за¦
¦ ¦ ¦ ¦ головка PE Header. Смещение ¦
¦ ¦ ¦ ¦ используется загрузчиком как ¦
¦ ¦ ¦ ¦ seek значение. ¦
+-----+-------+-----------------------+---------------------------------+
¦ 18h ¦ 0Ch ¦ PointerToRelocations ¦ зарезервировано для OBJ файла, ¦
¦ ¦ ¦ PointerToLinenumbers ¦ в экзешниках смысла не имеет ¦
¦ ¦ ¦ NumberOfRelocations ¦ ¦
¦ ¦ ¦ NumberOfLinenumbers ¦ ¦
¦ ¦ ¦ ¦ ¦
+-----+-------+-----------------------+---------------------------------+
¦ 24h ¦ DWord ¦ Characteristics ¦ битовые флаги секции, см.ниже ¦
¦=====¦=======¦=======================+=================================¦
¦ Total Structure size 28h ¦ Общий размер описателя секции ¦
L=====================================¦=================================-
3. Хорошо расписана таблица заголовков секций в книге Bill Prisoner “От зеленого к красному”. (http://vxheavens.com/lib/vbp01.html#c29) Кроме того, надо обязательно читать спецификации Microsoft.
4. Написал на Delphi программу, которая выводит всю таблицу заголовков секций. Попробую в дальнейшем довести эту программу до упаковщика или криптора PE-файла.
5. Программу с исходниками, а также с дополнительными файлами - спецификациями Microsoft для PE-файлов версий 8.0,8.1 и 8.2 (094_pecoff_v8.pdf, pecoff_v8.doc , pecoff_v8.pdf ) , статьей ФОРМАТ ИСПОЛНЯЕМЫХ ФАЙЛОВ PortableExecutables (PE) написанной Hard Wisdom и файлом Windows.pas , скачать можно здесь : SectionHeaders.rar
Комментариев нет:
Отправить комментарий