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