html

воскресенье, 12 февраля 2012 г.

Таблица секций в PE файле

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

Комментариев нет: