Advertisement
krot

pe.Inc

May 6th, 2021
1,587
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;заголовочный файл
  2. ;описание структур PE-файла
  3. ;структура РЕ-файла:
  4. ;   DOS.EXE header
  5. ;   MS-DOS Real-Mode Stub Program
  6. ;   PE File Signatura
  7. ;   PE File Header
  8. ;   PE File Optional Header
  9. ;   Sections Table
  10.  
  11. IMAGE_NT_SIGNATURE                  equ     00004550h ;сигнатура РЕ-файла
  12. IMAGE_NUMBEROF_DERICTORY_ENTRIES    equ     10h ;количество элементов в DATA_DIRECTORY
  13.                                                 ;из за ошибок в загрузчике линкерами Борланд и Майкрософт выстовляется всегда по максимуму,
  14.                                                 ;в противоположность ulink Юрия Харона
  15.                                                
  16. ;DOS.EXE header
  17. ;наследство исполняемых файлов мсдос
  18. ;для РЕ имеют значение следующие поля: e_magic и e_lfanew, иногда, возможно, e_cparhdr - проверить!
  19. ;для e_magic возможны сигнатуры ZM - передача управления на заглушку под виндоуз и NE - то же самое,
  20. ;но значения сегментных регистров будут выставлены как в ком
  21. _IMAGE_DOS_HEADER STRUCT
  22.     e_magic     WORD    "ZM" ;+0 сигнатура "Mark Zbikowski"
  23.     e_cblp      WORD    ? ;+2 байт на последней странице файла
  24.     e_cp        WORD    ? ;+4 страниц в файле
  25.     e_crlc      WORD    ? ;+6 перенаправления
  26.     e_cparhdr   WORD    ? ;+8 размер дос-заголовка в параграфах. 1 пар = 200h
  27.     e_minalloc  WORD    ? ;+0A требуемый минимум дополнительных параграфов
  28.     e_maxalloc  WORD    ? ;+0C требуемый максимум дополнителых параграфов
  29.     e_ss        WORD    ? ;+0E началное значение ss
  30.     e_sp        WORD    ? ;+10 начальное значение sp
  31.     e_csum      WORD    ? ;+12 контрольная сумма
  32.     e_ip        WORD    ? ;+14 начальное значение ip
  33.     e_cs        WORD    ? ;+16 начальное значение cs
  34.     e_lfarlc    WORD    ? ;+18 файловый адрес таблицы перенаправлений
  35.     e_ovno      WORD    ? ;+1A количество оверлеев
  36.     e_res       WORD    4 DUP(?) ;+1C зарезервированные слова
  37.     e_oemid     WORD    ? ;+24 идентификатор производителя
  38.     e_oeminfo   WORD    ? ;+26 спецификатор производителя
  39.     e_res2      WORD    10 DUP(?);+28  зарезервированные слова
  40.     e_lfanew    DWORD   ? ;+3C файловое смещение РЕ-заголовка, должно указывать на первый байт сигнатуры 00004550h
  41. _IMAGE_DOS_HEADER ends
  42.  
  43. ;PE FILE HEADER
  44. ;заголовок РЕ
  45. _IMAGE_FILE_HEADER  STRUCT
  46.     Machine                 WORD    ? ;+4 тип центрального процессора, для х386 - 14Ch, иначе файл не запустится
  47.     NumberOfSections        WORD    ? ;+6 количество секций, при 0 - завешивание 98 и завершение на НТ, максимум зависит от загрузчика, но достаточно много (~60h for NT K.K.)
  48.     TimeDateStamp           DWORD   ? ;+8 временной штамп
  49.     PointerToSymbolTable    DWORD   ? ;+C указатель на таблицу с отладочной информацией для объектных файлов, не используется, но может иметь значение для дамперов
  50.     NumberOfSymbols         DWORD   ? ;+10 размер таблицы с отладочной информацией для объектных файлов,
  51.     SizeOfOptionalHeader    WORD    ? ;+14 размер опционального заголовка в байтах
  52.     Characteristics         WORD    ? ;+16 атрибуты файла
  53. _IMAGE_FILE_HEADER ends
  54.  
  55. ;индексы директорий в DATA_DIRECTORY
  56. IMAGE_DIRECTORY_ENTRY_EXPORT        equ     0   ;Директория экспорта, указатель на таблицу экспортируемых функций и данных встречается преимущественно в длл и драйверах, использует ВА и РВА
  57. IMAGE_DIRECTORY_ENTRY_IMPORT        equ     1   ;Директория импорта, указатель на таблицу импортируемых функций, активируемую загрузчиком во
  58.                                                 ;время загрузки, когда другие механизмы импорта не действуют
  59.                                                 ;использует РВА и ВА
  60. IMAGE_DIRECTORY_ENTRY_RESOURCE      equ     2   ;Директория ресурсов, указатель на таблицу ресурсов, организованного в виде
  61.                                                 ;трёхуровневого двоичного дерева, использует РВА
  62. IMAGE_DIRECTORY_ENTRY_EXCEPTION     equ     3   ;Директория исключений, на процессорах интел не используется
  63.                                                 ;используется на MIPS, Alpha32/64, ARM, PowerPC, SH3, SH, WindowsCE
  64. IMAGE_DIRECTORY_ENTRY_SECURITY      equ     4   ;Директория безопасности, указатель на таблицу сертификатов,
  65.                                                 ;распологающуюся строго в .debug секции и адресуемая по физическим смещениям на диске
  66.                                                 ;при внедрении постороннего кода файлы с не нулевой этой директорией откажутся работать!
  67. IMAGE_DIRECTORY_ENTRY_BASERELOC     equ     5   ;указатель на таблицу перемещаемых элементов, использует РВА
  68. IMAGE_DIRECTORY_ENTRY_DEBUG         equ     6   ;Отладочная директория отладочная информация, используемая дизассемблерами и дебеггерами.
  69.                                                 ;использует RVA и RAW OFFSET адресацию. системный загрузчик ее игнорирует.
  70. ;IMAGE_DIRECTORY_ENTRY_COPYRIGHT    equ     7   // (X86 usage)
  71. IMAGE_DIRECTORY_ENTRY_ARCHITECTURE  equ     7   ;Спецефические данные архитектуры, информация о копирайтах, игнорируется загрузчиком
  72. IMAGE_DIRECTORY_ENTRY_GLOBALPTR     equ     8   ;Указатель на таблицу регистров глобальных указателей. используется только на процессорах ALPHA и PowerPC
  73. IMAGE_DIRECTORY_ENTRY_TLS           equ     9   ;Директория статической локальной памяти потока. Хранилище обычно размещается в секции .tls, хотя это и необязательно. Использует RVA и VA адреса
  74. IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG   equ     10   ;Директория конфигурации при загрузке, содержит информацию о конфигурации глобальных флагов
  75.                                                 ;используется на только на НТ,использует ВА адресацию
  76. IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT  equ     11   ;Директория диапозонного импорта, указатель на таблицу диапазонного импорта в заголовке
  77.                                                 ;использует РВА и РРВА  смещение
  78. IMAGE_DIRECTORY_ENTRY_IAT           equ     12   ;Таблица адресов импорта, указатель на подчинённую таблицу адресов импорта, используется на ХР
  79. IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT  equ     13   ;Дескрипторы импорта отложенной загрузки, использует РВА ВА
  80. IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR        equ     14   ;дескриптор ком времени выполнения, используется на .нет
  81.  
  82. _IMAGE_DATA_DIRECTORY   STRUCT
  83.     VirtualAddress          DWORD   ? ;RVA
  84.     DirSize                 DWORD   ? ;размер байт
  85. _IMAGE_DATA_DIRECTORY ends
  86.  
  87. _IMAGE_OPTIONAL_HEADER  STRUCT
  88.     Magic                   WORD    10Bh ;+18 состояние отображаемого файла, должно быть 10Bh, 107h идентефицирует ROM-образ
  89.     MajorLinkerVersion      BYTE    ? ;+1A старшая версия линкера
  90.     MinirLinkerVersion      BYTE    ? ;+1B младшая версия линкера
  91.     SizeOfCode              DWORD   ? ;+1C размер секции кода                        }
  92.     SizeOfInitializeData    DWORD   ? ;+20 размер секции инициализированных данных    } любые значения
  93.     SizeOfUninitializeData  DWORD   ? ;+24 размер секции неинициализированных данных }
  94.     AddressOfEntryPoint     DWORD   ? ;+28 относительный адрес точки входа от ImageBase
  95.     BaseOfCode              DWORD   ? ;+2C относительный базовый адрес секции кода   }
  96.     BaseOfData              DWORD   ? ;+30 относительный базовый адрес секции данных } любые значения
  97.    
  98.     ;дополнительные поля NT
  99.     ;следующие поля требуются линкером и загрузчиком в НТ
  100.     ImageBase               DWORD   ? ;+34 предпочтительный адрес загрузки, должет быть кратен 64к
  101.     SectionAlignment        DWORD   ? ;+38 кратность выравниваания секций в памяти  
  102.     FileAlignment           DWORD   ? ;+3C кратность выравнивания секций на диске
  103.                                       ;кратность выравниваания представляет степень двойки
  104.                                       ;SectionAlignment >= 1000h, FileAlignment >= 200h, SectionAlignment >= FileAlignment
  105.     MajorOperatingSystemVersion WORD    ? ;+40старшая версия операционной системы
  106.     MinorOperatingSystemVersion WORD    ? ;+42 младшая версия операционной системы
  107.     MajorImageVersion           WORD    ? ;+44 старшая версия образа
  108.     MinorImageVersion           WORD    ? ;+46 младшая версия образа
  109.     MajorSubsystemVersion       WORD    ? ;+48 старшая версия подсистемы
  110.     MinorSubsystemVersion       WORD    ? ;+4A младшая версия подсистемы
  111.     Win32VersionValue       DWORD       ? ;+4C
  112.     SizeOfImage             DWORD       ? ;+50 размер образа в байтах, включая заголовки, должен быть кратен SectionAlignment
  113.     SizeOfHeaders           DWORD       ? ;+54 суммарный размер всех заголовков, должен быть округлён вверх на FileAlignment
  114.     CheckSum                DWORD       ? ;+58 контрольная сумма, проверяется при загрузке некоторых системных библиотек и ядра
  115.     Subsystem               WORD        ? ;+5C требуемая подсистема
  116.     DllCharacteristics      WORD        ? ;+5E характеристики длл, возможно всегда игнорируются
  117.     SizeOfStackReserve      DWORD       0 ;+60 размер зарезервированного стека
  118.     SizeOfStackCommit       DWORD       0 ;+64 размер выделенного стека
  119.     SizeOfHeapReserve       DWORD       0 ;+68 размер зарезервированной кучи
  120.     SizeOfHeapCommit        DWORD       0 ;+6C размер выделенной кучи
  121.                                             ;0 - размер по умолчанию, SizeOfCommit > SizeOfReverse файл не загружается
  122.     LoaderFlags             DWORD       ? ;+70 устарело
  123.     NumberOfRvaAndSizes     DWORD       0;+74 IMAGE_NUMBEROF_DERICTORY_ENTRIES ;количество элементов в DATA_DIRECTORY
  124.     ;DataDirectory          _IMAGE_DATA_DIRECTORY  IMAGE_NUMBEROF_DERICTORY_ENTRIES DUP(<>) ;+78 таблица директорий
  125.    
  126.     DataDirectoryExport     _IMAGE_DATA_DIRECTORY   <?,?>
  127.     DataDirectoryImport     _IMAGE_DATA_DIRECTORY   <?,?>  
  128.     DataDirectoryResource   _IMAGE_DATA_DIRECTORY   <?,?>
  129.     DataDirectoryExeption   _IMAGE_DATA_DIRECTORY   <?,?>  
  130.     DataDirectorySecurity       _IMAGE_DATA_DIRECTORY   <?,?>
  131.     DataDirectoryBaseReloc      _IMAGE_DATA_DIRECTORY   <?,?>
  132.     DataDirectoryDebug      _IMAGE_DATA_DIRECTORY   <?,?>
  133.     DataDirectoryArchitecture   _IMAGE_DATA_DIRECTORY   <?,?>
  134.     DataDirectoryGlobalPtr  _IMAGE_DATA_DIRECTORY   <?,?>
  135.     DataDirectoryTls        _IMAGE_DATA_DIRECTORY   <?,?>
  136.     DataDirectoryLoadConfig _IMAGE_DATA_DIRECTORY   <?,?>
  137.     DataDirectoryBoundImport    _IMAGE_DATA_DIRECTORY   <?,?>
  138.     DataDirectoryIat    _IMAGE_DATA_DIRECTORY   <?,?>
  139.     DataDirectoryDelayImport    _IMAGE_DATA_DIRECTORY   <?,?>
  140.     DataDirectoryImportComDescriptor        _IMAGE_DATA_DIRECTORY   <?,?>
  141.     DataDirectoryReserve    _IMAGE_DATA_DIRECTORY   <?,?>
  142.    
  143.  
  144. _IMAGE_OPTIONAL_HEADER ends
  145.  
  146.  
  147. ;полная структура РЕ заголовка
  148. _IMAGE_NT_HEADERS   STRUCT
  149.     Signature       DWORD       IMAGE_NT_SIGNATURE  ;сигнатура
  150.     FileHeader      _IMAGE_FILE_HEADER  <>          ;файловый заголовок
  151.     OptionalHeader  _IMAGE_OPTIONAL_HEADER  <>      ;опциональный заголовок
  152. _IMAGE_NT_HEADERS ends
  153.  
  154. ;корневой элемент таблицы экспорта
  155. _IMAGE_EXPORT_DIRECTORY STRUCT
  156.     Characteristics         DWORD   ? ;експортные флаги, не используется, выставляется в 0, может быть любым
  157.     TimeDateStamp           DWORD   ? ;временной штамп создания файла, может быть любым
  158.     MajorVersion            WORD    ? ;старшая версия экспортных данных
  159.     MinorVersion            WORD    ? ;младшая версия экспортных данных, обе могут быть любыми
  160.     ModName                 DWORD   ? ;РВА строки содержащей имя ДЛЛ
  161.     Base                    DWORD   ? ;младший ординал экспортируемой функции
  162.     NumberOfFunctions       DWORD   ? ;количество элементов в массиве адресов экспортируемых функций
  163.     NumberOfNames           DWORD   ? ;количество элементов в массиве имён экспортируемых функций
  164.     AddressOfFunctions      DWORD   ? ;РВА массива адресов функций
  165.     AddressOfNames          DWORD   ? ;РВА массива имён функций
  166.     AddressOfNameOrdinals   DWORD   ? ;РВА массива ординалов
  167. _IMAGE_EXPORT_DIRECTORY ends
  168.  
  169. ;элемент таблицы импорта
  170. ;определяющий одну импортируемую функцию
  171. ;если функция импортируется по ординалу, старший бит устанавливается в 1
  172. ;если происходит импорт по имени, то содержит РВА _IMAGE_IMPORT_BY_NAME
  173. _IMAGE_THUNK_DATA32 UNION
  174.     ForwarderString         DWORD   ?
  175.     Function                DWORD   ?
  176.     Ordinal                 DWORD   ?
  177.     AddressOfData           DWORD   ?
  178. _IMAGE_THUNK_DATA32 ends
  179.  
  180. _IMAGE_IMPORT_BY_NAME   STRUCT
  181.     Hint                    WORD    ? ;укороченный идентификатор точки входа
  182.                                      ;индекс в Export Name Pointer Table ДЛЛ
  183.                                      ;если индексируемое имя не совподает с Name_
  184.                                      ;выполняется поиск по всей Export Name Pointer Table
  185.     Name_                   BYTE    ? ;название импортированной функции, StrintZero
  186. _IMAGE_IMPORT_BY_NAME ends
  187.  
  188. ;элемент таблицы импорта
  189. ;в завершающем элементе все поля должны быть нулевыми
  190. _IMAGE_IMPORT_DESCRIPTOR    STRUCT
  191.     ;UNION
  192.     ;Characteristics            DWORD   ? ; 0 для последнего дескриптора
  193.     OriginalFirstThunk      DWORD   ? ;РВА массива _IMAGE_THUNK_DATA32 называемого
  194.                                     ;Import Lookup Table
  195.                                     ;в каждом элементе
  196.                                     ;содержащего ординал (если старший бит установлен в 1, остальная
  197.                                     ;часть - ординал, используется редко), или РВА на структуру _IMAGE_IMPORT_BY_NAME
  198.                                     ;этот массив в процессе загрузки не изменяется, может и совсем не использоваться
  199.                                     ;и OriginalFirstThunk может быть любым
  200.                                     ;линкеры Борланд ставят его в 0
  201.                                     ;для системных ДЛЛ массив содержит адреса импортируемых функций
  202.                                     ;массив паралелен FirstThunk, не правится при загрузке
  203.                                    
  204.     ;ends                          
  205.                
  206.     TimeDateStamp           DWORD   ? ;временной штамп создания файла. Может быть равен
  207.                                       ;0, -1, временному штампу. От этого зависит, как именно загрузчик будет обрабатывать импорт
  208.     ForwarderChaine         DWORD   ? ;предполагалось для перенаправления экспорта
  209.                                       ;загрузчиком не используется, может быть любым
  210.     ModName                 DWORD   ? ;РВА указатель на имя ДЛЛ
  211.     FirstThunk              DWORD   ? ;РВА массива _IMAGE_THUNK_DATA32,
  212.                                     ;называемого Import Address Table
  213.                                     ;до загрузки идентичного Import Lookup Table (в случае использования),
  214.                                     ;после загрузки его элементы содержат адреса функций
  215.                                     ;оба массива заканчиваются DWORD 0                                    
  216.                                     ;на адреса функций
  217.                                     ;SizeOfImage => FirstThunk > SizeOfHeaders 
  218. _IMAGE_IMPORT_DESCRIPTOR ends
  219.  
  220. ;элемент таблицы секций
  221. ;количество секций определяется NumberOfSections _IMAGE_FILE_HEADERS
  222. _IMAGE_SECTION_HEADER       STRUCT
  223.     Name_                   BYTE    8 DUP(?)            ;имя секции, 8 байт
  224.     VirtualSize             DWORD   ?           ;виртуальный размер секции
  225.                                                 ;если = 0, то загрузчик использует SizeOfRawData
  226.                                                 ;выравненное на SectionAlignment
  227.                                                 ;если значение не выравнено, загрузчик может выровнять его
  228.     VirtualAddress          DWORD   ?           ;РВА размещения секции после загрузки
  229.     SizeOfRawData           DWORD   ?           ;размер секции на диске выравненное на FileAligment
  230.     PointerToRawData        DWORD   ?           ;файловое смещение начала секции на диске
  231.                                                 ;должно быть кратно FileAligment
  232.     PointerToRelocations    DWORD   ?           ;для исполняемых файлов не используется, может быть любым
  233.     PointerToLinenumbers    DWORD   ?           ;для исполняемых файлов не используется, может быть любым
  234.     NumberOfRelocations     WORD    ?           ;для исполняемых файлов не используется, может быть любым
  235.     NumberOfLinenumbers     WORD    ?           ;для исполняемых файлов не используется, может быть любым
  236.     Characteristics         DWORD   ?           ;атрибуты секций, определяются приведёнными ниже флагами
  237. _IMAGE_SECTION_HEADER ends
  238.  
  239.  
  240. ;флаги атрибутов секции, используемые для исполняемых файлов
  241. IMAGE_SCN_CNT_CODE                  equ     20h         ;секция содержит исполняемый код
  242. IMAGE_SCN_CNT_INITIALIZED_DATA      equ     40h         ;инициализированные данные
  243. IMAGE_SCN_CNT_UNINITIALIZED_DATA    equ     80h         ;неинициализированные данные
  244. IMAGE_SCN_CNT_MEM_DISCARDABLE       equ     2000000h    ;секция отбрасывается после загрузки программы
  245. IMAGE_SCN_CNT_MEM_SHARED            equ     100000000h  ;является общедоступной
  246. IMAGE_SCN_CNT_MEM_EXECUT            equ     200000000h  ;может исполняться как код
  247. IMAGE_SCN_CNT_MEM_READ              equ     400000000h  ;доступна для чтения, эквивалентна IMAGE_SCN_CNT_MEM_EXECUT
  248. IMAGE_SCN_CNT_MEM_WRITE             equ     800000000h  ;доступна для записи
  249.  
  250.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement