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

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

Иван Скляров

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


WORD MajorSubsystemVersion;

WORD MinorSubsystemVersion;

DWORD Win32VersionValue;

DWORD SizeOfImage;

DWORD SizeOfHeaders;

DWORD CheckSum;

WORD Subsystem;

WORD DllCharacteristics;

DWORD SizeOfStackReserve;

DWORD SizeOfStackCommit;

DWORD SizeOfHeapReserve;

DWORD SizeOfHeapCommit;

DWORD LoaderFlags;

DWORD NumberOfRvaAndSizes;

IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];

} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;

А сейчас жизненно важное замечание: структура условно поделена на "стандартные поля" и "дополнительные поля NT". Стандартные поля присутствовали в формате файлов COFF, который положен в основу формата PE. Но, несмотря на то, что стандартные поля имеют такие же названия, как определено в COFF, в действительности Windows использует некоторые из них для целей, совершенно противоположных предписанным COFF.

Поле Magic не используется совсем. В полях MajorLinkerVersion и MinorLinkerVersion записана соответственно старшая и младшая часть номера версии линкера, который был использован при создании файла.

SizeOfCode - размер исполняемого кода, округленный к верхней границе.

SizeOfInitializedData - размер инициализированных данных.

SizeOfUninitializedData - размер неинициализированных данных (BSS).

AddressOfEntryPoint - одно из самых интересных полей для крэкера: относительный виртуальный адрес (RVA - Relative Virtual Address) точки входа в программу. Многие поля в PE-файле задаются с помощью RVA. RVA - это смещение в памяти по отношению к базовому адресу ImageBase (о нем ниже). Чтобы получить линейный адрес, необходимо сложить RVA и ImageBase.

BaseOfCode - относительное смещение сегмента кода (.text) в загруженном файле.

BaseOfData - относительное смещение сегмента неинициализированных данных (.bss) в загруженном файле.

ImageBase - базовый адрес, начиная с которого в память будет отображен образ исполняемого файла. Обычно по умолчанию он равен 400000h, однако это значение не постоянно и может изменяться.

SectionAlignment - граница выравнивания секций в памяти.

FileAlignment - граница выравнивания секций в файле на диске, то есть до загрузки в память.

MajorOperatingSystemVersion и MinorOperatingSystemVersion - старшая и младшая часть номера самой старой версии операционной системы, которая позволяет запускать данный файл.

MajorImageVersion и MinorImageVersion - старшая и младшая часть номера версии файла.

MajorSubsystemVersion и MinorSubsystemVersion - старшая и младшая часть номера версии Win32-подсистемы.

Win32VersionValue - один из параметров, назначение которого никому не известно.

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

SizeOfHeaders - содержит суммарный размер места, занимаемого всеми заголовками файла, включая заголовок MS-DOS и размер таблицы секций.

CheckSum - контрольная сумма, используемая для проверки целостности исполняемого файла во время загрузки. Это поле устанавливается и проверяется линковщиком.

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