Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;заголовочный файл
- ;описание структур PE-файла
- ;структура РЕ-файла:
- ; DOS.EXE header
- ; MS-DOS Real-Mode Stub Program
- ; PE File Signatura
- ; PE File Header
- ; PE File Optional Header
- ; Sections Table
- IMAGE_NT_SIGNATURE equ 00004550h ;сигнатура РЕ-файла
- IMAGE_NUMBEROF_DERICTORY_ENTRIES equ 10h ;количество элементов в DATA_DIRECTORY
- ;из за ошибок в загрузчике линкерами Борланд и Майкрософт выстовляется всегда по максимуму,
- ;в противоположность ulink Юрия Харона
- ;DOS.EXE header
- ;наследство исполняемых файлов мсдос
- ;для РЕ имеют значение следующие поля: e_magic и e_lfanew, иногда, возможно, e_cparhdr - проверить!
- ;для e_magic возможны сигнатуры ZM - передача управления на заглушку под виндоуз и NE - то же самое,
- ;но значения сегментных регистров будут выставлены как в ком
- _IMAGE_DOS_HEADER STRUCT
- e_magic WORD "ZM" ;+0 сигнатура "Mark Zbikowski"
- e_cblp WORD ? ;+2 байт на последней странице файла
- e_cp WORD ? ;+4 страниц в файле
- e_crlc WORD ? ;+6 перенаправления
- e_cparhdr WORD ? ;+8 размер дос-заголовка в параграфах. 1 пар = 200h
- e_minalloc WORD ? ;+0A требуемый минимум дополнительных параграфов
- e_maxalloc WORD ? ;+0C требуемый максимум дополнителых параграфов
- e_ss WORD ? ;+0E началное значение ss
- e_sp WORD ? ;+10 начальное значение sp
- e_csum WORD ? ;+12 контрольная сумма
- e_ip WORD ? ;+14 начальное значение ip
- e_cs WORD ? ;+16 начальное значение cs
- e_lfarlc WORD ? ;+18 файловый адрес таблицы перенаправлений
- e_ovno WORD ? ;+1A количество оверлеев
- e_res WORD 4 DUP(?) ;+1C зарезервированные слова
- e_oemid WORD ? ;+24 идентификатор производителя
- e_oeminfo WORD ? ;+26 спецификатор производителя
- e_res2 WORD 10 DUP(?);+28 зарезервированные слова
- e_lfanew DWORD ? ;+3C файловое смещение РЕ-заголовка, должно указывать на первый байт сигнатуры 00004550h
- _IMAGE_DOS_HEADER ends
- ;PE FILE HEADER
- ;заголовок РЕ
- _IMAGE_FILE_HEADER STRUCT
- Machine WORD ? ;+4 тип центрального процессора, для х386 - 14Ch, иначе файл не запустится
- NumberOfSections WORD ? ;+6 количество секций, при 0 - завешивание 98 и завершение на НТ, максимум зависит от загрузчика, но достаточно много (~60h for NT K.K.)
- TimeDateStamp DWORD ? ;+8 временной штамп
- PointerToSymbolTable DWORD ? ;+C указатель на таблицу с отладочной информацией для объектных файлов, не используется, но может иметь значение для дамперов
- NumberOfSymbols DWORD ? ;+10 размер таблицы с отладочной информацией для объектных файлов,
- SizeOfOptionalHeader WORD ? ;+14 размер опционального заголовка в байтах
- Characteristics WORD ? ;+16 атрибуты файла
- _IMAGE_FILE_HEADER ends
- ;индексы директорий в DATA_DIRECTORY
- IMAGE_DIRECTORY_ENTRY_EXPORT equ 0 ;Директория экспорта, указатель на таблицу экспортируемых функций и данных встречается преимущественно в длл и драйверах, использует ВА и РВА
- IMAGE_DIRECTORY_ENTRY_IMPORT equ 1 ;Директория импорта, указатель на таблицу импортируемых функций, активируемую загрузчиком во
- ;время загрузки, когда другие механизмы импорта не действуют
- ;использует РВА и ВА
- IMAGE_DIRECTORY_ENTRY_RESOURCE equ 2 ;Директория ресурсов, указатель на таблицу ресурсов, организованного в виде
- ;трёхуровневого двоичного дерева, использует РВА
- IMAGE_DIRECTORY_ENTRY_EXCEPTION equ 3 ;Директория исключений, на процессорах интел не используется
- ;используется на MIPS, Alpha32/64, ARM, PowerPC, SH3, SH, WindowsCE
- IMAGE_DIRECTORY_ENTRY_SECURITY equ 4 ;Директория безопасности, указатель на таблицу сертификатов,
- ;распологающуюся строго в .debug секции и адресуемая по физическим смещениям на диске
- ;при внедрении постороннего кода файлы с не нулевой этой директорией откажутся работать!
- IMAGE_DIRECTORY_ENTRY_BASERELOC equ 5 ;указатель на таблицу перемещаемых элементов, использует РВА
- IMAGE_DIRECTORY_ENTRY_DEBUG equ 6 ;Отладочная директория отладочная информация, используемая дизассемблерами и дебеггерами.
- ;использует RVA и RAW OFFSET адресацию. системный загрузчик ее игнорирует.
- ;IMAGE_DIRECTORY_ENTRY_COPYRIGHT equ 7 // (X86 usage)
- IMAGE_DIRECTORY_ENTRY_ARCHITECTURE equ 7 ;Спецефические данные архитектуры, информация о копирайтах, игнорируется загрузчиком
- IMAGE_DIRECTORY_ENTRY_GLOBALPTR equ 8 ;Указатель на таблицу регистров глобальных указателей. используется только на процессорах ALPHA и PowerPC
- IMAGE_DIRECTORY_ENTRY_TLS equ 9 ;Директория статической локальной памяти потока. Хранилище обычно размещается в секции .tls, хотя это и необязательно. Использует RVA и VA адреса
- IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG equ 10 ;Директория конфигурации при загрузке, содержит информацию о конфигурации глобальных флагов
- ;используется на только на НТ,использует ВА адресацию
- IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT equ 11 ;Директория диапозонного импорта, указатель на таблицу диапазонного импорта в заголовке
- ;использует РВА и РРВА смещение
- IMAGE_DIRECTORY_ENTRY_IAT equ 12 ;Таблица адресов импорта, указатель на подчинённую таблицу адресов импорта, используется на ХР
- IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT equ 13 ;Дескрипторы импорта отложенной загрузки, использует РВА ВА
- IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR equ 14 ;дескриптор ком времени выполнения, используется на .нет
- _IMAGE_DATA_DIRECTORY STRUCT
- VirtualAddress DWORD ? ;RVA
- DirSize DWORD ? ;размер байт
- _IMAGE_DATA_DIRECTORY ends
- _IMAGE_OPTIONAL_HEADER STRUCT
- Magic WORD 10Bh ;+18 состояние отображаемого файла, должно быть 10Bh, 107h идентефицирует ROM-образ
- MajorLinkerVersion BYTE ? ;+1A старшая версия линкера
- MinirLinkerVersion BYTE ? ;+1B младшая версия линкера
- SizeOfCode DWORD ? ;+1C размер секции кода }
- SizeOfInitializeData DWORD ? ;+20 размер секции инициализированных данных } любые значения
- SizeOfUninitializeData DWORD ? ;+24 размер секции неинициализированных данных }
- AddressOfEntryPoint DWORD ? ;+28 относительный адрес точки входа от ImageBase
- BaseOfCode DWORD ? ;+2C относительный базовый адрес секции кода }
- BaseOfData DWORD ? ;+30 относительный базовый адрес секции данных } любые значения
- ;дополнительные поля NT
- ;следующие поля требуются линкером и загрузчиком в НТ
- ImageBase DWORD ? ;+34 предпочтительный адрес загрузки, должет быть кратен 64к
- SectionAlignment DWORD ? ;+38 кратность выравниваания секций в памяти
- FileAlignment DWORD ? ;+3C кратность выравнивания секций на диске
- ;кратность выравниваания представляет степень двойки
- ;SectionAlignment >= 1000h, FileAlignment >= 200h, SectionAlignment >= FileAlignment
- MajorOperatingSystemVersion WORD ? ;+40старшая версия операционной системы
- MinorOperatingSystemVersion WORD ? ;+42 младшая версия операционной системы
- MajorImageVersion WORD ? ;+44 старшая версия образа
- MinorImageVersion WORD ? ;+46 младшая версия образа
- MajorSubsystemVersion WORD ? ;+48 старшая версия подсистемы
- MinorSubsystemVersion WORD ? ;+4A младшая версия подсистемы
- Win32VersionValue DWORD ? ;+4C
- SizeOfImage DWORD ? ;+50 размер образа в байтах, включая заголовки, должен быть кратен SectionAlignment
- SizeOfHeaders DWORD ? ;+54 суммарный размер всех заголовков, должен быть округлён вверх на FileAlignment
- CheckSum DWORD ? ;+58 контрольная сумма, проверяется при загрузке некоторых системных библиотек и ядра
- Subsystem WORD ? ;+5C требуемая подсистема
- DllCharacteristics WORD ? ;+5E характеристики длл, возможно всегда игнорируются
- SizeOfStackReserve DWORD 0 ;+60 размер зарезервированного стека
- SizeOfStackCommit DWORD 0 ;+64 размер выделенного стека
- SizeOfHeapReserve DWORD 0 ;+68 размер зарезервированной кучи
- SizeOfHeapCommit DWORD 0 ;+6C размер выделенной кучи
- ;0 - размер по умолчанию, SizeOfCommit > SizeOfReverse файл не загружается
- LoaderFlags DWORD ? ;+70 устарело
- NumberOfRvaAndSizes DWORD 0;+74 IMAGE_NUMBEROF_DERICTORY_ENTRIES ;количество элементов в DATA_DIRECTORY
- ;DataDirectory _IMAGE_DATA_DIRECTORY IMAGE_NUMBEROF_DERICTORY_ENTRIES DUP(<>) ;+78 таблица директорий
- DataDirectoryExport _IMAGE_DATA_DIRECTORY <?,?>
- DataDirectoryImport _IMAGE_DATA_DIRECTORY <?,?>
- DataDirectoryResource _IMAGE_DATA_DIRECTORY <?,?>
- DataDirectoryExeption _IMAGE_DATA_DIRECTORY <?,?>
- DataDirectorySecurity _IMAGE_DATA_DIRECTORY <?,?>
- DataDirectoryBaseReloc _IMAGE_DATA_DIRECTORY <?,?>
- DataDirectoryDebug _IMAGE_DATA_DIRECTORY <?,?>
- DataDirectoryArchitecture _IMAGE_DATA_DIRECTORY <?,?>
- DataDirectoryGlobalPtr _IMAGE_DATA_DIRECTORY <?,?>
- DataDirectoryTls _IMAGE_DATA_DIRECTORY <?,?>
- DataDirectoryLoadConfig _IMAGE_DATA_DIRECTORY <?,?>
- DataDirectoryBoundImport _IMAGE_DATA_DIRECTORY <?,?>
- DataDirectoryIat _IMAGE_DATA_DIRECTORY <?,?>
- DataDirectoryDelayImport _IMAGE_DATA_DIRECTORY <?,?>
- DataDirectoryImportComDescriptor _IMAGE_DATA_DIRECTORY <?,?>
- DataDirectoryReserve _IMAGE_DATA_DIRECTORY <?,?>
- _IMAGE_OPTIONAL_HEADER ends
- ;полная структура РЕ заголовка
- _IMAGE_NT_HEADERS STRUCT
- Signature DWORD IMAGE_NT_SIGNATURE ;сигнатура
- FileHeader _IMAGE_FILE_HEADER <> ;файловый заголовок
- OptionalHeader _IMAGE_OPTIONAL_HEADER <> ;опциональный заголовок
- _IMAGE_NT_HEADERS ends
- ;корневой элемент таблицы экспорта
- _IMAGE_EXPORT_DIRECTORY STRUCT
- Characteristics DWORD ? ;експортные флаги, не используется, выставляется в 0, может быть любым
- TimeDateStamp DWORD ? ;временной штамп создания файла, может быть любым
- MajorVersion WORD ? ;старшая версия экспортных данных
- MinorVersion WORD ? ;младшая версия экспортных данных, обе могут быть любыми
- ModName DWORD ? ;РВА строки содержащей имя ДЛЛ
- Base DWORD ? ;младший ординал экспортируемой функции
- NumberOfFunctions DWORD ? ;количество элементов в массиве адресов экспортируемых функций
- NumberOfNames DWORD ? ;количество элементов в массиве имён экспортируемых функций
- AddressOfFunctions DWORD ? ;РВА массива адресов функций
- AddressOfNames DWORD ? ;РВА массива имён функций
- AddressOfNameOrdinals DWORD ? ;РВА массива ординалов
- _IMAGE_EXPORT_DIRECTORY ends
- ;элемент таблицы импорта
- ;определяющий одну импортируемую функцию
- ;если функция импортируется по ординалу, старший бит устанавливается в 1
- ;если происходит импорт по имени, то содержит РВА _IMAGE_IMPORT_BY_NAME
- _IMAGE_THUNK_DATA32 UNION
- ForwarderString DWORD ?
- Function DWORD ?
- Ordinal DWORD ?
- AddressOfData DWORD ?
- _IMAGE_THUNK_DATA32 ends
- _IMAGE_IMPORT_BY_NAME STRUCT
- Hint WORD ? ;укороченный идентификатор точки входа
- ;индекс в Export Name Pointer Table ДЛЛ
- ;если индексируемое имя не совподает с Name_
- ;выполняется поиск по всей Export Name Pointer Table
- Name_ BYTE ? ;название импортированной функции, StrintZero
- _IMAGE_IMPORT_BY_NAME ends
- ;элемент таблицы импорта
- ;в завершающем элементе все поля должны быть нулевыми
- _IMAGE_IMPORT_DESCRIPTOR STRUCT
- ;UNION
- ;Characteristics DWORD ? ; 0 для последнего дескриптора
- OriginalFirstThunk DWORD ? ;РВА массива _IMAGE_THUNK_DATA32 называемого
- ;Import Lookup Table
- ;в каждом элементе
- ;содержащего ординал (если старший бит установлен в 1, остальная
- ;часть - ординал, используется редко), или РВА на структуру _IMAGE_IMPORT_BY_NAME
- ;этот массив в процессе загрузки не изменяется, может и совсем не использоваться
- ;и OriginalFirstThunk может быть любым
- ;линкеры Борланд ставят его в 0
- ;для системных ДЛЛ массив содержит адреса импортируемых функций
- ;массив паралелен FirstThunk, не правится при загрузке
- ;ends
- TimeDateStamp DWORD ? ;временной штамп создания файла. Может быть равен
- ;0, -1, временному штампу. От этого зависит, как именно загрузчик будет обрабатывать импорт
- ForwarderChaine DWORD ? ;предполагалось для перенаправления экспорта
- ;загрузчиком не используется, может быть любым
- ModName DWORD ? ;РВА указатель на имя ДЛЛ
- FirstThunk DWORD ? ;РВА массива _IMAGE_THUNK_DATA32,
- ;называемого Import Address Table
- ;до загрузки идентичного Import Lookup Table (в случае использования),
- ;после загрузки его элементы содержат адреса функций
- ;оба массива заканчиваются DWORD 0
- ;на адреса функций
- ;SizeOfImage => FirstThunk > SizeOfHeaders
- _IMAGE_IMPORT_DESCRIPTOR ends
- ;элемент таблицы секций
- ;количество секций определяется NumberOfSections _IMAGE_FILE_HEADERS
- _IMAGE_SECTION_HEADER STRUCT
- Name_ BYTE 8 DUP(?) ;имя секции, 8 байт
- VirtualSize DWORD ? ;виртуальный размер секции
- ;если = 0, то загрузчик использует SizeOfRawData
- ;выравненное на SectionAlignment
- ;если значение не выравнено, загрузчик может выровнять его
- VirtualAddress DWORD ? ;РВА размещения секции после загрузки
- SizeOfRawData DWORD ? ;размер секции на диске выравненное на FileAligment
- PointerToRawData DWORD ? ;файловое смещение начала секции на диске
- ;должно быть кратно FileAligment
- PointerToRelocations DWORD ? ;для исполняемых файлов не используется, может быть любым
- PointerToLinenumbers DWORD ? ;для исполняемых файлов не используется, может быть любым
- NumberOfRelocations WORD ? ;для исполняемых файлов не используется, может быть любым
- NumberOfLinenumbers WORD ? ;для исполняемых файлов не используется, может быть любым
- Characteristics DWORD ? ;атрибуты секций, определяются приведёнными ниже флагами
- _IMAGE_SECTION_HEADER ends
- ;флаги атрибутов секции, используемые для исполняемых файлов
- IMAGE_SCN_CNT_CODE equ 20h ;секция содержит исполняемый код
- IMAGE_SCN_CNT_INITIALIZED_DATA equ 40h ;инициализированные данные
- IMAGE_SCN_CNT_UNINITIALIZED_DATA equ 80h ;неинициализированные данные
- IMAGE_SCN_CNT_MEM_DISCARDABLE equ 2000000h ;секция отбрасывается после загрузки программы
- IMAGE_SCN_CNT_MEM_SHARED equ 100000000h ;является общедоступной
- IMAGE_SCN_CNT_MEM_EXECUT equ 200000000h ;может исполняться как код
- IMAGE_SCN_CNT_MEM_READ equ 400000000h ;доступна для чтения, эквивалентна IMAGE_SCN_CNT_MEM_EXECUT
- IMAGE_SCN_CNT_MEM_WRITE equ 800000000h ;доступна для записи
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement