Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #57, АВГУСТ 2005 г.

Анатомия файла

Иван Скляров

Спецвыпуск: Хакер, номер #057, стр. 057-026-4


Subsystem - подсистема, используемая файлом в качестве интерфейса с пользователем. Например, IMAGE_SUBSYSTEM_WINDOWS_GUI гласит, что программа использует графический пользовательский интерфейс Windows. Значения всех возможных подсистем содержатся в файле заголовков winnt.h после описания структуры опционального заголовка.

DllCharacteristics - характеристики DLL, также описанные в winnt.h.

SizeOfStackReserve, SizeOfStackCommit, SizeOfHeapReserve, SizeOfHeapCommit - эти поля определяют объем адресного пространства, зарезервированного и выделенного для стека и кучи. По умолчанию и для стека, и для кучи зарезервировано 16 страниц, на что указывает запись в winnt.h:

#define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16

LoaderFlags - в настоящее время не используется.

NumberOfRvaAndSizes - содержит размер массива DataDirectory, расположенного далее.

DataDirectory - массив указателей на различные важные компоненты PE-файла. Элементами этого массива являются структуры типа IMAGE_DATA_DIRECTORY:

typedef struct _IMAGE_DATA_DIRECTORY {

DWORD VirtualAddress;

DWORD Size;

} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;

Каждая из этих структур содержит виртуальный адрес определенной таблицы и размер этой таблицы. Информация о таблицах всегда располагается в строгом порядке, например, информация о таблице ресурсов (IMAGE_DIRECTORY_ENTRY_RESOURCE) всегда идет вторым номером (если начинать отсчет с нуля).

Таблица секций

Таблица секций - это заголовки секций, в которых описано их размещение на диске и в памяти. Все заголовки секции имеют длину 40 байт и располагаются без выравнивания. Заголовок секции определяется следующей структурой:

typedef struct _IMAGE_SECTION_HEADER {

BYTE Name[IMAGE_SIZEOF_SHORT_NAME];

union {

DWORD PhysicalAddress;

DWORD VirtualSize;

} Misc;

DWORD VirtualAddress;

DWORD SizeOfRawData;

DWORD PointerToRawData;

DWORD PointerToRelocations;

DWORD PointerToLinenumbers;

WORD NumberOfRelocations;

WORD NumberOfLinenumbers;

DWORD Characteristics;

} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;

#define IMAGE_SIZEOF_SECTION_HEADER 40

Name[IMAGE_SIZEOF_SHORT_NAME] - имя секции. В файле winnt.h указано, что длина секции должна быть не больше восьми символов:

#define IMAGE_SIZEOF_SHORT_NAME 8

Misc - объединение (union), которое принимает значение PhysicalAddress, если файл является объектным, или VirtualSize, если файл является исполняемым. В исполняемом файле это поле содержит неокругленный размер раздела.

VirtualAddress - смещение, по которому загрузчик должен отобразить секцию в адресном пространстве процесса. Оно вычисляется относительно базового адреса загрузки (ImageBase).

SizeOfRawData - размер секции, округленный в большую сторону до значения FileAlignment.

PointerToRelocations, PointerToLinenumbers, NumberOfRelocations, NumberOfLinenumbers - эти поля не используются и обычно устанавливаются в ноль.

Назад на стр. 057-026-3  Содержание  Вперед на стр. 057-026-5