Анатомия файла Иван Скляров Спецвыпуск: Хакер, номер #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 - эти поля не используются и обычно устанавливаются в ноль. |