Формат PE
Эта спецификация описывает структуру исполняемых (образ) файлов и файлов объектов в семействе операционных систем Windows. Эти файлы называются переносимыми исполняемыми файлами (PE) и общими файлами формата файлов объектов (COFF) соответственно.
Примечание
Этот документ предоставляется для помощи в разработке средств и приложений для Windows, но не гарантируется, что она является полной спецификацией во всех отношениях. Корпорация Майкрософт оставляет за собой право изменять этот документ без уведомления.
Эта редакция спецификации формата переносимых исполняемых файлов и общих объектов заменяет все предыдущие редакции этой спецификации.
В этом документе указывается структура исполняемых (образов) файлов и файлов объектов в семействе операционных систем Microsoft Windows. Эти файлы называются переносимыми исполняемыми файлами (PE) и общими файлами формата файлов объектов (COFF) соответственно. Имя переносимого исполняемого файла относится к тому, что формат не является определенным для архитектуры.
Некоторые понятия, которые отображаются в этой спецификации, описаны в следующей таблице:
Имя | Описание |
---|---|
Сертификат атрибута |
Сертификат, используемый для связывания проверяемых инструкций с изображением. Ряд различных проверяемых инструкций можно связать с файлом; одним из наиболее полезных является заявление производителя программного обеспечения, указывающее, какой дайджест сообщения изображения, как ожидается, будет. Дайджест сообщений аналогичен контрольной сумме, за исключением того, что очень трудно подделать. Поэтому очень трудно изменить файл, чтобы иметь тот же дайджест сообщений, что и исходный файл. Оператор можно проверить как сделанный производителем с помощью схем шифрования открытого или закрытого ключа. В этом документе описываются сведения о сертификатах атрибутов, отличных от того, чтобы разрешить их вставку в файлы изображений. |
Метка даты и времени |
Метка, используемая для различных целей в нескольких местах в PE или COFF-файле. В большинстве случаев формат каждой метки совпадает с форматом, используемым функциями времени в библиотеке времени выполнения C. Исключения см. в дескриптоне IMAGE_DEBUG_TYPE_REPRO в типе отладки. Если значение метки равно 0 или 0xFFFFFFFF, оно не представляет реальную или значимую метку даты и времени. |
Указатель файла |
Расположение элемента внутри самого файла перед обработкой компоновщиком (в случае файлов объектов) или загрузчиком (в случае файлов изображений). Другими словами, это позиция в файле, хранящейся на диске. |
компоновщик |
Ссылка на компоновщик, предоставляемый Microsoft Visual Studio. |
Файл объекта |
Файл, который предоставляется в качестве входных данных компоновщику. Компоновщик создает файл изображения, который, в свою очередь, используется в качестве входных данных загрузчиком. Термин "объектный файл" не обязательно подразумевает подключение к объектно-ориентированному программированию. |
зарезервировано, должно быть 0 |
Описание поля, указывающего, что значение поля должно быть равно нулю для генераторов, а потребители должны игнорировать поле. |
Относительный виртуальный адрес (RVA) |
В файле изображения это адрес элемента после загрузки в память с базовым адресом файла изображения, вычитаемого из него. RVA элемента почти всегда отличается от его положения в файле на диске (указатель на файл). В файле объекта RVA является менее значимым, так как расположения памяти не назначены. В этом случае RVA будет адресом в разделе (описанном далее в этой таблице), к которому позже применяется перемещение во время связывания. Для простоты компилятор должен просто задать первое RVA в каждом разделе равным нулю. |
секция |
Базовая единица кода или данных в PE или COFF-файле. Например, весь код в файле объекта можно объединить в одном разделе или (в зависимости от поведения компилятора) каждая функция может занимать свой собственный раздел. При использовании дополнительных разделов существует больше накладных расходов на файлы, но компоновщик может связываться в коде более выборочно. Раздел аналогичен сегменту архитектуры Intel 8086. Все необработанные данные в разделе должны быть загружены непрерывно. Кроме того, файл изображения может содержать несколько разделов, таких как TLS или RELOC, которые имеют специальные цели. |
Виртуальный адрес (VA) |
Аналогично RVA, за исключением того, что базовый адрес файла изображения не вычитается. Адрес называется va, так как Windows создает отдельное пространство va для каждого процесса, независимо от физической памяти. Для почти всех целей va следует рассматривать только адрес. Va не так предсказуем, как RVA, так как загрузчик может не загружать образ в предпочтительном расположении. |
В следующем списке описывается формат исполняемого файла Microsoft PE с базой заголовка изображения в верхней части. Раздел из заголовка MS-DOS 2.0, совместимого с EXE, до неиспользуемого раздела непосредственно перед заголовком PE является разделОМ MS-DOS 2.0 и используется только для совместимости MS-DOS.
Заголовок EXE, совместимый с MS-DOS 2.0
неиспользованный
Идентификатор OEM
Сведения о ИЗГОТОВИТЕЛЕ оборудования
Смещение к заголовку PE
Программа заглушки MS-DOS 2.0 и таблица перемещений
неиспользованный
Заголовок PE (выровнен по границе 8 байтов)
Заголовки разделов
Страницы изображений:
импорт сведений
экспорт сведений
базовые перемещения
Информация о ресурсах
В следующем списке описывается формат объекта-модуля Microsoft COFF:
Заголовок Microsoft COFF
Заголовки разделов
Необработанные данные:
кодом
.
сведения об отладке
перемещение
- Заглушка MS-DOS (только изображение)
- Подпись (только изображение)
- Заголовок файла COFF (объект и изображение)
- Необязательный заголовок (только изображение)
Заголовок PE-файла состоит из заглушки Microsoft MS-DOS, подписи PE, заголовка файла COFF и необязательного заголовка. Заголовок файла объекта COFF состоит из заголовка файла COFF и необязательного заголовка. В обоих случаях заголовки файлов следует сразу же заголовками разделов.
Заглушка MS-DOS — это допустимое приложение, которое выполняется в MS-DOS. Он размещается в передней части образа EXE. Компоновщик помещает здесь заглушку по умолчанию, которая выводит сообщение "Эта программа не может быть запущена в режиме DOS" при запуске образа в MS-DOS. Пользователь может указать другую заглушку с помощью параметра компоновщика /STUB.
В расположении 0x3c заглушка имеет смещение файла к сигнатуре PE. Эта информация позволяет Windows правильно выполнять файл образа, даже если он имеет заглушку MS-DOS. Это смещение файла помещается в расположение 0x3c во время связывания.
После заглушки MS-DOS в смещение файла, указанное в 0x3c смещения, представляет собой 4-байтовую подпись, которая определяет файл в виде файла формата PE. Эта подпись — PE\0\0 (буквы "P" и "E", за которым следуют два байта NULL).
В начале файла объекта или сразу после подписи файла изображения является стандартным заголовком файла COFF в следующем формате. Обратите внимание, что загрузчик Windows ограничивает количество разделов до 96.
Смещение | Размер | Поле | Description |
---|---|---|---|
0 |
2 — . |
Машина |
Число, определяющее тип целевого компьютера. Дополнительные сведения см. в разделе "Типы компьютеров". |
2 — . |
2 — . |
NumberOfSections |
Количество разделов. Указывает размер таблицы разделов, которая сразу же следует за заголовками. |
4 |
4 |
TimeDateStamp |
Низкие 32-разрядные значения количества секунд с 00:00 1 января 1970 г. (значение time_t времени выполнения C), указывающее, когда файл был создан. |
8 |
4 |
PointerToSymbolTable |
Смещение файла таблицы символов COFF или ноль, если таблица символов COFF отсутствует. Это значение должно быть равно нулю для изображения, так как сведения об отладке COFF устарели. |
12 |
4 |
NumberOfSymbols |
Количество записей в таблице символов. Эти данные можно использовать для размещения таблицы строк, которая сразу же следует за таблицей символов. Это значение должно быть равно нулю для изображения, так как сведения об отладке COFF устарели. |
16 |
2 — . |
SizeOfOptionalHeader |
Размер необязательного заголовка, который необходим для исполняемых файлов, но не для файлов объектов. Для объектного файла это значение должно быть равно нулю. Описание формата заголовка см. в разделе "Необязательный заголовок( только изображение)". |
18 |
2 — . |
Характеристики |
Флаги, указывающие атрибуты файла. Сведения о конкретных значениях флагов см. в разделе "Характеристики". |
Поле "Компьютер" имеет одно из следующих значений, указывающее тип ЦП. Файл образа можно запускать только на указанном компьютере или в системе, которая эмулирует указанный компьютер.
Константа | значение | Описание |
---|---|---|
IMAGE_FILE_MACHINE_UNKNOWN |
0x0 |
Предполагается, что содержимое этого поля применимо к любому типу компьютера |
IMAGE_FILE_MACHINE_ALPHA |
0x184 |
Альфа-AXP, 32-разрядное адресное пространство |
IMAGE_FILE_MACHINE_ALPHA64 |
0x284 |
Альфа-64, 64-разрядное адресное пространство |
IMAGE_FILE_MACHINE_AM33 |
0x1d3 |
Matsushita AM33 |
IMAGE_FILE_MACHINE_AMD64 |
0x8664 |
x64 |
IMAGE_FILE_MACHINE_ARM |
0x1c0 |
Маленький эндиан ARM |
IMAGE_FILE_MACHINE_ARM64 |
0xaa64 |
ARM64 маленький эндиан |
IMAGE_FILE_MACHINE_ARMNT |
0x1c4 |
Arm Thumb-2 маленький эндиан |
IMAGE_FILE_MACHINE_AXP64 |
0x284 |
AXP 64 (то же, что и Альфа 64) |
IMAGE_FILE_MACHINE_EBC |
0xebc |
Код байтов EFI |
IMAGE_FILE_MACHINE_I386 |
0x14c |
Процессоры Intel 386 или более поздние версии и совместимые процессоры |
IMAGE_FILE_MACHINE_IA64 |
0x200 |
Семейство процессоров Intel Itanium |
IMAGE_FILE_MACHINE_LOONGARCH32 |
0x6232 |
Семейство процессоров LoongArch 32-разрядной версии |
IMAGE_FILE_MACHINE_LOONGARCH64 |
0x6264 |
Семейство процессоров LoongArch 64-разрядной версии |
IMAGE_FILE_MACHINE_M32R |
0x9041 |
Митсуби M32R маленький эндиан |
IMAGE_FILE_MACHINE_MIPS16 |
0x266 |
MIPS16 |
IMAGE_FILE_MACHINE_MIPSFPU |
0x366 |
MIPS с FPU |
IMAGE_FILE_MACHINE_MIPSFPU16 |
0x466 |
MIPS16 с FPU |
IMAGE_FILE_MACHINE_POWERPC |
0x1f0 |
Маленький эндиан Power PC |
IMAGE_FILE_MACHINE_POWERPCFP |
0x1f1 |
Power PC с поддержкой с плавающей запятой |
IMAGE_FILE_MACHINE_R4000 |
0x166 |
Маленький эндиан MIPS |
IMAGE_FILE_MACHINE_RISCV32 |
0x5032 |
32-разрядное адресное пространство RISC-V |
IMAGE_FILE_MACHINE_RISCV64 |
0x5064 |
64-разрядное адресное пространство RISC-V |
IMAGE_FILE_MACHINE_RISCV128 |
0x5128 |
128-разрядное адресное пространство RISC-V |
IMAGE_FILE_MACHINE_SH3 |
0x1a2 |
Хит 3 |
IMAGE_FILE_MACHINE_SH3DSP |
0x1a3 |
Хит 3 DSP |
IMAGE_FILE_MACHINE_SH4 |
0x1a6 |
Хит 4 |
IMAGE_FILE_MACHINE_SH5 |
0x1a8 |
Хит 5 |
IMAGE_FILE_MACHINE_THUMB |
0x1c2 |
Большой палец |
IMAGE_FILE_MACHINE_WCEMIPSV2 |
0x169 |
MIPS маленький эндиан WCE версии 2 |
Поле "Характеристики" содержит флаги, указывающие атрибуты объекта или файла изображения. В настоящее время определены следующие флаги:
Флаг | значение | Описание |
---|---|---|
IMAGE_FILE_RELOCS_STRIPPED |
0x0001 |
Только изображения, Windows CE и Microsoft Windows NT и более поздних версий. Это означает, что файл не содержит базовых перемещений и поэтому его необходимо загрузить по предпочтительному базовому адресу. Если базовый адрес недоступен, загрузчик сообщает об ошибке. Поведение компоновщика по умолчанию — это удаление базовых перемещений из исполняемых файлов (EXE). |
IMAGE_FILE_EXECUTABLE_IMAGE |
0x0002 |
Только изображение. Это означает, что файл образа действителен и может быть запущен. Если этот флаг не задан, он указывает на ошибку компоновщика. |
IMAGE_FILE_LINE_NUMS_STRIPPED |
0x0004 |
Номера строк COFF удалены. Этот флаг устарел и должен быть нулевым. |
IMAGE_FILE_LOCAL_SYMS_STRIPPED |
0x0008 |
Записи таблицы символов COFF для локальных символов удалены. Этот флаг устарел и должен быть нулевым. |
IMAGE_FILE_AGGRESSIVE_WS_TRIM |
0x0010 |
Является устаревшей. Агрессивно обрезать рабочий набор. Этот флаг устарел для Windows 2000 и более поздних версий и должен быть равен нулю. |
IMAGE_FILE_LARGE_ADDRESS_ AWARE |
0x0020 |
Приложение может обрабатывать > 2 ГБ-адресов. |
0x0040 |
Этот флаг зарезервирован для дальнейшего использования. |
|
IMAGE_FILE_BYTES_REVERSED_LO |
0x0080 |
Маленький эндиан: наименьший значительный бит (LSB) предшествует самому значительному биту (MSB) в памяти. Этот флаг устарел и должен быть нулевым. |
IMAGE_FILE_32BIT_MACHINE |
0x0100 |
Компьютер основан на 32-разрядной архитектуре word. |
IMAGE_FILE_DEBUG_STRIPPED |
0x0200 |
Сведения об отладке удаляются из файла образа. |
IMAGE_FILE_REMOVABLE_RUN_ FROM_SWAP |
0x0400 |
Если образ находится на съемных носителях, полностью загрузите его и скопируйте его в файл подкачки. |
IMAGE_FILE_NET_RUN_FROM_SWAP |
0x0800 |
Если образ находится на сетевом носителе, полностью загрузите его и скопируйте его в файл буфера. |
IMAGE_FILE_SYSTEM |
0x1000 |
Файл изображения — это системный файл, а не пользовательская программа. |
IMAGE_FILE_DLL |
0x2000 |
Файл изображения — это библиотека динамической компоновки (DLL). Такие файлы считаются исполняемыми для почти всех целей, хотя они не могут быть напрямую запущены. |
IMAGE_FILE_UP_SYSTEM_ONLY |
0x4000 |
Файл должен выполняться только на компьютере с юнипроцессором. |
IMAGE_FILE_BYTES_REVERSED_HI |
0x8000 |
Большой эндиан: MSB предшествует LSB в памяти. Этот флаг устарел и должен быть нулевым. |
Каждый файл изображения имеет необязательный заголовок, предоставляющий сведения загрузчику. Этот заголовок является необязательным в том смысле, что некоторые файлы (в частности, файлы объектов) не имеют его. Для файлов изображений этот заголовок является обязательным. Файл объекта может иметь необязательный заголовок, но обычно этот заголовок не имеет функции в файле объекта, за исключением увеличения его размера.
Обратите внимание, что размер необязательного заголовка не исправлен. Поле SizeOfOptionalHeader в заголовке COFF должно использоваться для проверки того, что проба в файл для определенного каталога данных не выходит за рамки SizeOfOptionalHeader. Дополнительные сведения см. в разделе "Заголовок файла COFF" (объект и изображение).
Поле NumberOfRvaAndSizes необязательного заголовка также должно использоваться для обеспечения отсутствия пробы для определенной записи каталога данных выходит за рамки необязательного заголовка. Кроме того, важно проверить необязательный магический номер заголовка для совместимости формата.
Необязательный магический номер заголовка определяет, является ли изображение исполняемым файлом PE32 или PE32+.
Магическое число | Формат PE |
---|---|
0x10b |
PE32 |
0x20b |
PE32+ |
Изображения PE32+ позволяют использовать 64-разрядное адресное пространство при ограничении размера изображения до 2 гигабайт. Другие изменения PE32+ рассматриваются в соответствующих разделах.
Необязательный заголовок имеет три основных части.
Смещение (PE32/PE32+) | Размер (PE32/PE32+) | Часть заголовка | Description |
---|---|---|---|
0 |
28/24 |
Стандартные поля |
Поля, определенные для всех реализаций COFF, включая UNIX. |
28/24 |
68/88 |
Поля, относящиеся к Windows |
Дополнительные поля для поддержки конкретных функций Windows (например, подсистем). |
96/112 |
переменные (); |
Каталоги данных |
Пары "Адрес и размер" для специальных таблиц, найденных в файле образа и используемые операционной системой (например, таблица импорта и таблица экспорта). |
Первые восемь полей необязательного заголовка — это стандартные поля, определенные для каждой реализации COFF. Эти поля содержат общие сведения, полезные для загрузки и запуска исполняемого файла. Они не изменяются для формата PE32+.
Смещение | Размер | Поле | Description |
---|---|---|---|
0 |
2 — . |
Магия |
Целое число без знака, определяющее состояние файла изображения. Наиболее распространенное число — 0x10B, который определяет его как обычный исполняемый файл. 0x107 идентифицирует его как образ РОМ и 0x20B определяет его как исполняемый файл PE32+. |
2 — . |
1 |
MajorLinkerVersion |
Основной номер версии компоновщика. |
3 |
1 |
MinorLinkerVersion |
Дополнительный номер версии компоновщика. |
4 |
4 |
SizeOfCode |
Размер раздела кода (текста) или сумма всех разделов кода при наличии нескольких разделов. |
8 |
4 |
SizeOfInitializedData |
Размер инициализированного раздела данных или сумма всех таких разделов при наличии нескольких разделов данных. |
12 |
4 |
SizeOfUninitializedData |
Размер неинициализированного раздела данных (BSS) или сумма всех таких разделов, если существует несколько разделов BSS. |
16 |
4 |
AddressOfEntryPoint |
Адрес точки входа относительно базы образа при загрузке исполняемого файла в память. Для образов программ это начальный адрес. Для драйверов устройств это адрес функции инициализации. Точка входа является необязательной для библиотек DLL. Если точка входа отсутствует, это поле должно быть равно нулю. |
20 |
4 |
BaseOfCode |
Адрес, относительный к базе образа начального раздела кода при загрузке в память. |
PE32 содержит это дополнительное поле, которое отсутствует в PE32+, после BaseOfCode.
Смещение | Размер | Поле | Description |
---|---|---|---|
24 |
4 |
BaseOfData |
Адрес, относительный к базе образа начального раздела данных при загрузке в память. |
Следующие 21 поля являются расширением к необязательному формату заголовка COFF. Они содержат дополнительные сведения, необходимые компоновщику и загрузчику в Windows.
Смещение (PE32/ PE32+) | Размер (PE32/ PE32+) | Поле | Description |
---|---|---|---|
28/24 |
4/8 |
ImageBase |
Предпочтительный адрес первого байта изображения при загрузке в память; должен иметь значение 64 K. По умолчанию для библиотек DLL используется 0x10000000. По умолчанию для EXEs Windows CE используется 0x00010000. По умолчанию для Windows NT, Windows 2000, Windows XP, Windows 95, Windows 98 и Windows Me 0x00400000. |
32/32 |
4 |
SectionAlignment |
Выравнивание разделов (в байтах) при загрузке в память. Оно должно быть больше или равно FileAlignment. Значением по умолчанию является размер страницы для архитектуры. |
36/36 |
4 |
FileAlignment |
Коэффициент выравнивания (в байтах), используемый для выравнивания необработанных данных разделов в файле образа. Значение должно иметь значение от 2 от 512 до 64 К, включительно. Значение по умолчанию — 512. Если размер страницы sectionAlignment меньше размера страницы архитектуры, FileAlignment должен соответствовать SectionAlignment. |
40/40 |
2 — . |
MajorOperatingSystemVersion |
Основной номер версии требуемой операционной системы. |
42/42 |
2 — . |
MinorOperatingSystemVersion |
Дополнительный номер версии требуемой операционной системы. |
44/44 |
2 — . |
MajorImageVersion |
Основной номер версии образа. |
46/46 |
2 — . |
MinorImageVersion |
Дополнительный номер версии образа. |
48/48 |
2 — . |
MajorSubsystemVersion |
Основной номер версии подсистемы. |
50/50 |
2 — . |
MinorSubsystemVersion |
Дополнительный номер версии подсистемы. |
52/52 |
4 |
Win32VersionValue |
Зарезервировано, должно быть равно нулю. |
56/56 |
4 |
SizeOfImage |
Размер изображения (в байтах), включая все заголовки, так как изображение загружается в память. Это должно быть несколько разделов. |
60/60 |
4 |
SizeOfHeaders |
Объединенный размер заглушки MS-DOS, заголовка PE и заголовков разделов округляется до нескольких значений FileAlignment. |
64/64 |
4 |
Контрольная сумма |
Контрольная сумма файла изображения. Алгоритм вычисления контрольной суммы включается в IMAGHELP.DLL. Далее проверяется проверка во время загрузки: все драйверы, все библиотеки DLL, загруженные во время загрузки, и все библиотеки DLL, загруженные в критически важный процесс Windows. |
68/68 |
2 — . |
Подсистема |
Подсистема, необходимая для выполнения этого образа. Дополнительные сведения см. в разделе "Подсистема Windows". |
70/70 |
2 — . |
DllCharacteristics |
Дополнительные сведения см . в разделе "Характеристики DLL" далее в этой спецификации. |
72/72 |
4/8 |
SizeOfStackReserve |
Размер резервируемого стека. Фиксируется только SizeOfStackCommit; Остальная часть становится доступной по одной странице за раз, пока не будет достигнут размер резерва. |
76/80 |
4/8 |
SizeOfStackCommit |
Размер фиксируемого стека. |
80/88 |
4/8 |
SizeOfHeapReserve |
Размер резервируемого пространства в локальной куче. Фиксируется только SizeOfHeapCommit; Остальная часть становится доступной по одной странице за раз, пока не будет достигнут размер резерва. |
84/96 |
4/8 |
SizeOfHeapCommit |
Размер фиксируемого пространства в локальной куче. |
88/104 |
4 |
LoaderFlags |
Зарезервировано, должно быть равно нулю. |
92/108 |
4 |
NumberOfRvaAndSizes |
Количество записей каталога данных в оставшейся части необязательного заголовка. Каждая из них описывает расположение и размер. |
Следующие значения, определенные для поля подсистемы необязательного заголовка, определяют, какая подсистема Windows (если она есть) требуется для запуска образа.
Константа | значение | Описание |
---|---|---|
IMAGE_SUBSYSTEM_UNKNOWN |
0 |
Неизвестная подсистема |
IMAGE_SUBSYSTEM_NATIVE |
1 |
Драйверы устройств и собственные процессы Windows |
IMAGE_SUBSYSTEM_WINDOWS_GUI |
2 — . |
Подсистема графического пользовательского интерфейса Windows (GUI) |
IMAGE_SUBSYSTEM_WINDOWS_CUI |
3 |
Подсистема символов Windows |
IMAGE_SUBSYSTEM_OS2_CUI |
5 |
Подсистема символов ОС/2 |
IMAGE_SUBSYSTEM_POSIX_CUI |
7 |
Подсистема символов Posix |
IMAGE_SUBSYSTEM_NATIVE_WINDOWS |
8 |
Собственный драйвер Win9x |
IMAGE_SUBSYSTEM_WINDOWS_CE_GUI |
9 |
Windows CE |
IMAGE_SUBSYSTEM_EFI_APPLICATION |
10 |
Расширяемое приложение интерфейса встроенного ПО (EFI) |
IMAGE_SUBSYSTEM_EFI_BOOT_ SERVICE_DRIVER |
11 |
Драйвер EFI со службами загрузки |
драйвер IMAGE_SUBSYSTEM_EFI_RUNTIME_ |
12 |
Драйвер EFI со службами времени выполнения |
IMAGE_SUBSYSTEM_EFI_ROM |
13 |
Образ РОМ EFI |
IMAGE_SUBSYSTEM_XBOX |
14 |
XBOX |
IMAGE_SUBSYSTEM_WINDOWS_BOOT_APPLICATION |
16 |
Загрузочное приложение Windows. |
Следующие значения определяются для поля DllCharacteristics необязательного заголовка.
Константа | значение | Описание |
---|---|---|
0x0001 |
Зарезервировано, должно быть равно нулю. |
|
0x0002 |
Зарезервировано, должно быть равно нулю. |
|
0x0004 |
Зарезервировано, должно быть равно нулю. |
|
0x0008 |
Зарезервировано, должно быть равно нулю. |
|
IMAGE_DLLCHARACTERISTICS_HIGH_ENTROPY_VA |
0x0020 |
Изображение может обрабатывать 64-разрядное виртуальное адресное пространство с высокой энтропией. |
IMAGE_DLLCHARACTERISTICS_ DYNAMIC_BASE |
0x0040 |
Библиотеку DLL можно переместить во время загрузки. |
IMAGE_DLLCHARACTERISTICS_ FORCE_INTEGRITY |
0x0080 |
Проверки целостности кода применяются. |
IMAGE_DLLCHARACTERISTICS_ NX_COMPAT |
0x0100 |
Изображение совместимо с NX. |
IMAGE_DLLCHARACTERISTICS_ NO_ISOLATION |
0x0200 |
Изоляция учитывается, но не изолирует изображение. |
IMAGE_DLLCHARACTERISTICS_ NO_SEH |
0x0400 |
Не использует обработку структурированных исключений (SE). В этом изображении не может вызываться обработчик SE. |
IMAGE_DLLCHARACTERISTICS_ NO_BIND |
0x0800 |
Не привязывайтесь к изображению. |
IMAGE_DLLCHARACTERISTICS_APPCONTAINER |
0x1000 |
Изображение должно выполняться в AppContainer. |
IMAGE_DLLCHARACTERISTICS_ WDM_DRIVER |
0x2000 |
Драйвер WDM. |
IMAGE_DLLCHARACTERISTICS_GUARD_CF |
0x4000 |
Изображение поддерживает Функцию управления Flow Guard. |
IMAGE_DLLCHARACTERISTICS_ TERMINAL_SERVER_AWARE |
0x8000 |
С учетом сервера терминалов. |
Каждый каталог данных предоставляет адрес и размер таблицы или строки, которую использует Windows. Эти записи каталога данных загружаются в память, чтобы система может использовать их во время выполнения. Каталог данных — это 8-байтовое поле со следующим объявлением:
typedef struct _IMAGE_DATA_DIRECTORY {
DWORD VirtualAddress;
DWORD Size;
} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
Первое поле VirtualAddress фактически является RVA таблицы. RVA — это адрес таблицы относительно базового адреса изображения при загрузке таблицы. Второе поле дает размер в байтах. Каталоги данных, которые образуют последнюю часть необязательного заголовка, перечислены в следующей таблице.
Обратите внимание, что число каталогов не исправлено. Перед поиском определенного каталога проверьте поле NumberOfRvaAndSizes в необязательном заголовке.
Кроме того, не предполагается, что RVAs в этой таблице указывают на начало раздела или что разделы, содержащие определенные таблицы, имеют определенные имена.
Смещение (PE/PE32+) | Размер | Поле | Description |
---|---|---|---|
96/112 |
8 |
Экспорт таблицы |
Адрес и размер таблицы экспорта. Дополнительные сведения см. в разделе .edata (только изображение). |
104/120 |
8 |
Импорт таблицы |
Адрес и размер таблицы импорта. Дополнительные сведения см. в разделе .idata. |
112/128 |
8 |
Таблица ресурсов |
Адрес и размер таблицы ресурсов. Дополнительные сведения см. в разделе RSRC. |
120/136 |
8 |
Таблица исключений |
Адрес и размер таблицы исключений. Дополнительные сведения см. в разделе .pdata. |
128/144 |
8 |
Таблица сертификатов |
Адрес и размер таблицы сертификатов атрибутов. Дополнительные сведения см. в таблице сертификатов атрибутов (только изображение). |
136/152 |
8 |
Базовая таблица перемещений |
Адрес и размер базовой таблицы перемещений. Дополнительные сведения см. в разделе .reloc (только изображение). |
144/160 |
8 |
Отладка |
Начальный адрес и размер отладочных данных. Дополнительные сведения см. в разделе отладки . |
152/168 |
8 |
Архитектура |
Зарезервировано, должно быть 0 |
160/176 |
8 |
Глобальный Ptr |
RVA значения, хранящегося в глобальном регистре указателя. Размер элемента этой структуры должен быть равен нулю. |
168/184 |
8 |
Таблица TLS |
Адрес и размер таблицы локального хранилища потока (TLS). Дополнительные сведения см. в разделе TLS. |
176/192 |
8 |
Загрузка таблицы конфигурации |
Адрес и размер таблицы конфигурации загрузки. Дополнительные сведения см. в разделе "Структура конфигурации загрузки ( только образ)". |
184/200 |
8 |
Привязанный импорт |
Адрес и размер привязанной таблицы импорта. |
192/208 |
8 |
IAT |
Адрес и размер таблицы адресов импорта. Дополнительные сведения см. в разделе "Импорт таблицы адресов". |
200/216 |
8 |
Дескриптор импорта задержки |
Адрес дескриптора импорта задержки и размер. Дополнительные сведения см. в разделе "Таблицы импорта отложенной нагрузки" (только изображения). |
208/224 |
8 |
Заголовок среды выполнения CLR |
Адрес и размер заголовка среды выполнения CLR. Дополнительные сведения см. в разделе cormeta (только для объектов). |
216/232 |
8 |
Зарезервировано, должно быть равно нулю |
Запись таблицы сертификатов указывает на таблицу сертификатов атрибутов. Эти сертификаты не загружаются в память как часть образа. Таким образом, первое поле этой записи, которое обычно является RVA, является указателем на файл.
Каждая строка таблицы разделов, в действительности, является заголовком раздела. Эта таблица сразу же следует за необязательным заголовком, если таковой есть. Это необходимо, так как заголовок файла не содержит прямой указатель на таблицу разделов. Вместо этого расположение таблицы разделов определяется путем вычисления расположения первого байта после заголовков. Обязательно используйте размер необязательного заголовка, как указано в заголовке файла.
Количество записей в таблице разделов определяется полем NumberOfSections в заголовке файла. Записи в таблице разделов нумеруются начиная с одного (1). Записи раздела кода и памяти данных находятся в порядке, выбранном компоновщиком.
В файле изображения виртуальные машины для разделов должны быть назначены компоновщиком, чтобы они были в порядке возрастания и рядом, и они должны быть несколькими значения SectionAlignment в необязательном заголовке.
Каждый заголовок раздела (запись таблицы раздела) имеет следующий формат в общей сложности 40 байт на запись.
Смещение | Размер | Поле | Description |
---|---|---|---|
0 |
8 |
Имя |
8-байтовая строка с кодировкой UTF-8 с пустым байтом. Если строка длиной ровно 8 символов, то не существует конца NULL. Для более длинных имен это поле содержит косую черту (/), за которой следует представление ASCII десятичного числа, которое является смещением в строковую таблицу. Исполняемые изображения не используют строку таблицы и не поддерживают имена разделов дольше 8 символов. Длинные имена в файлах объектов усечены, если они создаются в исполняемый файл. |
8 |
4 |
VirtualSize |
Общий размер раздела при загрузке в память. Если это значение больше SizeOfRawData, раздел равен нулю. Это поле допустимо только для исполняемых образов и должно быть равно нулю для файлов объектов. |
12 |
4 |
VirtualAddress |
Для исполняемых образов адрес первого байта раздела относительно базы образа при загрузке раздела в память. Для файлов объектов это поле является адресом первого байта перед применением перемещения; Для простоты компиляторы должны задать это значение нулю. В противном случае это произвольное значение, вычитаемое из смещений во время перемещения. |
16 |
4 |
SizeOfRawData |
Размер раздела (для файлов объектов) или размер инициализированных данных на диске (для файлов изображений). Для исполняемых образов это должно быть несколько fileAlignment из необязательного заголовка. Если это меньше VirtualSize, оставшаяся часть раздела заполнена нулевым. Так как поле SizeOfRawData округляется, но поле VirtualSize не является, размер SizeOfRawData также превышает VirtualSize. Если раздел содержит только неинициализированные данные, это поле должно быть равно нулю. |
20 |
4 |
PointerToRawData |
Указатель файла на первую страницу раздела в файле COFF. Для исполняемых образов это должно быть несколько fileAlignment из необязательного заголовка. Для файлов объектов значение должно быть выровнено на границе 4-байтов для оптимальной производительности. Если раздел содержит только неинициализированные данные, это поле должно быть равно нулю. |
24 |
4 |
PointerToRelocations |
Указатель файла на начало записей перемещений для раздела. Это значение равно нулю для исполняемых образов или при отсутствии перемещений. |
28 |
4 |
PointerToLinenumbers |
Указатель файла на начало записей номера строки для раздела. Это значение равно нулю, если нет номеров строк COFF. Это значение должно быть равно нулю для изображения, так как сведения об отладке COFF устарели. |
32 |
2 — . |
NumberOfRelocations |
Количество записей перемещений для раздела. Это значение равно нулю для исполняемых образов. |
34 |
2 — . |
NumberOfLinenumbers |
Количество записей строк для раздела. Это значение должно быть равно нулю для изображения, так как сведения об отладке COFF устарели. |
36 |
4 |
Характеристики |
Флаги, описывающие характеристики раздела. Дополнительные сведения см. в разделе "Флаги разделов". |
Флаги раздела в поле "Характеристики" заголовка раздела указывают характеристики раздела.
Флаг | значение | Описание |
---|---|---|
0x00000000 |
Зарезервировано для последующего использования. |
|
0x00000001 |
Зарезервировано для последующего использования. |
|
0x00000002 |
Зарезервировано для последующего использования. |
|
0x00000004 |
Зарезервировано для последующего использования. |
|
IMAGE_SCN_TYPE_NO_PAD |
0x00000008 |
Раздел не должен быть заполнен на следующую границу. Этот флаг устарел и заменяется IMAGE_SCN_ALIGN_1BYTES. Это допустимо только для файлов объектов. |
0x00000010 |
Зарезервировано для последующего использования. |
|
IMAGE_SCN_CNT_CODE |
0x00000020 |
В разделе содержится исполняемый код. |
IMAGE_SCN_CNT_INITIALIZED_DATA |
0x00000040 |
В разделе содержатся инициализированные данные. |
ДАННЫЕ IMAGE_SCN_CNT_UNINITIALIZED_ |
0x00000080 |
В разделе содержатся неинициализированные данные. |
IMAGE_SCN_LNK_OTHER |
0x00000100 |
Зарезервировано для последующего использования. |
IMAGE_SCN_LNK_INFO |
0x00000200 |
В разделе содержатся комментарии или другие сведения. Раздел drectve имеет этот тип. Это допустимо только для файлов объектов. |
0x00000400 |
Зарезервировано для последующего использования. |
|
IMAGE_SCN_LNK_REMOVE |
0x00000800 |
Раздел не станет частью образа. Это допустимо только для файлов объектов. |
IMAGE_SCN_LNK_COMDAT |
0x00001000 |
В разделе содержатся данные COMDAT. Дополнительные сведения см. в разделах COMDAT (только для объектов). Это допустимо только для файлов объектов. |
IMAGE_SCN_GPREL |
0x00008000 |
В этом разделе содержатся данные, на которые ссылается глобальный указатель (GP). |
IMAGE_SCN_MEM_PURGEABLE |
0x00020000 |
Зарезервировано для последующего использования. |
IMAGE_SCN_MEM_16BIT |
0x00020000 |
Зарезервировано для последующего использования. |
IMAGE_SCN_MEM_LOCKED |
0x00040000 |
Зарезервировано для последующего использования. |
IMAGE_SCN_MEM_PRELOAD |
0x00080000 |
Зарезервировано для последующего использования. |
IMAGE_SCN_ALIGN_1BYTES |
0x00100000 |
Выравнивание данных по границе 1-байтов. Допустимо только для файлов объектов. |
IMAGE_SCN_ALIGN_2BYTES |
0x00200000 |
Выравнивание данных по границе 2-байтов. Допустимо только для файлов объектов. |
IMAGE_SCN_ALIGN_4BYTES |
0x00300000 |
Выравнивание данных по границе 4-байтов. Допустимо только для файлов объектов. |
IMAGE_SCN_ALIGN_8BYTES |
0x00400000 |
Выравнивание данных по границе 8-байтов. Допустимо только для файлов объектов. |
IMAGE_SCN_ALIGN_16BYTES |
0x00500000 |
Выравнивание данных по границе 16-байтов. Допустимо только для файлов объектов. |
IMAGE_SCN_ALIGN_32BYTES |
0x00600000 |
Выравнивание данных по границе 32-байтов. Допустимо только для файлов объектов. |
IMAGE_SCN_ALIGN_64BYTES |
0x00700000 |
Выравнивание данных по границе 64-байтов. Допустимо только для файлов объектов. |
IMAGE_SCN_ALIGN_128BYTES |
0x00800000 |
Выравнивание данных по границе 128 байтов. Допустимо только для файлов объектов. |
IMAGE_SCN_ALIGN_256BYTES |
0x00900000 |
Выравнивание данных по границе 256 байтов. Допустимо только для файлов объектов. |
IMAGE_SCN_ALIGN_512BYTES |
0x00A00000 |
Выравнивание данных по границе 512-байтов. Допустимо только для файлов объектов. |
IMAGE_SCN_ALIGN_1024BYTES |
0x00B00000 |
Выравнивание данных по границе 1024-байтов. Допустимо только для файлов объектов. |
IMAGE_SCN_ALIGN_2048BYTES |
0x00C00000 |
Выравнивание данных по границе байтов 2048. Допустимо только для файлов объектов. |
IMAGE_SCN_ALIGN_4096BYTES |
0x00D00000 |
Выравнивание данных по границе 4096 байтов. Допустимо только для файлов объектов. |
IMAGE_SCN_ALIGN_8192BYTES |
0x00E00000 |
Выравнивание данных по границе 8192-байтов. Допустимо только для файлов объектов. |
IMAGE_SCN_LNK_NRELOC_OVFL |
0x01000000 |
В этом разделе содержатся расширенные перемещения. |
IMAGE_SCN_MEM_DISCARDABLE |
0x02000000 |
Раздел можно отменить по мере необходимости. |
IMAGE_SCN_MEM_NOT_CACHED |
0x04000000 |
Раздел нельзя кэшировать. |
IMAGE_SCN_MEM_NOT_PAGED |
0x08000000 |
Раздел недоступен для страницы. |
IMAGE_SCN_MEM_SHARED |
0x10000000 |
Раздел можно совместно использовать в памяти. |
IMAGE_SCN_MEM_EXECUTE |
0x20000000 |
Раздел можно выполнить как код. |
IMAGE_SCN_MEM_READ |
0x40000000 |
Раздел можно прочитать. |
IMAGE_SCN_MEM_WRITE |
0x80000000 |
Раздел можно записать в. |
IMAGE_SCN_LNK_NRELOC_OVFL указывает, что количество перемещений для раздела превышает 16 битов, зарезервированных для него в заголовке раздела. Если бит задан и поле NumberOfRelocations в заголовке раздела 0xffff, фактическое количество перемещений хранится в 32-разрядном поле VirtualAddress первого перемещения. Это ошибка, если установлен IMAGE_SCN_LNK_NRELOC_OVFL и в разделе меньше 0xffff перемещения.
Символ "$" (знак доллара) имеет специальную интерпретацию имен разделов в файлах объектов.
При определении раздела изображения, содержащего содержимое раздела объекта, компоновщик удаляет символы "$" и все символы, следуют за ним. Таким образом, раздел объекта с именем .text$X фактически вносит вклад в текстовый раздел в изображении.
Однако символы после "$" определяют порядок вкладов в раздел изображения. Все вклады с одинаковым именем раздела объектов выделяются последовательно в изображении, а блоки вкладов сортируются по лексическому порядку по имени объекта-раздела. Таким образом, все в файлах объектов с именем раздела .text$X заканчивается вместе после вкладов .text$W и до вклада .text$Y .
Имя раздела в файле изображения никогда не содержит символ $.
- Данные раздела
- Перемещение COFF (только для объектов)
- Номера строк COFF (не рекомендуется)
- Таблица символов COFF
- Вспомогательные записи символов
- Таблица строк COFF
- Таблица сертификатов атрибутов (только изображение)
- Таблицы импорта отложенной нагрузки (только изображение)
Структуры данных, описанные до сих пор до необязательного заголовка, находятся в фиксированном смещение от начала файла (или из заголовка PE, если файл является изображением, содержащим заглушку MS-DOS).
Оставшаяся часть объекта или файла изображения COFF содержит блоки данных, которые не обязательно находятся в смещении определенного файла. Вместо этого расположения определяются указателями в необязательном заголовке или заголовке раздела.
Исключением является изображение со значением SectionAlignment меньше размера страницы архитектуры (4 K для Intel x86 и MIPS и 8 K для Itanium). Описание SectionAlignment см. в разделе "Необязательный заголовок( только изображение)". В этом случае существуют ограничения на смещение файлов данных раздела, как описано в разделе 5.1 "Данные раздела". Другим исключением является то, что сведения о сертификате атрибута и отладке должны быть помещены в самом конце файла изображения, при этом таблица сертификатов атрибутов непосредственно перед разделом отладки, так как загрузчик не сопоставляет их с памятью. Правило о сертификате атрибута и сведения об отладке не применяются к файлам объектов, однако.
Инициализированные данные для раздела состоят из простых блоков байтов. Однако для разделов, содержащих все нули, данные раздела не должны быть включены.
Данные для каждого раздела находятся в смещение файла, заданное полем PointerToRawData в заголовке раздела. Размер этих данных в файле указывается в поле SizeOfRawData. Если SizeOfRawData меньше VirtualSize, оставшаяся часть заполняется нулями.
В файле изображения данные раздела должны быть выровнены по границе, как указано в поле FileAlignment в необязательном заголовке. Данные раздела должны отображаться в порядке значений RVA для соответствующих разделов (как и отдельные заголовки разделов в таблице разделов).
Существуют дополнительные ограничения на файлы изображений, если значение SectionAlignment в необязательном заголовке меньше размера страницы архитектуры. Для таких файлов расположение данных раздела в файле должно соответствовать его расположению в памяти при загрузке образа, чтобы физическое смещение для данных раздела совпадает с RVA.
Файлы объектов содержат перемещения COFF, которые указывают, как следует изменять данные раздела при размещении в файле образа и последующей загрузке в память.
Файлы изображений не содержат переносов COFF, так как все указанные символы уже назначены адресам в неструктурированном адресном пространстве. Изображение содержит сведения о перемещении в виде базовых перемещений в разделе reloc (если изображение не имеет атрибута IMAGE_FILE_RELOCS_STRIPPED). Дополнительные сведения см. в разделе .reloc (только изображение).
Для каждого раздела в файле объекта массив записей фиксированной длины содержит переносы COFF раздела. Позиция и длина массива указываются в заголовке раздела. Каждый элемент массива имеет следующий формат.
Смещение | Размер | Поле | Description |
---|---|---|---|
0 |
4 |
VirtualAddress |
Адрес элемента, к которому применяется перемещение. Это смещение с начала раздела, а также значение поля RVA/Offset раздела. См. таблицу разделов (заголовки разделов). Например, если первый байт раздела имеет адрес 0x10, третий байт имеет адрес 0x12. |
4 |
4 |
SymbolTableIndex |
Отсчитываемый от нуля индекс в таблице символов. Этот символ дает адрес, используемый для перемещения. Если указанный символ имеет класс хранилища разделов, адрес символа — это адрес с первым разделом того же имени. |
8 |
2 — . |
Введите . |
Значение, указывающее тип перемещения, который необходимо выполнить. Допустимые типы перемещения зависят от типа компьютера. См . индикаторы типов. |
Если символ, на который ссылается поле SymbolTableIndex, имеет класс хранилища IMAGE_SYM_CLASS_SECTION, адрес символа является началом раздела. Раздел обычно находится в одном файле, за исключением случаев, когда файл объекта является частью архива (библиотеки). В этом случае раздел можно найти в любом другом файле объекта в архиве с тем же именем элемента архива, что и текущий файл объекта. (Связь с именем элемента архива используется в связывании таблиц импорта, то есть в разделе idata.)
Поле "Тип" записи перемещений указывает, какой тип перемещения должен выполняться. Для каждого типа компьютера определяются различные типы перемещения.
Следующие индикаторы типа перемещения определяются для процессоров x64 и совместимых процессоров.
Константа | значение | Описание |
---|---|---|
IMAGE_REL_AMD64_ABSOLUTE |
0x0000 |
Перемещение игнорируется. |
IMAGE_REL_AMD64_ADDR64 |
0x0001 |
64-разрядная версия целевого объекта перемещения. |
IMAGE_REL_AMD64_ADDR32 |
0x0002 |
32-разрядная va целевого объекта перемещения. |
IMAGE_REL_AMD64_ADDR32NB |
0x0003 |
32-разрядный адрес без базы образа (RVA). |
IMAGE_REL_AMD64_REL32 |
0x0004 |
32-разрядный относительный адрес из байта после перемещения. |
IMAGE_REL_AMD64_REL32_1 |
0x0005 |
32-разрядный адрес относительно расстояния байта 1 от перемещения. |
IMAGE_REL_AMD64_REL32_2 |
0x0006 |
32-разрядный адрес относительно расстояния байта 2 от перемещения. |
IMAGE_REL_AMD64_REL32_3 |
0x0007 |
32-разрядный адрес относительно расстояния байтов 3 от перемещения. |
IMAGE_REL_AMD64_REL32_4 |
0x0008 |
32-разрядный адрес относительно расстояния байтов 4 от перемещения. |
IMAGE_REL_AMD64_REL32_5 |
0x0009 |
32-разрядный адрес относительно расстояния байта 5 от перемещения. |
IMAGE_REL_AMD64_SECTION |
0x000A |
16-разрядный индекс раздела раздела, содержащего целевой объект. Это используется для поддержки сведений об отладке. |
IMAGE_REL_AMD64_SECREL |
0x000B |
32-разрядное смещение целевого объекта с начала его раздела. Это используется для поддержки отладки сведений и локального хранилища статического потока. |
IMAGE_REL_AMD64_SECREL7 |
0x000C |
7-разрядное смещение без знака из базы раздела, содержащего целевой объект. |
IMAGE_REL_AMD64_TOKEN |
0x000D |
Маркеры СРЕДЫ CLR. |
IMAGE_REL_AMD64_SREL32 |
0x000E |
32-разрядное значение, зависящее от диапазона подписи, которое создается в объект. |
IMAGE_REL_AMD64_PAIR |
0x000F |
Пара, которая должна немедленно следовать каждому зависимому от диапазона значению. |
IMAGE_REL_AMD64_SSPAN32 |
0x0010 |
32-разрядное значение, зависящее от диапазона подписи, которое применяется во время связи. |
Для процессоров ARM определены следующие индикаторы типа перемещения.
Константа | значение | Описание |
---|---|---|
IMAGE_REL_ARM_ABSOLUTE |
0x0000 |
Перемещение игнорируется. |
IMAGE_REL_ARM_ADDR32 |
0x0001 |
32-разрядная версия целевого объекта. |
IMAGE_REL_ARM_ADDR32NB |
0x0002 |
32-разрядная RVA целевого объекта. |
IMAGE_REL_ARM_BRANCH24 |
0x0003 |
24-разрядное смещение относительно целевого объекта. |
IMAGE_REL_ARM_BRANCH11 |
0x0004 |
Ссылка на вызов subroutine. Ссылка состоит из двух 16-разрядных инструкций с 11-разрядными смещениями. |
IMAGE_REL_ARM_REL32 |
0x000A |
32-разрядный относительный адрес из байта после перемещения. |
IMAGE_REL_ARM_SECTION |
0x000E |
16-разрядный индекс раздела раздела, содержащего целевой объект. Это используется для поддержки сведений об отладке. |
IMAGE_REL_ARM_SECREL |
0x000F |
32-разрядное смещение целевого объекта с начала его раздела. Это используется для поддержки отладки сведений и локального хранилища статического потока. |
IMAGE_REL_ARM_MOV32 |
0x0010 |
32-разрядная версия целевого объекта. Это перемещение применяется с помощью инструкции MOVW для низких 16 битов, за которым следует MOVT для высоких 16 битов. |
IMAGE_REL_THUMB_MOV32 |
0x0011 |
32-разрядная версия целевого объекта. Это перемещение применяется с помощью инструкции MOVW для низких 16 битов, за которым следует MOVT для высоких 16 битов. |
IMAGE_REL_THUMB_BRANCH20 |
0x0012 |
Инструкция исправлена с 21-разрядным относительным перемещением к 2-байтовой выровненной цели. Наименьший значительный бит смещения всегда равен нулю и не хранится. Это перемещение соответствует инструкции Thumb-2 32-разрядной условной B. |
Неиспользованный |
0x0013 |
|
IMAGE_REL_THUMB_BRANCH24 |
0x0014 |
Инструкция исправлена с 25-разрядным относительным перемещением к 2-байтовой выровненной цели. Наименьший значительный бит смещения равен нулю и не хранится. Это перемещение соответствует инструкции Thumb-2 B. |
IMAGE_REL_THUMB_BLX23 |
0x0015 |
Инструкция исправлена с 25-разрядным относительным перемещением к 4-байтовой выровненной цели. Низкие 2 бита смещения равны нулю и не хранятся. Это перемещение соответствует инструкции Thumb-2 BLX. |
IMAGE_REL_ARM_PAIR |
0x0016 |
Перемещение допустимо только в том случае, если оно сразу же следует ARM_REFHI или THUMB_REFHI. Его SymbolTableIndex содержит смещение, а не индекс в таблицу символов. |
Для процессоров ARM64 определены следующие индикаторы типа перемещения.
Константа | значение | Описание |
---|---|---|
IMAGE_REL_ARM64_ABSOLUTE |
0x0000 |
Перемещение игнорируется. |
IMAGE_REL_ARM64_ADDR32 |
0x0001 |
32-разрядная версия целевого объекта. |
IMAGE_REL_ARM64_ADDR32NB |
0x0002 |
32-разрядная RVA целевого объекта. |
IMAGE_REL_ARM64_BRANCH26 |
0x0003 |
26-разрядное смещение относительного перемещения к целевому объекту для инструкций B и BL. |
IMAGE_REL_ARM64_PAGEBASE_REL21 |
0x0004 |
Страница базы целевого объекта для инструкции ADRP. |
IMAGE_REL_ARM64_REL21 |
0x0005 |
12-разрядное смещение относительно целевого объекта для инструкции ADR |
IMAGE_REL_ARM64_PAGEOFFSET_12A |
0x0006 |
Смещение 12-разрядной страницы целевого объекта для инструкций ADD/ADD (немедленно) с нулевым сдвигом. |
IMAGE_REL_ARM64_PAGEOFFSET_12L |
0x0007 |
Смещение 12-разрядной страницы целевого объекта для инструкции LDR (индексированные, незаписанные немедленно). |
IMAGE_REL_ARM64_SECREL |
0x0008 |
32-разрядное смещение целевого объекта с начала его раздела. Это используется для поддержки отладки сведений и локального хранилища статического потока. |
IMAGE_REL_ARM64_SECREL_LOW12A |
0x0009 |
Бит 0:11 смещения раздела целевого объекта для инструкций ADD/ADD (немедленно) с нулевым сдвигом. |
IMAGE_REL_ARM64_SECREL_HIGH12A |
0x000A |
Бит 12:23 смещения раздела целевого объекта для инструкций ADD/ADD (немедленно) с нулевым сдвигом. |
IMAGE_REL_ARM64_SECREL_LOW12L |
0x000B |
Бит 0:11 смещения раздела целевого объекта для инструкции LDR (индексированные, незаписанные немедленно). |
IMAGE_REL_ARM64_TOKEN |
0x000C |
Токен CLR. |
IMAGE_REL_ARM64_SECTION |
0x000D |
16-разрядный индекс раздела раздела, содержащего целевой объект. Это используется для поддержки сведений об отладке. |
IMAGE_REL_ARM64_ADDR64 |
0x000E |
64-разрядная версия целевого объекта перемещения. |
IMAGE_REL_ARM64_BRANCH19 |
0x000F |
19-разрядное смещение в целевой объект перемещения для условной инструкции B. |
IMAGE_REL_ARM64_BRANCH14 |
0x0010 |
14-разрядное смещение к целевому объекту перемещения для инструкций ТБZ и ТБNZ. |
IMAGE_REL_ARM64_REL32 |
0x0011 |
32-разрядный относительный адрес из байта после перемещения. |
Для процессоров SH3 и SH4 определены следующие индикаторы типа перемещения. Перемещение с определенными значениями SH5 отмечается как SHM (SH Media).
Константа | значение | Описание |
---|---|---|
IMAGE_REL_SH3_ABSOLUTE |
0x0000 |
Перемещение игнорируется. |
IMAGE_REL_SH3_DIRECT16 |
0x0001 |
Ссылка на 16-разрядное расположение, содержащее va целевого символа. |
IMAGE_REL_SH3_DIRECT32 |
0x0002 |
32-разрядная ВЕРСИЯ целевого символа. |
IMAGE_REL_SH3_DIRECT8 |
0x0003 |
Ссылка на 8-разрядное расположение, содержащее va целевого символа. |
IMAGE_REL_SH3_DIRECT8_WORD |
0x0004 |
Ссылка на 8-разрядную инструкцию, содержащую эффективную 16-разрядную версию целевого символа. |
IMAGE_REL_SH3_DIRECT8_LONG |
0x0005 |
Ссылка на 8-разрядную инструкцию, содержащую эффективную 32-разрядную va целевого символа. |
IMAGE_REL_SH3_DIRECT4 |
0x0006 |
Ссылка на 8-разрядное расположение, низкое 4-разрядное значение которого содержит va целевого символа. |
IMAGE_REL_SH3_DIRECT4_WORD |
0x0007 |
Ссылка на 8-разрядную инструкцию, низкая 4-разрядная версия которой содержит эффективную 16-разрядную va целевого символа. |
IMAGE_REL_SH3_DIRECT4_LONG |
0x0008 |
Ссылка на 8-разрядную инструкцию, низкая 4-разрядная версия которой содержит эффективную 32-разрядную va целевого символа. |
IMAGE_REL_SH3_PCREL8_WORD |
0x0009 |
Ссылка на 8-разрядную инструкцию, содержащую эффективное 16-разрядное смещение относительного смещения целевого символа. |
IMAGE_REL_SH3_PCREL8_LONG |
0x000A |
Ссылка на 8-разрядную инструкцию, содержащую эффективное 32-разрядное смещение целевого символа. |
IMAGE_REL_SH3_PCREL12_WORD |
0x000B |
Ссылка на 16-разрядную инструкцию, низкая 12 бит которой содержит эффективное 16-разрядное смещение целевого символа. |
IMAGE_REL_SH3_STARTOF_SECTION |
0x000C |
Ссылка на 32-разрядное расположение, которое является va раздела, содержащего целевой символ. |
IMAGE_REL_SH3_SIZEOF_SECTION |
0x000D |
Ссылка на 32-разрядное расположение, которое является размером раздела, содержащего целевой символ. |
IMAGE_REL_SH3_SECTION |
0x000E |
16-разрядный индекс раздела раздела, содержащего целевой объект. Это используется для поддержки сведений об отладке. |
IMAGE_REL_SH3_SECREL |
0x000F |
32-разрядное смещение целевого объекта с начала его раздела. Это используется для поддержки отладки сведений и локального хранилища статического потока. |
IMAGE_REL_SH3_DIRECT32_NB |
0x0010 |
32-разрядная RVA целевого символа. |
IMAGE_REL_SH3_GPREL4_LONG |
0x0011 |
Относительный GP. |
IMAGE_REL_SH3_TOKEN |
0x0012 |
Токен CLR. |
IMAGE_REL_SHM_PCRELPT |
0x0013 |
Смещение от текущей инструкции в longwords. Если бит NOMODE не задан, вставьте обратное значение низкого бита в бите 32, чтобы выбрать PTA или PTB. |
IMAGE_REL_SHM_REFLO |
0x0014 |
Низкий 16 бит 32-разрядного адреса. |
IMAGE_REL_SHM_REFHALF |
0x0015 |
Высокие 16 битов 32-разрядного адреса. |
IMAGE_REL_SHM_RELLO |
0x0016 |
Низкий 16 бит относительного адреса. |
IMAGE_REL_SHM_RELHALF |
0x0017 |
Высокий 16 бит относительного адреса. |
IMAGE_REL_SHM_PAIR |
0x0018 |
Перемещение допустимо только в том случае, если оно сразу же следует перемещению REFHALF, RELHALF или RELLO. Поле SymbolTableIndex для перемещения содержит смещение, а не индекс в таблицу символов. |
IMAGE_REL_SHM_NOMODE |
0x8000 |
Перемещение игнорирует режим раздела. |
Для процессоров PowerPC определены следующие индикаторы типа перемещения.
Константа | значение | Описание |
---|---|---|
IMAGE_REL_PPC_ABSOLUTE |
0x0000 |
Перемещение игнорируется. |
IMAGE_REL_PPC_ADDR64 |
0x0001 |
64-разрядная версия целевого объекта. |
IMAGE_REL_PPC_ADDR32 |
0x0002 |
32-разрядная версия целевого объекта. |
IMAGE_REL_PPC_ADDR24 |
0x0003 |
Низкие 24 бита va целевого объекта. Это допустимо, только если целевой символ является абсолютным и может быть подписан на исходное значение. |
IMAGE_REL_PPC_ADDR16 |
0x0004 |
Низкий 16 бит va целевого объекта. |
IMAGE_REL_PPC_ADDR14 |
0x0005 |
Низкий 14-разрядный объем va целевого объекта. Это допустимо, только если целевой символ является абсолютным и может быть подписан на исходное значение. |
IMAGE_REL_PPC_REL24 |
0x0006 |
24-разрядное смещение относительно пк к расположению символа. |
IMAGE_REL_PPC_REL14 |
0x0007 |
14-разрядное смещение относительно пк к расположению символа. |
IMAGE_REL_PPC_ADDR32NB |
0x000A |
32-разрядная RVA целевого объекта. |
IMAGE_REL_PPC_SECREL |
0x000B |
32-разрядное смещение целевого объекта с начала его раздела. Это используется для поддержки отладки сведений и локального хранилища статического потока. |
IMAGE_REL_PPC_SECTION |
0x000C |
16-разрядный индекс раздела раздела, содержащего целевой объект. Это используется для поддержки сведений об отладке. |
IMAGE_REL_PPC_SECREL16 |
0x000F |
16-разрядное смещение целевого объекта с начала его раздела. Это используется для поддержки отладки сведений и локального хранилища статического потока. |
IMAGE_REL_PPC_REFHI |
0x0010 |
Высокий 16 бит 32-разрядной va целевой платформы. Это используется для первой инструкции в двух инструкциях, которая загружает полный адрес. За этим перемещением необходимо немедленно следовать перемещению PAIR, чей символTableIndex содержит подписанный 16-разрядный смещение, добавляемое в верхние 16 битов, которые были взяты из перемещаемого расположения. |
IMAGE_REL_PPC_REFLO |
0x0011 |
Низкий 16 бит va целевого объекта. |
IMAGE_REL_PPC_PAIR |
0x0012 |
Перемещение, допустимое только в том случае, если оно немедленно следует перемещению REFHI или SECRELHI. Его SymbolTableIndex содержит смещение, а не индекс в таблицу символов. |
IMAGE_REL_PPC_SECRELLO |
0x0013 |
Низкий 16 бит 32-разрядного смещения целевого объекта с начала его раздела. |
IMAGE_REL_PPC_GPREL |
0x0015 |
16-разрядное смещение целевого объекта относительно регистра групповой политики. |
IMAGE_REL_PPC_TOKEN |
0x0016 |
Маркер СРЕДЫ CLR. |
Для процессоров Intel 386 и совместимых процессоров определены следующие индикаторы типа перемещения.
Константа | значение | Описание |
---|---|---|
IMAGE_REL_I386_ABSOLUTE |
0x0000 |
Перемещение игнорируется. |
IMAGE_REL_I386_DIR16 |
0x0001 |
Не поддерживается. |
IMAGE_REL_I386_REL16 |
0x0002 |
Не поддерживается. |
IMAGE_REL_I386_DIR32 |
0x0006 |
32-разрядная va целевого объекта. |
IMAGE_REL_I386_DIR32NB |
0x0007 |
32-разрядная RVA целевого объекта. |
IMAGE_REL_I386_SEG12 |
0x0009 |
Не поддерживается. |
IMAGE_REL_I386_SECTION |
0x000A |
16-разрядный индекс раздела раздела, содержащего целевой объект. Это используется для поддержки сведений об отладке. |
IMAGE_REL_I386_SECREL |
0x000B |
32-разрядное смещение целевого объекта с начала его раздела. Это используется для поддержки отладки сведений и локального хранилища статического потока. |
IMAGE_REL_I386_TOKEN |
0x000C |
Маркер СРЕДЫ CLR. |
IMAGE_REL_I386_SECREL7 |
0x000D |
7-разрядное смещение от базы раздела, содержащего целевой объект. |
IMAGE_REL_I386_REL32 |
0x0014 |
32-разрядное смещение относительно целевого объекта. Это поддерживает относительную ветвь x86 и инструкции по вызову. |
Следующие индикаторы типов перемещения определяются для семейства процессоров Intel Itanium и совместимых процессоров. Обратите внимание, что перемещение по инструкциям использует смещение пакета и номер слота для смещения перемещения.
Константа | значение | Описание |
---|---|---|
IMAGE_REL_IA64_ABSOLUTE |
0x0000 |
Перемещение игнорируется. |
IMAGE_REL_IA64_IMM14 |
0x0001 |
За перемещением инструкций можно следовать перемещению ADDEND, значение которого добавляется в целевой адрес, прежде чем он будет вставлен в указанный слот в пакете IMM14. Целевой объект перемещения должен быть абсолютным, или изображение должно быть исправлено. |
IMAGE_REL_IA64_IMM22 |
0x0002 |
За перемещением инструкций можно следовать перемещению ADDEND, значение которого добавляется в целевой адрес, прежде чем он будет вставлен в указанный слот в пакете IMM22. Целевой объект перемещения должен быть абсолютным, или изображение должно быть исправлено. |
IMAGE_REL_IA64_IMM64 |
0x0003 |
Номер слота для этого перемещения должен быть одним (1). За перемещением можно следовать перемещению ADDEND, значение которого добавляется в целевой адрес, прежде чем он хранится во всех трех слотах пакета IMM64. |
IMAGE_REL_IA64_DIR32 |
0x0004 |
32-разрядная va целевого объекта. Это поддерживается только для изображений /LARGEADDRESSAWARE:NO. |
IMAGE_REL_IA64_DIR64 |
0x0005 |
64-разрядная va целевого объекта. |
IMAGE_REL_IA64_PCREL21B |
0x0006 |
Инструкция исправлена с 25-разрядным относительным перемещением к 16-разрядной выровненной цели. Низкие 4 бита смещения равны нулю и не хранятся. |
IMAGE_REL_IA64_PCREL21M |
0x0007 |
Инструкция исправлена с 25-разрядным относительным перемещением к 16-разрядной выровненной цели. Низкие 4 бита смещения, которые равны нулю, не хранятся. |
IMAGE_REL_IA64_PCREL21F |
0x0008 |
LSBS смещения этого перемещения должны содержать номер слота, а остальные — адрес пакета. Пакет исправлен с 25-разрядным относительным перемещением к 16-разрядной выровненной цели. Низкие 4 бита смещения равны нулю и не хранятся. |
IMAGE_REL_IA64_GPREL22 |
0x0009 |
За перемещением инструкций можно следовать перемещению ADDEND, значение которого добавляется в целевой адрес, а затем 22-разрядное смещение относительно групповой политики, которое вычисляется и применяется к пакету GPREL22. |
IMAGE_REL_IA64_LTOFF22 |
0x000A |
Инструкция исправлена с помощью 22-разрядного смещения относительно групповой политики до записи таблицы литеральных символов целевого символа. Компоновщик создает эту запись литеральной таблицы на основе этого перемещения и перемещений ADDEND, которые могут следовать. |
IMAGE_REL_IA64_SECTION |
0x000B |
16-разрядный индекс раздела раздела содержит целевой объект. Это используется для поддержки сведений об отладке. |
IMAGE_REL_IA64_SECREL22 |
0x000C |
Инструкция исправлена с помощью 22-разрядного смещения целевого объекта с начала его раздела. За этим перемещением можно сразу же следовать перемещению ADDEND, поле "Значение" которого содержит 32-разрядное смещение без знака целевого объекта с начала раздела. |
IMAGE_REL_IA64_SECREL64I |
0x000D |
Номер слота для этого перемещения должен быть одним (1). Инструкция исправлена с помощью 64-разрядного смещения целевого объекта с начала его раздела. За этим перемещением можно сразу же следовать перемещению ADDEND, поле "Значение" которого содержит 32-разрядное смещение без знака целевого объекта с начала раздела. |
IMAGE_REL_IA64_SECREL32 |
0x000E |
Адрес данных, который необходимо исправить с помощью 32-разрядного смещения целевого объекта с начала его раздела. |
IMAGE_REL_IA64_DIR32NB |
0x0010 |
32-разрядная RVA целевого объекта. |
IMAGE_REL_IA64_SREL14 |
0x0011 |
Это применяется к подписанной 14-разрядной немедленной, содержащей разницу между двумя перемещаемыми целевыми объектами. Это декларативное поле компоновщика, указывающее, что компилятор уже создал это значение. |
IMAGE_REL_IA64_SREL22 |
0x0012 |
Это применяется к подписанной 22-разрядной немедленной, содержащей разницу между двумя перемещаемыми целевыми объектами. Это декларативное поле компоновщика, указывающее, что компилятор уже создал это значение. |
IMAGE_REL_IA64_SREL32 |
0x0013 |
Это применяется к 32-разрядной немедленной подписи, содержащей разницу между двумя перемещаемыми значениями. Это декларативное поле компоновщика, указывающее, что компилятор уже создал это значение. |
IMAGE_REL_IA64_UREL32 |
0x0014 |
Это применяется к 32-разрядной немедленной операции без знака, которая содержит разницу между двумя перемещаемыми значениями. Это декларативное поле компоновщика, указывающее, что компилятор уже создал это значение. |
IMAGE_REL_IA64_PCREL60X |
0x0015 |
60-разрядное исправление относительно пк, которое всегда остается в качестве инструкции BRL пакета MLX. |
IMAGE_REL_IA64_PCREL60B |
0x0016 |
60-разрядная исправление относительно пк. Если целевое смещение помещается в подписанное 25-разрядное поле, преобразуйте весь пакет в пакет MBB с NOP. B в слоте 1 и 25-разрядная инструкция BR (с 4 наименьшими битами все ноль и упала) в слоте 2. |
IMAGE_REL_IA64_PCREL60F |
0x0017 |
60-разрядная исправление относительно пк. Если целевое смещение помещается в подписанное 25-разрядное поле, преобразуйте весь пакет в пакет MFB с NOP. F в слоте 1 и 25-разрядная (4 наименьших битов все ноль и удалена) инструкция BR в слоте 2. |
IMAGE_REL_IA64_PCREL60I |
0x0018 |
60-разрядная исправление относительно пк. Если целевое смещение помещается в подписанное 25-разрядное поле, преобразуйте весь пакет в пакет MIB с NOP. Я в слоте 1 и 25-разрядная (4 наименьших битов все ноль и удалена) инструкция BR в слоте 2. |
IMAGE_REL_IA64_PCREL60M |
0x0019 |
60-разрядная исправление относительно пк. Если целевое смещение помещается в подписанное 25-разрядное поле, преобразуйте весь пакет в пакет MMB с NOP. M в слоте 1 и 25-разрядная (4 наименьших битов все ноль и удалена) инструкция BR в слоте 2. |
IMAGE_REL_IA64_IMMGPREL64 |
0x001a |
64-разрядная исправление относительно групповой политики. |
IMAGE_REL_IA64_TOKEN |
0x001b |
Маркер CLR. |
IMAGE_REL_IA64_GPREL32 |
0x001c |
32-разрядная исправление относительно групповой политики. |
IMAGE_REL_IA64_ADDEND |
0x001F |
Перемещение допустимо только в том случае, если оно сразу же следует за одним из следующих перемещений: IMM14, IMM22, IMM64, GPREL22, LTOFF22, LTOFF64, SECREL22, SECREL64I или SECREL32. Его значение содержит надстройку, применяемую к инструкциям в пакете, а не к данным. |
Для процессоров MIPS определены следующие индикаторы типа перемещения.
Константа | значение | Описание |
---|---|---|
IMAGE_REL_MIPS_ABSOLUTE |
0x0000 |
Перемещение игнорируется. |
IMAGE_REL_MIPS_REFHALF |
0x0001 |
Высокий 16 бит 32-разрядной va целевой платформы. |
IMAGE_REL_MIPS_REFWORD |
0x0002 |
32-разрядная va целевого объекта. |
IMAGE_REL_MIPS_JMPADDR |
0x0003 |
Низкий 26 бит va целевого объекта. Это поддерживает инструкции MIPS J и JAL. |
IMAGE_REL_MIPS_REFHI |
0x0004 |
Высокий 16 бит 32-разрядной va целевой платформы. Это используется для первой инструкции в двух инструкциях, которая загружает полный адрес. За этим перемещением необходимо немедленно следовать перемещению PAIR, чей символTableIndex содержит подписанный 16-разрядный смещение, добавляемое в верхние 16 битов, которые взяты из перемещаемого расположения. |
IMAGE_REL_MIPS_REFLO |
0x0005 |
Низкий 16 бит va целевого объекта. |
IMAGE_REL_MIPS_GPREL |
0x0006 |
16-разрядное смещение целевого объекта относительно регистра групповой политики. |
IMAGE_REL_MIPS_LITERAL |
0x0007 |
То же, что и IMAGE_REL_MIPS_GPREL. |
IMAGE_REL_MIPS_SECTION |
0x000A |
16-разрядный индекс раздела раздела содержит целевой объект. Это используется для поддержки сведений об отладке. |
IMAGE_REL_MIPS_SECREL |
0x000B |
32-разрядное смещение целевого объекта с начала его раздела. Это используется для поддержки отладки сведений и локального хранилища статического потока. |
IMAGE_REL_MIPS_SECRELLO |
0x000C |
Низкий 16 бит 32-разрядного смещения целевого объекта с начала его раздела. |
IMAGE_REL_MIPS_SECRELHI |
0x000D |
Высокий 16-разрядный смещение 32-разрядного смещения целевого объекта с начала его раздела. Перемещение IMAGE_REL_MIPS_PAIR должно немедленно следовать этому. СимволTableIndex перемещений PAIR содержит подписанный 16-разрядный смещение, добавляемое к верхним 16 битам, взятым из перемещаемого расположения. |
IMAGE_REL_MIPS_JMPADDR16 |
0x0010 |
Низкий 26 бит va целевого объекта. Это поддерживает инструкцию MIPS16 JAL. |
IMAGE_REL_MIPS_REFWORDNB |
0x0022 |
32-разрядная RVA целевого объекта. |
IMAGE_REL_MIPS_PAIR |
0x0025 |
Перемещение допустимо только в том случае, если оно сразу же следует перемещению REFHI или SECRELHI. Его SymbolTableIndex содержит смещение, а не индекс в таблицу символов. |
Для процессоров Mitsubishi M32R определены следующие индикаторы типа перемещения.
Константа | значение | Описание |
---|---|---|
IMAGE_REL_M32R_ABSOLUTE |
0x0000 |
Перемещение игнорируется. |
IMAGE_REL_M32R_ADDR32 |
0x0001 |
32-разрядная va целевого объекта. |
IMAGE_REL_M32R_ADDR32NB |
0x0002 |
32-разрядная RVA целевого объекта. |
IMAGE_REL_M32R_ADDR24 |
0x0003 |
24-разрядная версия целевого объекта. |
IMAGE_REL_M32R_GPREL16 |
0x0004 |
16-разрядное смещение целевого объекта из регистра групповой политики. |
IMAGE_REL_M32R_PCREL24 |
0x0005 |
24-разрядное смещение целевого объекта от счетчика программы (PC), смещенное слева на 2 бита и расширенный знак |
IMAGE_REL_M32R_PCREL16 |
0x0006 |
16-разрядное смещение целевого объекта с компьютера, смещенное влево на 2 бита и расширенный знак |
IMAGE_REL_M32R_PCREL8 |
0x0007 |
8-разрядное смещение целевого объекта с компьютера, смещенное влево на 2 бита и расширенный знак |
IMAGE_REL_M32R_REFHALF |
0x0008 |
16 MSB целевого va. |
IMAGE_REL_M32R_REFHI |
0x0009 |
16 MSB целевого va, скорректированных для расширения знака LSB. Это используется для первой инструкции в двух инструкциях, которая загружает полный 32-разрядный адрес. За этим перемещением необходимо немедленно следовать перемещению PAIR, чей символTableIndex содержит подписанный 16-разрядный смещение, добавляемое в верхние 16 битов, которые взяты из перемещаемого расположения. |
IMAGE_REL_M32R_REFLO |
0x000A |
16 LSB целевого va. |
IMAGE_REL_M32R_PAIR |
0x000B |
Перемещение должно соответствовать перемещению REFHI. Его SymbolTableIndex содержит смещение, а не индекс в таблицу символов. |
IMAGE_REL_M32R_SECTION |
0x000C |
16-разрядный индекс раздела раздела, содержащего целевой объект. Это используется для поддержки сведений об отладке. |
IMAGE_REL_M32R_SECREL |
0x000D |
32-разрядное смещение целевого объекта с начала его раздела. Это используется для поддержки отладки сведений и локального хранилища статического потока. |
IMAGE_REL_M32R_TOKEN |
0x000E |
Маркер СРЕДЫ CLR. |
Номера строк COFF больше не создаются и в будущем не будут использоваться.
Номера строк COFF указывают связь между номерами кода и строк в исходных файлах. Формат microsoft для номеров строк COFF аналогичен стандарту COFF, но он был расширен, чтобы разрешить один раздел относиться к номерам строк в нескольких исходных файлах.
Номера строк COFF состоят из массива записей фиксированной длины. Расположение (смещение файла) и размер массива указываются в заголовке раздела. Каждая запись номера строки имеет следующий формат.
Смещение | Размер | Поле | Description |
---|---|---|---|
0 |
4 |
Тип (*) |
Это объединение двух полей: SymbolTableIndex и VirtualAddress. Используется ли значение SymbolTableIndex или RVA. |
4 |
2 — . |
Льняное число |
Если ненулевое значение, это поле задает одноуровневый номер строки. Если значение равно нулю, поле Type интерпретируется как индекс таблицы символов для функции. |
Поле Type — это объединение двух байтовых полей: SymbolTableIndex и VirtualAddress.
Смещение | Размер | Поле | Description |
---|---|---|---|
0 |
4 |
SymbolTableIndex |
Используется при нуле нуля: индекс для записи таблицы символов для функции. Этот формат используется для указания функции, к которой ссылается группа записей строк. |
0 |
4 |
VirtualAddress |
Используется, если значение Льнамер не равно нулю: RVA исполняемого кода, соответствующего указанной исходной строке. В файле объекта он содержит va в разделе. |
Запись с номером строки может задать поле "Бельемер" равным нулю и указывать на определение функции в таблице символов или работать как стандартная запись строк, указав положительное целое число (номер строки) и соответствующий адрес в коде объекта.
Группа записей строк всегда начинается с первого формата: индекс символа функции. Если это первая запись номера строки в разделе, то это также имя символа COMDAT для функции, если установлен флаг COMDAT раздела. См. разделы COMDAT (только для объектов). В вспомогательной записи функции в таблице символов имеется указатель на поле "Льняное число", указывающее на эту же запись номера строки.
За записью, определяющей функцию, следует любое количество записей строк, которые предоставляют фактические сведения о номере строки (т. е. записи с номером белья больше нуля). Эти записи основаны на одном из них относительно начала функции и представляют каждую исходную строку в функции, за исключением первой строки.
Например, первая запись номера строки для следующего примера указывает функцию ReverseSign (SymbolTableIndex обратного знака и льняного номера). Затем записи со значениями белья 1, 2 и 3 будут следовать, соответствующие исходным строкам, как показано ниже:
// some code precedes ReverseSign function
int ReverseSign(int i)
1: {
2: return -1 * i;
3: }
Таблица символов в этом разделе унаследована от традиционного формата COFF. Она отличается от сведений об отладке Microsoft Visual C++. Файл может содержать как таблицу символов COFF, так и сведения об отладке Visual C++, и они хранятся отдельно. Некоторые средства Майкрософт используют таблицу символов для ограниченных, но важных целей, таких как обмен данными COMDAT с компоновщиком. Имена разделов и имена файлов, а также код и символы данных перечислены в таблице символов.
Расположение таблицы символов указывается в заголовке COFF.
Таблица символов представляет собой массив записей, каждый 18 байт длиной. Каждая запись является стандартной или вспомогательной записью таблицы символов. Стандартная запись определяет символ или имя и имеет следующий формат.
Смещение | Размер | Поле | Description |
---|---|---|---|
0 |
8 |
Имя (*) |
Имя символа, представленное объединением трех структур. Массив размером 8 байт используется, если имя не превышает 8 байтов. Дополнительные сведения см. в разделе "Представление имени символа". |
8 |
4 |
Value |
Значение, связанное с символом. Интерпретация этого поля зависит от SectionNumber и StorageClass. Типичным значением является перемещаемый адрес. |
12 |
2 — . |
SectionNumber |
Целое число со знаком, определяющее раздел, используя одноуровневый индекс в таблице разделов. Некоторые значения имеют особое значение, как определено в разделе 5.4.2, "Значения числа разделов". |
14 |
2 — . |
Введите . |
Число, представляющее тип. Средства Майкрософт задают для этого поля значение 0x20 (функция) или 0x0 (а не функция). Дополнительные сведения см. в разделе "Представление типов". |
16 |
1 |
StorageClass |
Перечисленное значение, представляющее класс хранилища. Дополнительные сведения см. в разделе "Класс хранилища". |
17 |
1 |
NumberOfAuxSymbols |
Количество вспомогательных записей таблицы символов, следуйте этой записи. |
Ноль или несколько вспомогательных записей таблицы символов немедленно следуют каждой стандартной записи таблицы символов. Однако обычно не более одной вспомогательной записи таблицы символов следует стандартной записи таблицы символов (за исключением записей .file с длинными именами файлов). Каждая вспомогательная запись совпадает с стандартной записью таблицы символов (18 байтов), но вместо определения нового символа вспомогательные записи предоставляют дополнительные сведения о последнем заданном символе. Выбор из нескольких форматов, используемых в зависимости от поля StorageClass. В настоящее время определенные форматы вспомогательных записей таблиц символов отображаются в разделе 5.5 "Вспомогательные записи символов".
Средства, считывающие таблицы символов COFF, должны игнорировать вспомогательные записи символов, интерпретация которых неизвестна. Это позволяет расширить формат таблицы символов для добавления новых вспомогательных записей без нарушения существующих средств.
Поле ShortName в таблице символов состоит из 8 байтов, содержащих само имя, если оно не более 8 байтов длиной, или поле ShortName дает смещение в строковую таблицу. Чтобы определить, задано ли имя или смещение, проверьте первые 4 байта для равенства до нуля.
По соглашению имена обрабатываются как строки в кодировке UTF-8 с нуля.
Смещение | Размер | Поле | Description |
---|---|---|---|
0 |
8 |
ShortName |
Массив размером 8 байт. Этот массив заполняется значениями NULL справа, если имя меньше 8 байтов. |
0 |
4 |
Нули |
Поле, заданное для всех нулей, если имя больше 8 байт. |
4 |
4 |
Смещение |
Смещение в строковую таблицу. |
Как правило, поле "Значение раздела" в записи таблицы символов — это одноуровневый индекс в таблице разделов. Однако это поле представляет собой целое число со знаком и может принимать отрицательные значения. Следующие значения, меньше одного, имеют специальные значения.
Константа | значение | Описание |
---|---|---|
IMAGE_SYM_UNDEFINED |
0 |
Запись символов еще не назначена разделу. Значение нуля указывает, что ссылка на внешний символ определен в другом месте. Значение, отличное от нуля, является общим символом с размером, заданным значением. |
IMAGE_SYM_ABSOLUTE |
1 — |
Символ имеет абсолютное (не перемещаемое) значение и не является адресом. |
IMAGE_SYM_DEBUG |
2 — |
Символ предоставляет общие сведения о типе или отладке, но не соответствует разделу. Средства Майкрософт используют этот параметр вместе с записями .file (FILE класса хранилища). |
Поле "Тип" записи таблицы символов содержит 2 байта, где каждый байт представляет сведения о типе. LSB представляет простой (базовый) тип данных, а MSB — сложный тип, если таковой:
MSB | LSB |
---|---|
Сложный тип: нет, указатель, функция, массив. |
Базовый тип: целое число, плавающая точка и т. д. |
Следующие значения определяются для базового типа, хотя средства Майкрософт обычно не используют это поле и задают LSB значение 0. Вместо этого сведения об отладке Visual C++ используются для указания типов. Однако возможные значения COFF перечислены здесь для полноты.
Константа | значение | Описание |
---|---|---|
IMAGE_SYM_TYPE_NULL |
0 |
Нет сведений о типе или неизвестном базовом типе. Средства Майкрософт используют этот параметр |
IMAGE_SYM_TYPE_VOID |
1 |
Недопустимый тип; используется с указателями и функциями void |
IMAGE_SYM_TYPE_CHAR |
2 — . |
Символ (подписанный байт) |
IMAGE_SYM_TYPE_SHORT |
3 |
2-байтовое целое число со знаком |
IMAGE_SYM_TYPE_INT |
4 |
Естественный целочисленный тип (обычно 4 байта в Windows) |
IMAGE_SYM_TYPE_LONG |
5 |
Целое число со знаком 4 байта |
IMAGE_SYM_TYPE_FLOAT |
6 . |
Число с плавающей запятой 4 байта |
IMAGE_SYM_TYPE_DOUBLE |
7 |
Число с плавающей запятой 8 байтов |
IMAGE_SYM_TYPE_STRUCT |
8 |
Структура |
IMAGE_SYM_TYPE_UNION |
9 |
Объединение |
IMAGE_SYM_TYPE_ENUM |
10 |
Перечислимый тип |
IMAGE_SYM_TYPE_MOE |
11 |
Элемент перечисления (определенное значение) |
IMAGE_SYM_TYPE_BYTE |
12 |
байт; целое число без знака 1-байтов |
IMAGE_SYM_TYPE_WORD |
13 |
Слово; целое число без знака 2-байтов |
IMAGE_SYM_TYPE_UINT |
14 |
Целое число без знака естественного размера (обычно 4 байта) |
IMAGE_SYM_TYPE_DWORD |
15 |
Целое число без знака 4-байтов |
Наиболее значимый байт указывает, является ли символ указателем, возвращаемым функцией или массивом базового типа, указанного в LSB. Средства Майкрософт используют это поле только для указания того, является ли символ функцией, чтобы только два результирующего значения были 0x0 и 0x20 для поля Type. Однако другие средства могут использовать это поле для обмена дополнительными сведениями.
Очень важно правильно указать атрибут функции. Эти сведения необходимы для правильной работы добавочной компоновки. Для некоторых архитектур информация может потребоваться для других целей.
Константа | значение | Описание |
---|---|---|
IMAGE_SYM_DTYPE_NULL |
0 |
Не является производным типом; символ — это простая скалярная переменная. |
IMAGE_SYM_DTYPE_POINTER |
1 |
Символ — это указатель на базовый тип. |
IMAGE_SYM_DTYPE_FUNCTION |
2 — . |
Символ — это функция, которая возвращает базовый тип. |
IMAGE_SYM_DTYPE_ARRAY |
3 |
Символ — это массив базового типа. |
Поле StorageClass таблицы символов указывает, какой тип определения представляет символ. В следующей таблице показаны возможные значения. Обратите внимание, что поле StorageClass — это целое число без знака 1-байтов. Поэтому следует принять специальное значение -1, чтобы означать его неподписанный эквивалент, 0xFF.
Хотя традиционный формат COFF использует множество значений класса хранилища, средства Майкрософт используют формат отладки Visual C++ для большинства символьных сведений и обычно используют только четыре значения класса хранилища: EXTERNAL (2), STATIC (3), FUNCTION (101) и FILE (103). За исключением второго заголовка столбца ниже, значение должно быть принято для обозначения поля "Значение" записи символов (интерпретация которого зависит от числа, найденного в качестве класса хранилища).
Константа | Значение | Описание и интерпретация поля "Значение" |
---|---|---|
IMAGE_SYM_CLASS_END_OF_FUNCTION |
-1 (0xFF) |
Специальный символ, представляющий конец функции для целей отладки. |
IMAGE_SYM_CLASS_NULL |
0 |
Класс хранилища не назначен. |
IMAGE_SYM_CLASS_AUTOMATIC |
1 |
Переменная автоматического (стека). Поле "Значение" указывает смещение кадра стека. |
IMAGE_SYM_CLASS_EXTERNAL |
2 — . |
Значение, используемое средствами Майкрософт для внешних символов. Поле "Значение" указывает размер, если номер раздела IMAGE_SYM_UNDEFINED (0). Если номер раздела не равен нулю, поле "Значение" указывает смещение в разделе. |
IMAGE_SYM_CLASS_STATIC |
3 |
Смещение символа в разделе. Если поле "Значение" равно нулю, символ представляет имя раздела. |
IMAGE_SYM_CLASS_REGISTER |
4 |
Переменная регистра. Поле "Значение" указывает номер регистра. |
IMAGE_SYM_CLASS_EXTERNAL_DEF |
5 |
Символ, который определяется внешним образом. |
IMAGE_SYM_CLASS_LABEL |
6 . |
Метка кода, определенная в модуле. Поле "Значение" указывает смещение символа в разделе. |
IMAGE_SYM_CLASS_UNDEFINED_LABEL |
7 |
Ссылка на метку кода, которая не определена. |
IMAGE_SYM_CLASS_MEMBER_OF_STRUCT |
8 |
Элемент структуры. Поле "Значение" указывает n-й член. |
IMAGE_SYM_CLASS_ARGUMENT |
9 |
Формальный аргумент (параметр) функции. Поле "Значение" указывает n-й аргумент. |
IMAGE_SYM_CLASS_STRUCT_TAG |
10 |
Запись имени тега структуры. |
IMAGE_SYM_CLASS_MEMBER_OF_UNION |
11 |
Член профсоюза. Поле "Значение" указывает n-й член. |
IMAGE_SYM_CLASS_UNION_TAG |
12 |
Запись тега объединения. |
IMAGE_SYM_CLASS_TYPE_DEFINITION |
13 |
Запись Typedef. |
IMAGE_SYM_CLASS_UNDEFINED_STATIC |
14 |
Объявление статических данных. |
IMAGE_SYM_CLASS_ENUM_TAG |
15 |
Запись тега типа перечисления. |
IMAGE_SYM_CLASS_MEMBER_OF_ENUM |
16 |
Элемент перечисления. Поле "Значение" указывает n-й член. |
IMAGE_SYM_CLASS_REGISTER_PARAM |
17 |
Параметр регистра. |
IMAGE_SYM_CLASS_BIT_FIELD |
18 |
Ссылка на битовое поле. Поле "Значение" указывает n-й бит в битовом поле. |
IMAGE_SYM_CLASS_BLOCK |
100 |
Запись .bb (начало блока) или .eb (конец блока). Поле "Значение" — это перемещаемый адрес расположения кода. |
IMAGE_SYM_CLASS_FUNCTION |
101 |
Значение, используемое средствами Майкрософт для записей символов, определяющих степень функции: begin function (.bf), end function (EF) и строк в функции (.lf). Для записей .lf поле Value предоставляет количество исходных строк в функции. Для записей EF поле Value предоставляет размер кода функции. |
IMAGE_SYM_CLASS_END_OF_STRUCT |
102 |
Запись конца структуры. |
IMAGE_SYM_CLASS_FILE |
103 |
Значение, которое средства Майкрософт, а также традиционный формат COFF, используются для записи символов исходного файла. За символом следуют вспомогательные записи, которые называют файл. |
IMAGE_SYM_CLASS_SECTION |
104 |
Определение раздела (средства Майкрософт используют статический класс хранилища). |
IMAGE_SYM_CLASS_WEAK_EXTERNAL |
105 |
Слабый внешний. Дополнительные сведения см . в вспомогательном формате 3: слабые внешние элементы. |
IMAGE_SYM_CLASS_CLR_TOKEN |
107 |
Символ токена CLR. Имя — это строка ASCII, состоящая из шестнадцатеричного значения маркера. Дополнительные сведения см. в разделе "Определение токена CLR" (только для объектов). |
Вспомогательные записи таблицы символов всегда следуют и применяются к определенной стандартной записи таблицы символов. Вспомогательная запись может иметь любой формат, который средства могут распознать, но для них необходимо выделить 18 байт, чтобы таблица символов сохранялась в виде массива регулярного размера. В настоящее время средства Майкрософт распознают вспомогательные форматы для следующих типов записей: определения функций, начальные и конечные символы (.bf и EF), слабые внешние, имена файлов и определения разделов.
Традиционный дизайн COFF также включает вспомогательные форматы записей для массивов и структур. Средства Майкрософт не используют их, а вместо этого помещайте символьные сведения в формат отладки Visual C++ в разделах отладки.
Запись таблицы символов помечает начало определения функции, если она имеет все из следующих значений: класс хранилища EXTERNAL (2), значение типа, указывающее, что это функция (0x20), а также номер раздела, превышающий ноль. Обратите внимание, что запись таблицы символов с номером раздела UNDEFINED (0) не определяет функцию и не имеет вспомогательной записи. За записями символов определения функций следует вспомогательная запись в следующем формате:
Смещение | Размер | Поле | Description |
---|---|---|---|
0 |
4 |
TagIndex |
Индекс таблицы символов соответствующей записи символов .BF (begin function). |
4 |
4 |
TotalSize |
Размер исполняемого кода для самой функции. Если функция находится в собственном разделе, размер SizeOfRawData в заголовке раздела больше или равен этому полю в зависимости от соображений выравнивания. |
8 |
4 |
PointerToLinenumber |
Смещение файла первой записи номера строки COFF для функции или ноль, если нет. Дополнительные сведения см. в разделе COFF Line Numbers (Не рекомендуется). |
12 |
4 |
PointerToNextFunction |
Индекс таблицы символов записи для следующей функции. Если функция является последней в таблице символов, это поле равно нулю. |
16 |
2 — . |
Неиспользованный |
Для каждого определения функции в таблице символов три элемента описывают начало, конец и количество строк. Каждый из этих символов имеет класс хранилища FUNCTION (101):
Запись символа с именем .bf (begin function). Поле "Значение" не используется.
Запись символа с именем .lf (строки в функции). Поле "Значение" дает количество строк в функции.
Запись символа с именем EF (конец функции). Поле "Значение" имеет то же число, что и поле "Общий размер" в записи символа определения функции.
За записями символов .bf и EF (но не записями LF) следует вспомогательные записи со следующим форматом:
Смещение | Размер | Поле | Description |
---|---|---|---|
0 |
4 |
Неиспользованный |
|
4 |
2 — . |
Льняное число |
Фактический порядковый номер строки (1, 2, 3 и т. д.) в исходном файле, соответствующий записи .bf или EF. |
6 . |
6 . |
Неиспользованный |
|
12 |
4 |
PointerToNextFunction (только для .bf) |
Индекс таблицы символов следующей записи символов .BF. Если функция является последней в таблице символов, это поле равно нулю. Он не используется для записей EF. |
16 |
2 — . |
Неиспользованный |
"Слабые внешние" — это механизм для файлов объектов, который позволяет гибко использовать связь во время связи. Модуль может содержать неразрешенный внешний символ (sym1), но он также может включать вспомогательные записи, указывающие, что если sym1 отсутствует во время ссылки, для разрешения ссылок используется другой внешний символ (sym2).
Если определение sym1 связано, то внешняя ссылка на символ разрешается обычно. Если определение sym1 не связано, то все ссылки на слабый внешний для sym1 вместо этого ссылаются на sym2. Внешний символ, sym2, всегда должен быть связан; как правило, он определен в модуле, который содержит слабую ссылку на sym1.
Слабые внешние элементы представлены записью таблицы символов с внешним классом хранения, номером раздела UNDEF и значением нуля. За записью слабого внешнего символа следует вспомогательная запись со следующим форматом:
Смещение | Размер | Поле | Description |
---|---|---|---|
0 |
4 |
TagIndex |
Индекс таблицы символов sym2, символ, связанный, если сим1 не найден. |
4 |
4 |
Характеристики |
Значение IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY указывает, что поиск библиотеки для sym1 не должен выполняться. Значение IMAGE_WEAK_EXTERN_SEARCH_LIBRARY указывает, что необходимо выполнить поиск библиотеки по sym1. Значение IMAGE_WEAK_EXTERN_SEARCH_ALIAS указывает, что sym1 — это псевдоним для sym2. |
8 |
10 |
Неиспользованный |
Обратите внимание, что поле "Характеристики" не определено в WINNT. H; Вместо этого используется поле "Общий размер".
Этот формат соответствует записи таблицы символов с файлом класса хранилища (103). Само имя символа должно быть .file, и вспомогательной записи, следующей за ней, присваивается имя файла исходного кода.
Смещение | Размер | Поле | Description |
---|---|---|---|
0 |
18 |
Имя файла |
Строка ANSI, которая дает имя исходного файла. Это заполнено значением NULL, если оно меньше максимальной длины. |
Этот формат следует записи таблицы символов, определяющей раздел. Такая запись имеет имя символа, которое является именем раздела (например, TEXT или DRECTVE) и имеет класс хранилища STATIC (3). Вспомогательная запись содержит сведения о разделе, к которому он ссылается. Таким образом, он дублирует некоторые сведения в заголовке раздела.
Смещение | Размер | Поле | Description |
---|---|---|---|
0 |
4 |
Длина |
Размер данных раздела; то же, что и SizeOfRawData в заголовке раздела. |
4 |
2 — . |
NumberOfRelocations |
Количество записей перемещений для раздела. |
6 . |
2 — . |
NumberOfLinenumbers |
Количество записей строк для раздела. |
8 |
4 |
Контрольная сумма |
Контрольная сумма для коммунальных данных. Применимо, если флаг IMAGE_SCN_LNK_COMDAT задан в заголовке раздела. Дополнительные сведения см. в разделах COMDAT (только для объектов). |
12 |
2 — . |
Число |
Одноуровневый индекс в таблице разделов для связанного раздела. Используется, если параметр выбора COMDAT равен 5. |
14 |
1 |
Выбор |
Номер выбора COMDAT. Это применимо, если раздел является разделом COMDAT. |
15 |
3 |
Неиспользованный |
Поле выбора вспомогательного формата определения раздела применимо, если раздел является разделом COMDAT. Раздел COMDAT — это раздел, который можно определить несколькими файлами объектов. (Флаг IMAGE_SCN_LNK_COMDAT задан в поле "Флаги разделов" заголовка раздела.) Поле выбора определяет способ разрешения компоновщика нескольких определений разделов COMDAT.
Первым символом, который имеет значение раздела раздела COMDAT, должен быть символ раздела. Этот символ имеет имя раздела, поле "Значение", равное нулю, номер раздела раздела COMDAT, поле "Тип", равное IMAGE_SYM_TYPE_NULL, поле класса равно IMAGE_SYM_CLASS_STATIC и одной вспомогательной записи. Второй символ называется символом COMDAT и используется компоновщиком в сочетании с полем выбора.
Ниже показаны значения поля выбора.
Константа | значение | Описание |
---|---|---|
IMAGE_COMDAT_SELECT_NODUPLICATES |
1 |
Если этот символ уже определен, компоновщик выдает ошибку "умножить определенный символ". |
IMAGE_COMDAT_SELECT_ANY |
2 — . |
Можно связать любой раздел, определяющий один и тот же символ COMDAT; остальные удаляются. |
IMAGE_COMDAT_SELECT_SAME_SIZE |
3 |
Компоновщик выбирает произвольный раздел среди определений этого символа. Если все определения не имеют одинаковых размеров, возникает ошибка умножения определенного символа. |
IMAGE_COMDAT_SELECT_EXACT_MATCH |
4 |
Компоновщик выбирает произвольный раздел среди определений этого символа. Если все определения не совпадают точно, возникает ошибка умножения определенного символа. |
IMAGE_COMDAT_SELECT_ASSOCIATIVE |
5 |
Раздел связан, если связан определенный другой раздел COMDAT. Этот другой раздел обозначается полем "Число" вспомогательной записи символов для определения раздела. Этот параметр полезен для определений, имеющих компоненты в нескольких разделах (например, код в одном и данных в другом), но где все необходимо связать или отменить как набор. Другой раздел, с которым связан этот раздел, должен быть разделОМ COMDAT, который может быть другим ассоциативным разделом COMDAT. Цепочка связей разделов COMDAT в ассоциативном разделе не может сформировать цикл. Цепочка связей разделов должна в конечном итоге прийти к разделу COMDAT, который не имеет IMAGE_COMDAT_SELECT_ASSOCIATIVE набор. |
IMAGE_COMDAT_SELECT_LARGEST |
6 . |
Компоновщик выбирает наибольшее определение из всех определений для этого символа. Если несколько определений имеют этот размер, выбор между ними является произвольным. |
Этот вспомогательный символ обычно следует IMAGE_SYM_CLASS_CLR_TOKEN. Он используется для связывания маркера с пространством имен таблицы символов COFF.
Смещение | Размер | Поле | Description |
---|---|---|---|
0 |
1 |
bAuxType |
Должно быть IMAGE_AUX_SYMBOL_TYPE_TOKEN_DEF (1). |
1 |
1 |
bReserved |
Зарезервировано, должно быть равно нулю. |
2 — . |
4 |
SymbolTableIndex |
Индекс символа символа COFF, к которому относится это определение маркера CLR. |
6 . |
12 |
Зарезервировано, должно быть равно нулю. |
Сразу после таблицы символов COFF является строковая таблица COFF. Позиция этой таблицы найдена, принимая адрес таблицы символов в заголовке COFF и добавляя число символов, умноженных на размер символа.
В начале строки COFF 4 байта, содержащих общий размер (в байтах) остальной части строки. Этот размер включает в себя поле размера, чтобы значение в этом расположении было бы 4, если строки отсутствуют.
В соответствии с размером строки, завершаемые значением NULL, указываются символами в таблице символов COFF.
Сертификаты атрибутов можно связать с изображением, добавив таблицу сертификатов атрибутов. Таблица сертификатов атрибутов состоит из набора смежных, выровненных по квадрату записей сертификатов атрибутов. Нулевое заполнение вставляется между исходным концом файла и началом таблицы сертификатов атрибутов для достижения этого выравнивания. Каждая запись сертификата атрибута содержит следующие поля.
Смещение | Размер | Поле | Description |
---|---|---|---|
0 |
4 |
dwLength |
Указывает длину записи сертификата атрибута. |
4 |
2 |
wRevision |
Содержит номер версии сертификата. Дополнительные сведения см. в следующем тексте. |
6 |
2 |
wCertificateType |
Указывает тип содержимого в bCertificate. Дополнительные сведения см. в следующем тексте. |
8 |
Справочные статьи |
bCertificate |
Содержит сертификат, например подпись Authenticode. Дополнительные сведения см. в следующем тексте. |
Значение виртуального адреса из записи таблицы сертификатов в необязательном каталоге данных заголовка является смещением файла к первой записи сертификата атрибута. Последующие записи доступны путем перехода к данным dwLength записи, округляя до 8-байтового числа с начала текущей записи сертификата атрибута. Это продолжается до тех пор, пока сумма округленных значений dwLength не равна значению Size из записи таблицы сертификатов в необязательном каталоге данных заголовков. Если сумма округленных значений dwLength не равна значению Size, то повреждена таблица сертификатов атрибутов или поле Size.
Например, если запись таблицы сертификатов каталога сертификатов необязательных заголовков содержит следующее:
virtual address = 0x5000
size = 0x1000
Первый сертификат начинается с смещения 0x5000 с начала файла на диске. Чтобы перейти ко всем записям сертификата атрибута, выполните следующие действия.
- Добавьте значение dwLength первого сертификата атрибута в начальное смещение.
- Округление значения от шага 1 до ближайшего 8-байтового числа, чтобы найти смещение записи второго атрибута.
- Добавьте значение смещения из шага 2 во вторую запись сертификата атрибута dwLength и округлите до ближайшего 8-байтового числа, чтобы определить смещение записи сертификата третьего атрибута.
- Повторите шаг 3 для каждого последовательного сертификата, пока вычисляемое смещение не равно 0x6000 (0x5000 start + 0x1000 общий размер), указывающее, что вы выполнили всю таблицу.
Кроме того, можно перечислить записи сертификата, вызвав функцию ImageEnumerateCertificates в цикле. Ссылку на справочную страницу функции см. в разделе "Ссылки".
Записи таблицы сертификатов атрибутов могут содержать любой тип сертификата, если запись имеет правильное значение dwLength, уникальное значение wRevision и уникальное значение wCertificateType. Наиболее распространенный тип записи таблицы сертификатов — это структура WIN_CERTIFICATE, которая задокументирована в Wintrust.h и рассматривается в оставшейся части этого раздела.
Параметры для WIN_CERTIFICATE участника wRevision включают (но не ограничиваются) следующими.
Значение | Имя. | Примечания. |
---|---|---|
0x0100 |
WIN_CERT_REVISION_1_0 |
Версия 1, устаревшая версия структуры Win_Certificate. Она поддерживается только для проверки устаревших подписей Authenticode |
0x0200 |
WIN_CERT_REVISION_2_0 |
Версия 2 — текущая версия структуры Win_Certificate. |
Параметры элемента WIN_CERTIFICATE wCertificateType включают (но не ограничиваются) элементами в следующей таблице. Обратите внимание, что некоторые значения в настоящее время не поддерживаются.
Значение | Имя. | Примечания. |
---|---|---|
0x0001 |
WIN_CERT_TYPE_X509 |
bCertificate содержит сертификат X.509 Не поддерживается |
0x0002 |
WIN_CERT_TYPE_PKCS_SIGNED_DATA |
bCertificate содержит структуру PKCS#7 SignedData |
0x0003 |
WIN_CERT_TYPE_RESERVED_1 |
Скрытный |
0x0004 |
WIN_CERT_TYPE_TS_STACK_SIGNED |
Подпись сертификата стека протокола терминала Не поддерживается |
Элемент bCertificate структуры WIN_CERTIFICATE содержит массив байтов переменной длины с типом контента, указанным wCertificateType. Тип, поддерживаемый Authenticode, — это WIN_CERT_TYPE_PKCS_SIGNED_DATA, структура PKCS#7 SignedData . Дополнительные сведения о формате цифровой подписи Authenticode см. в формате переносимой исполняемой подписи Windows Authenticode.
Если содержимое bCertificate не заканчивается на границе квадворда, запись сертификата атрибута заполняется нулями, начиная с конца bCertificate до следующей границы квадворда.
Значение dwLength — это длина завершенной структуры WIN_CERTIFICATE и вычисляется следующим образом:
dwLength = offsetof(WIN_CERTIFICATE, bCertificate) + (size of the variable-length binary array contained within bCertificate)
Эта длина должна включать размер любого заполнения, который используется для удовлетворения требования, что каждая WIN_CERTIFICATE структура выровнена в квадрате:
dwLength += (8 - (dwLength & 7)) & 7;
Размер таблицы сертификатов, указанный в записи таблицы сертификатов в необязательных каталогах данных заголовков (только изображения) включает заполнение.
Дополнительные сведения об использовании API ImageHlp для перечисления, добавления и удаления сертификатов из PE Files см. в разделе "Функции ImageHlp".
Как указано в предыдущем разделе, сертификаты в таблице сертификатов атрибутов могут содержать любой тип сертификата. Сертификаты, обеспечивающие целостность файла PE, могут включать хэш изображения PE.
Хэш изображения PE (или хэш файла) аналогичен контрольной сумме файла в том, что хэш-алгоритм создает дайджест сообщения, связанный с целостностью файла. Однако контрольная сумма создается простым алгоритмом и используется в основном для определения того, был ли блок памяти на диске поврежден, а значения, сохраненные там, повреждены. Хэш файла аналогичен контрольной сумме в том, что он также обнаруживает повреждение файлов. Однако, в отличие от большинства алгоритмов контрольной суммы, очень трудно изменить файл, не изменив хэш файла из исходного немодифицированного значения. Таким образом, хэш файла можно использовать для обнаружения преднамеренных и даже тонких изменений в файл, таких как вирусы, хакеры или троянские программы лошади.
При добавлении в сертификат дайджест изображения должен исключить определенные поля в образе PE, такие как запись контрольной суммы и таблицы сертификатов в необязательных каталогах данных заголовков. Это связано с тем, что действие добавления сертификата изменяет эти поля и приведет к вычислению другого хэш-значения.
Функция Win32 ImageGetDigestStream предоставляет поток данных из целевого PE-файла, с которыми выполняются хэш-функции. Этот поток данных остается согласованным при добавлении или удалении сертификатов из PE-файла. На основе параметров, передаваемых в ImageGetDigestStream, другие данные из образа PE могут быть опущены из хэш-вычислений. Ссылку на справочную страницу функции см. в разделе "Ссылки".
Эти таблицы были добавлены в образ для поддержки единого механизма для приложений, чтобы отложить загрузку библиотеки DLL до первого вызова этой библиотеки DLL. Макет таблиц соответствует традиционным таблицам импорта, описанным в разделе 6.4, разделе idata. Здесь рассматриваются лишь несколько деталей.
Таблица каталогов с задержкой загрузки является аналогом таблицы каталогов импорта. Его можно получить с помощью записи дескриптора задержки импорта в списке необязательных каталогов данных заголовков (смещение 200). Таблица упорядочена следующим образом:
Смещение | Размер | Поле | Description |
---|---|---|---|
0 |
4 |
Атрибуты |
Должен равняться нулю. |
4 |
4 |
Имя |
RVA имени загружаемой библиотеки DLL. Имя находится в разделе данных только для чтения изображения. |
8 |
4 |
Дескриптор модуля |
RVA дескриптора модуля (в разделе данных образа) библиотеки DLL, загружаемой с задержкой. Он используется для хранения подпрограммой, предоставляемой для управления задержкой загрузки. |
12 |
4 |
Таблица адресов импорта задержки |
RVA таблицы адресов импорта задержки загрузки. Дополнительные сведения см. в статье "Таблица адресов "Задержка импорта" (IAT). |
16 |
4 |
Таблица имен импорта задержки |
RVA таблицы имен задержки загрузки, которая содержит имена импорта, которые могут потребоваться загрузить. Это соответствует макету таблицы имен импорта. Дополнительные сведения см. в таблице подсказок и имен. |
20 |
4 |
Привязанная таблица импорта задержки |
RVA привязанной таблицы адресов задержки загрузки, если она существует. |
24 |
4 |
Выгрузка таблицы импорта задержки |
RVA таблицы адресов задержки загрузки, если она существует. Это точную копию таблицы адресов импорта задержки. Если вызывающий объект выгрузит библиотеку DLL, эта таблица должна быть скопирована обратно по таблице адресов импорта задержки, чтобы последующие вызовы библиотеки DLL продолжали использовать механизм thunking правильно. |
28 |
4 |
Отметка времени |
Метка времени библиотеки DLL, к которой привязан этот образ. |
Таблицы, на которые ссылается эта структура данных, упорядочивается и сортируется так же, как и для традиционных импортов. Дополнительные сведения см. в разделе .idata.
Пока не определены флаги атрибутов. Компоновщик задает это поле равным нулю в изображении. Это поле можно использовать для расширения записи, указывая наличие новых полей или указывая поведение вспомогательных функций задержки или выгрузки.
Имя библиотеки DLL, загружаемой с задержкой, находится в разделе данных только для чтения образа. На него ссылается поле szName.
Дескриптор библиотеки DLL, который требуется загрузить, находится в разделе данных образа. Поле phmod указывает на дескриптор. Предоставленное вспомогательное средство задержки загрузки использует это расположение для хранения дескриптора в загруженную библиотеку DLL.
Таблица адресов импорта задержки (IAT) ссылается на дескриптор импорта задержки через поле PIAT. Помощник по задержке загрузки обновляет эти указатели с реальными точками входа, чтобы блоки больше не были в цикле вызова. Доступ к указателям функции выполняется с помощью выражения pINT->u1.Function
.
Таблица имен импорта задержки (INT) содержит имена импорта, которые могут потребовать загрузки. Они упорядочены таким же образом, как указатели функции в IAT. Они состоят из одинаковых структур, что и стандартный INT, к которым обращаются с помощью выражения pINT->u1.AddressOfData->Name[0]
.
Таблица адресов импорта с привязкой задержки (BIAT) является необязательной таблицей IMAGE_THUNK_DATA элементов, используемых вместе с полем метки времени таблицы каталогов задержки загрузки на этапе привязки после процесса.
Таблица адресов импорта задержки (UIAT) — это необязательная таблица IMAGE_THUNK_DATA элементов, которые код выгрузки использует для обработки явного запроса на выгрузку. Он состоит из инициализированных данных в разделе только для чтения, который является точной копией исходного IAT, который ссылался на код на блоки задержки загрузки. В запросе на выгрузку библиотека может быть освобождена, удалена *phmod и UIAT, написанная через IAT, чтобы восстановить все состояние предварительной загрузки.
- Раздел отладки
- Раздел drectve (только объект)
- Раздел .edata (только изображение)
- Раздел idata
- Раздел PDATA
- Раздел reloc (только изображение)
- Раздел TLS
- Структура конфигурации загрузки (только образ)
- Раздел RSRC
- Раздел .cormeta (только объект)
- Раздел SXDATA
Типичные разделы COFF содержат код или данные, которые компоновщики и процесс загрузчиков Microsoft Win32 без специальных знаний о содержимом раздела. Содержимое относится только к приложению, связанному или выполняемой.
Однако некоторые разделы COFF имеют особые значения при обнаружении в файлах объектов или файлах изображений. Средства и загрузчики распознают эти разделы, так как они имеют специальные флаги, заданные в заголовке раздела, так как специальные расположения в необязательном заголовке изображения указывают на них или потому, что само имя раздела указывает специальную функцию раздела. (Даже если само имя раздела не указывает специальную функцию раздела, имя раздела определяется соглашением, поэтому авторы этой спецификации могут ссылаться на имя раздела во всех случаях.)
Зарезервированные разделы и их атрибуты описаны в таблице ниже, а затем подробные описания типов разделов, которые сохраняются в исполняемых файлах и типах разделов, содержащих метаданные для расширений.
Имя раздела | Содержимое | Характеристики |
---|---|---|
.bss |
Неинициализированные данные (свободный формат) |
IMAGE_SCN_CNT_UNINITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE |
.cormeta |
Метаданные СРЕДЫ CLR, указывающие, что файл объекта содержит управляемый код |
IMAGE_SCN_LNK_INFO |
.данные |
Инициализированные данные (бесплатный формат) |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE |
.debug$F |
Созданные сведения об отладке FPO (только объект, архитектура x86 и устаревшая) |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_DISCARDABLE |
.debug$P |
Предварительно скомпилированные типы отладки (только объект) |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_DISCARDABLE |
.debug$S |
Отладочные символы (только объект) |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_DISCARDABLE |
.debug$T |
Типы отладки (только объект) |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_DISCARDABLE |
Drective |
Параметры компоновщика |
IMAGE_SCN_LNK_INFO |
.edata |
Экспорт таблиц |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ |
.idata |
Импорт таблиц |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE |
Idlsym |
Включает зарегистрированный SEH (только образ) для поддержки атрибутов IDL. Дополнительные сведения см. в разделе "Атрибуты IDL" в справочниках в конце этого раздела. |
IMAGE_SCN_LNK_INFO |
PDATA |
Сведения об исключении |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ |
.rdata |
Инициализированные данные только для чтения |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ |
Reloc |
Перемещение изображений |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_DISCARDABLE |
.rsrc |
Каталог ресурсов |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ |
SBSS |
Неинициализированные данные относительно групповой политики (бесплатный формат) |
IMAGE_SCN_CNT_UNINITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE | IMAGE _SCN_GPREL Флаг IMAGE_SCN_GPREL должен быть задан только для архитектур IA64; этот флаг недействителен для других архитектур. Флаг IMAGE_SCN_GPREL предназначен только для файлов объектов; Если этот тип раздела отображается в файле изображения, флаг IMAGE_SCN_GPREL не должен быть задан. |
.sdata |
Относительные инициализированные данные групповой политики (бесплатный формат) |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE | IMAGE _SCN_GPREL Флаг IMAGE_SCN_GPREL должен быть задан только для архитектур IA64; этот флаг недействителен для других архитектур. Флаг IMAGE_SCN_GPREL предназначен только для файлов объектов; Если этот тип раздела отображается в файле изображения, флаг IMAGE_SCN_GPREL не должен быть задан. |
.srdata |
Относительные данные только для чтения (бесплатный формат) |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE _SCN_GPREL Флаг IMAGE_SCN_GPREL должен быть задан только для архитектур IA64; этот флаг недействителен для других архитектур. Флаг IMAGE_SCN_GPREL предназначен только для файлов объектов; Если этот тип раздела отображается в файле изображения, флаг IMAGE_SCN_GPREL не должен быть задан. |
.sxdata |
Зарегистрированные данные обработчика исключений (только для свободного формата и x86/object) |
IMAGE_SCN_LNK_INFO Содержит индекс символов каждого обработчика исключений, на который ссылается код в этом объектном файле. Символ может быть символом UNDEF или одним из них, определенным в этом модуле. |
.СМС |
Исполняемый код (бесплатный формат) |
IMAGE_SCN_CNT_CODE | IMAGE_SCN_MEM_EXECUTE | IIMAGE_SCN_MEM_READ |
TLS |
Хранилище thread-local (только объект) |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE |
.tls$ |
Хранилище thread-local (только объект) |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE |
VSDATA |
Относительные инициализированные данные GP (бесплатный формат и только для архитектур ARM, SH4 и thumb) |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE |
.xdata |
Сведения об исключении (бесплатный формат) |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ |
Некоторые разделы, перечисленные здесь, помечены как "только объект" или "только изображение", чтобы указать, что их специальная семантика относится только к файлам объектов или файлам изображений соответственно. Раздел, помеченный как "только изображение", может по-прежнему отображаться в файле объекта как способ входа в файл изображения, но раздел не имеет специального значения для компоновщика, только для загрузчика файла изображения.
Раздел отладки используется в файлах объектов, чтобы содержать данные отладки, созданные компилятором, и в файлах изображений, чтобы содержать все созданные отладочные сведения. В этом разделе описывается упаковка отладочной информации в файлах объектов и изображений.
В следующем разделе описывается формат каталога отладки, который может находиться в любом месте изображения. В последующих разделах описываются "группы" в файлах объектов, содержащих сведения об отладке.
По умолчанию компоновщик указывает, что сведения об отладке не сопоставляются с адресным пространством изображения. Раздел отладки существует только при сопоставлении сведений об отладке в адресном пространстве.
Файлы изображений содержат необязательный каталог отладки, указывающий, какая форма отладочной информации присутствует и где она находится. Этот каталог состоит из массива записей каталогов отладки, расположение и размер которых указываются в необязательном заголовке изображения.
Каталог отладки может находиться в разделе отбрасываемой отладки (если он существует), или он может быть включен в любой другой раздел в файле изображения или вообще не находиться в разделе.
Каждая запись каталога отладки определяет расположение и размер блока отладочной информации. Указанный RVA может быть равен нулю, если сведения об отладке не охватываются заголовком раздела (т. е. он находится в файле изображения и не сопоставляется с адресным пространством времени выполнения). Если он сопоставлен, RVA — это его адрес.
Запись каталога отладки имеет следующий формат:
Смещение | Размер | Поле | Description |
---|---|---|---|
0 |
4 |
Характеристики |
Зарезервировано, должно быть равно нулю. |
4 |
4 |
TimeDateStamp |
Время и дата создания данных отладки. |
8 |
2 — . |
MajorVersion |
Основной номер версии формата данных отладки. |
10 |
2 — . |
MinorVersion |
Дополнительный номер версии формата данных отладки. |
12 |
4 |
Введите . |
Формат сведений об отладке. Это поле обеспечивает поддержку нескольких отладчиков. Дополнительные сведения см. в разделе "Тип отладки". |
16 |
4 |
SizeOfData |
Размер данных отладки (не включая сам каталог отладки). |
20 |
4 |
AddressOfRawData |
Адрес данных отладки при загрузке относительно базы образа. |
24 |
4 |
PointerToRawData |
Указатель файла на отладочные данные. |
Для поля "Тип" записи каталога отладки определены следующие значения:
Константа | значение | Описание |
---|---|---|
IMAGE_DEBUG_TYPE_UNKNOWN |
0 |
Неизвестное значение, игнорируемое всеми средствами. |
IMAGE_DEBUG_TYPE_COFF |
1 |
Отладочная информация COFF (номера строк, таблица символов и таблица строк). На отладочную информацию этого типа также указывают поля в заголовках файлов. |
IMAGE_DEBUG_TYPE_CODEVIEW |
2 — . |
Сведения об отладке Visual C++. |
IMAGE_DEBUG_TYPE_FPO |
3 |
Сведения об упущении указателя кадра (FPO). Эта информация сообщает отладчику, как интерпретировать нестандартные кадры стека, которые используют регистр EBP для цели, отличной от указателя кадра. |
IMAGE_DEBUG_TYPE_MISC |
4 |
Расположение DBG-файла. |
IMAGE_DEBUG_TYPE_EXCEPTION |
5 |
Копия раздела PDATA. |
IMAGE_DEBUG_TYPE_FIXUP |
6 . |
Зарезервировано. |
IMAGE_DEBUG_TYPE_OMAP_TO_SRC |
7 |
Сопоставление из RVA в образе с RVA в исходном образе. |
IMAGE_DEBUG_TYPE_OMAP_FROM_SRC |
8 |
Сопоставление из RVA в исходном изображении с RVA на образе. |
IMAGE_DEBUG_TYPE_BORLAND |
9 |
Зарезервировано для Борланда. |
IMAGE_DEBUG_TYPE_RESERVED10 |
10 |
Зарезервировано. |
IMAGE_DEBUG_TYPE_CLSID |
11 |
Зарезервировано. |
IMAGE_DEBUG_TYPE_REPRO |
16 |
Детерминированность pe или воспроизводимость. |
Undefined |
17 |
Сведения об отладке внедрены в PE-файл в расположении, указанном в PointerToRawData. |
Undefined |
19 |
Сохраняет хэш шифрования для содержимого файла символа, используемого для создания PE/COFF-файла. |
IMAGE_DEBUG_TYPE_EX_DLLCHARACTERISTICS | 20 | Биты расширенных характеристик DLL. |
Если для поля Type задано значение IMAGE_DEBUG_TYPE_FPO, отладочные необработанные данные — это массив, в котором каждый элемент описывает кадр стека функции. Для каждой функции в файле изображения должна быть определена информация FPO, даже если тип отладки — FPO. Предполагается, что эти функции, не имеющие сведений О FPO, имеют обычные кадры стека. Формат сведений FPO выглядит следующим образом:
#define FRAME_FPO 0
#define FRAME_TRAP 1
#define FRAME_TSS 2
typedef struct _FPO_DATA {
DWORD ulOffStart; // offset 1st byte of function code
DWORD cbProcSize; // # bytes in function
DWORD cdwLocals; // # bytes in locals/4
WORD cdwParams; // # bytes in params/4
WORD cbProlog : 8; // # bytes in prolog
WORD cbRegs : 3; // # regs saved
WORD fHasSEH : 1; // TRUE if SEH in func
WORD fUseBP : 1; // TRUE if EBP has been allocated
WORD reserved : 1; // reserved for future use
WORD cbFrame : 2; // frame type
} FPO_DATA;
Наличие записи типа IMAGE_DEBUG_TYPE_REPRO указывает, что PE-файл построен таким образом, чтобы обеспечить детерминированность или воспроизводимость. Если входные данные не изменяются, выходной PE-файл гарантированно будет битовым для бита идентичным независимо от того, когда или где создается PE. Различные поля метки даты и времени в PE-файле заполняются частью или всеми битами из вычисляемого хэш-значения, использующего содержимое файла PE в качестве входных данных, и поэтому больше не представляют фактическую дату и время, когда создается PE-файл или связанные определенные данные в PE. Необработанные данные этой записи отладки могут быть пустыми или содержать вычисляемое хэш-значение, предшествующее четырехбайтового значения, представляющего длину хэш-значения.
Если для поля Type задано значение IMAGE_DEBUG_TYPE_EX_DLLCHARACTERISTICS, отладочные необработанные данные содержат расширенные характеристики БИБЛИОТЕК DLL, а также дополнительные значения, которые можно задать в необязательном заголовке образа. См. раздел "Характеристики БИБЛИОТЕК DLL" в разделе "Необязательные поля заголовка" (только для изображений).
Следующие значения определяются для битов расширенных характеристик DLL.
Константа | значение | Описание |
---|---|---|
IMAGE_DLLCHARACTERISTICS_EX_CET_COMPAT | 0x0001 | Изображение совместимо с теневым стеком потока управления. |
IMAGE_DLLCHARACTERISTICS_EX_FORWARD_CFI_COMPAT | 0x0040 | Все целевые объекты ветви во всех разделах кода изображения аннотируются с помощью инструкций защиты целостности потока управления вперед, таких как x86 CET-Косвенное отслеживание ветви (IBT) или инструкции по идентификации целевой ветви ARM (BTI). Этот бит не используется Windows. |
Данные в этом разделе заменены в Visual C++ версии 7.0 и более поздних версий более обширным набором данных, которые создаются в подразделе .debug$S .
Файлы объектов могут содержать разделы .debug$F, содержимое которых — одна или несколько записей FPO_DATA (сведения об упущении указателя кадра). См. раздел "IMAGE_DEBUG_TYPE_FPO" в типе отладки.
Компоновщик распознает эти записи .debug$F . Если создается отладочная информация, компоновщик сортирует записи FPO_DATA по процедуре RVA и создает для них запись каталога отладки.
Компилятор не должен создавать записи FPO для процедур, имеющих стандартный формат кадра.
В этом разделе содержатся сведения об отладке Visual C++ (символьная информация).
В этом разделе содержатся сведения об отладке Visual C++ (предварительно скомпилированные сведения). Эти типы являются общими для всех объектов, скомпилированных с помощью предварительно скомпилированного заголовка, созданного с помощью этого объекта.
В этом разделе содержатся сведения об отладке Visual C++ (сведения о типе).
Для поддержки сведений об отладке компоновщик:
Собирает все соответствующие данные отладки из разделов .debug$F, debug$S, .debug$P и .debug$T.
Обрабатывает эти данные вместе с данными отладки, созданными компоновщиком, в PDB-файл, и создает запись каталога отладки для ссылки на нее.
Раздел — это раздел директивы, если он имеет флаг IMAGE_SCN_LNK_INFO в заголовке раздела и имеет имя раздела DRECTVE . Компоновщик удаляет раздел DRECTVE после обработки сведений, поэтому раздел не отображается в связанном файле изображения.
Раздел drectve состоит из строки текста, которая может быть закодирована как ANSI или UTF-8. Если маркер порядка байтов UTF-8 (BOM, трехбайтовый префикс, состоящий из 0xEF, 0xBB и 0xBF), строка директив интерпретируется как ANSI. Строка директив — это ряд параметров компоновщика, разделенных пробелами. Каждый параметр содержит дефис, имя параметра и любой соответствующий атрибут. Если параметр содержит пробелы, параметр должен быть заключен в кавычки. Раздел drectve не должен иметь перемещений или номеров строк.
Раздел данных экспорта с именем .edata содержит сведения о символах, к которым другие изображения могут получить доступ через динамическое связывание. Экспортированные символы обычно находятся в библиотеках DLL, но библиотеки DLL также могут импортировать символы.
Обзор общей структуры раздела экспорта описан ниже. Описанные таблицы обычно являются смежными в файле в указанном порядке (хотя это не обязательно). Для экспорта символов в виде порядковых номеров требуется только таблица каталога экспорта и таблица адресов экспорта. (Порядковый номер — это экспорт, доступ к которому осуществляется непосредственно по индексу таблицы адресов экспорта.) Таблица указателя имен, порядковая таблица и таблица экспортируемых имен существуют для поддержки использования имен экспорта.
Имя таблицы | Description |
---|---|
Экспорт таблицы каталогов |
Таблица с одной строкой (в отличие от каталога отладки). Эта таблица указывает расположения и размеры других таблиц экспорта. |
Экспорт таблицы адресов |
Массив RVAs экспортированных символов. Это фактические адреса экспортированных функций и данных в исполняемом коде и разделах данных. Другие файлы изображений могут импортировать символ с помощью индекса в эту таблицу (порядковый номер) или, при необходимости, с помощью общедоступного имени, соответствующего порядковой порядковой дате, если определено общедоступное имя. |
Таблица указателя имен |
Массив указателей на общедоступные имена экспорта, отсортированный по возрастанию. |
Порядковая таблица |
Массив порядковых порядков, соответствующих элементам таблицы указателя имен. Соответствие по позиции; Таким образом, таблица указателя имен и порядковая таблица должны иметь одинаковое количество элементов. Каждый порядковый номер является индексом в таблице адресов экспорта. |
Экспорт таблицы имен |
Ряд строк ASCII, завершаемых значением NULL. Члены таблицы указателя имен в этой области. Эти имена являются общедоступными именами, с помощью которых импортируются и экспортируются символы; они не обязательно совпадают с частными именами, которые используются в файле образа. |
Когда другой файл изображения импортирует символ по имени, загрузчик Win32 ищет таблицу указателя имен для соответствующей строки. Если найдена соответствующая строка, связанный порядковый номер определяется путем поиска соответствующего члена в порядковой таблице (то есть член порядковой таблицы с тем же индексом, что и указатель строки, найденный в таблице указателя имен). Результирующий порядковый номер — это индекс в таблицу адресов экспорта, которая дает фактическое расположение требуемого символа. Доступ к каждому символу экспорта можно получить с помощью порядкового номера.
Если другой файл изображения импортирует символ по порядковой строке, не требуется искать таблицу указателя имен для соответствующей строки. Поэтому более эффективным является прямое использование порядкового номера. Однако имя экспорта проще запоминать и не требует, чтобы пользователь знал индекс таблицы для символа.
Сведения о символах экспорта начинаются с таблицы каталога экспорта, которая описывает оставшуюся часть сведений о символах экспорта. Таблица каталога экспорта содержит сведения об адресе, которые используются для разрешения импорта в точки входа в этом изображении.
Смещение | Размер | Поле | Description |
---|---|---|---|
0 |
4 |
Экспорт флагов |
Зарезервировано, должно быть 0. |
4 |
4 |
Метка времени и даты |
Время и дата создания данных экспорта. |
8 |
2 — . |
Основная версия |
Основной номер версии. Номера основных и дополнительных версий можно задать пользователем. |
10 |
2 — . |
Дополнительная версия |
Дополнительный номер версии. |
12 |
4 |
Имя RVA |
Адрес строки ASCII, содержащей имя библиотеки DLL. Этот адрес относится к базе образа. |
16 |
4 |
Порядковый номер |
Начальный порядковый номер для экспорта на этом изображении. Это поле указывает начальный порядковый номер для таблицы адресов экспорта. Обычно для него задано значение 1. |
20 |
4 |
Записи таблицы адресов |
Количество записей в таблице адресов экспорта. |
24 |
4 |
Число указателей имен |
Количество записей в таблице указателя имен. Это также число записей в порядковой таблице. |
28 |
4 |
Экспорт таблицы адресов RVA |
Адрес таблицы адресов экспорта относительно базы образа. |
32 |
4 |
Указатель имени RVA |
Адрес таблицы указателя имени экспорта относительно базы образа. Размер таблицы определяется полем "Число указателей имен". |
36 |
4 |
Порядковая таблица RVA |
Адрес порядковой таблицы относительно базы образа. |
Таблица адресов экспорта содержит адрес экспортированных точек входа и экспортированных данных и абсолютных значений. Порядковый номер используется в качестве индекса в таблице адресов экспорта.
Каждая запись в таблице адресов экспорта — это поле, которое использует один из двух форматов в следующей таблице. Если указанный адрес не находится в разделе экспорта (как определено адресом и длиной, указанными в необязательном заголовке), поле является экспортом RVA, который является фактическим адресом в коде или данных. В противном случае поле представляет собой RVA пересылки, которая называет символ в другой библиотеке DLL.
Смещение | Размер | Поле | Description |
---|---|---|---|
0 |
4 |
Экспорт RVA |
Адрес экспортированного символа при загрузке в память относительно базы образа. Например, адрес экспортируемой функции. |
0 |
4 |
RVA пересылки |
Указатель на строку ASCII, завершаемую значением NULL, в разделе экспорта. Эта строка должна находиться в диапазоне, заданном записью каталога данных таблицы экспорта. См. дополнительные каталоги данных заголовков (только изображения). Эта строка содержит имя библиотеки DLL и имя экспорта (например, MYDLL.expfunc) или имя библиотеки DLL и порядковое число экспорта (например, MYDLL.#27). |
RVA пересылки экспортирует определение из другого образа, что делает его как будто экспортируется текущим изображением. Таким образом, символ одновременно импортируется и экспортируется.
Например, в Kernel32.dll в Windows XP экспорт с именем HeapAlloc перенаправляется в строку NTDLL. RtlAllocateHeap". Это позволяет приложениям использовать модуль windows XP Ntdll.dll без фактического хранения ссылок на импорт. Таблица импорта приложения относится только к Kernel32.dll. Поэтому приложение не зависит от Windows XP и может работать в любой системе Win32.
Таблица указателя имени экспорта представляет собой массив адресов (RVAs) в таблицу имен экспорта. Указатели — 32 бита и относительные к базе образа. Указатели упорядочены лексически, чтобы разрешить двоичный поиск.
Имя экспорта определяется только в том случае, если таблица указателя имени экспорта содержит указатель на него.
Экспортная порядковая таблица представляет собой массив 16-разрядных неустранимых индексов в таблицу адресов экспорта. Порядковые порядковые номера предвзяты в поле "Порядковый номер" таблицы каталога экспорта. Другими словами, порядковый номер должен вычитаться из порядковых порядков, чтобы получить истинные индексы в таблицу адресов экспорта.
Таблица указателя имени экспорта и порядковая таблица экспорта образуют два параллельных массива, разделенных для выравнивания естественного поля. Эти две таблицы, в действительности, работают как одна таблица, в которой столбец "Указатель имени экспорта" указывает на общедоступное (экспортируемое) имя, а столбец "Экспорт порядкового номера" предоставляет соответствующее порядковое значение для этого общедоступного имени. Член таблицы указателя имени экспорта и член экспортной порядковой таблицы связаны с тем же положением (индексом) в соответствующих массивах.
Таким образом, при поиске таблицы указателя имени экспорта и сопоставленной строке находится в позиции i, алгоритм поиска RVA символа и порядковый порядковый номер символа:
i = Search_ExportNamePointerTable (name);
ordinal = ExportOrdinalTable [i];
rva = ExportAddressTable [ordinal];
biased_ordinal = ordinal + OrdinalBase;
При поиске символа по порядковой (предвзятой) алгоритм поиска RVA символа и имени:
ordinal = biased_ordinal - OrdinalBase;
i = Search_ExportOrdinalTable (ordinal);
rva = ExportAddressTable [ordinal];
name = ExportNameTable [i];
Таблица имен экспорта содержит фактические строковые данные, на которые указывает таблица указателя имени экспорта. Строки в этой таблице являются общедоступными именами, которые другие изображения могут использовать для импорта символов. Эти открытые имена экспорта не обязательно совпадают с именами частных символов, которые символы имеют в собственном файле изображения и исходном коде, хотя они могут быть.
Каждый экспортируемый символ имеет порядковое значение, которое является только индексом в таблице адресов экспорта. Однако использование имен экспорта является необязательным. Некоторые, все или ни один из экспортированных символов не может содержать имена экспорта. Для экспортированных символов, которые имеют имена экспорта, соответствующие записи в таблице указателя имени экспорта и экспорт порядковой таблицы объединяются, чтобы связать каждое имя с порядком.
Структура таблицы имен экспорта представляет собой ряд строк ASCII, завершаемых значением NULL, переменной длины.
Все файлы изображений, импортируемые символами, включая практически все исполняемые файлы (EXE), имеют раздел idata. Ниже приведен типичный макет файла для сведений о импорте:
Таблица каталогов
Запись каталога NULL
Таблица подстановки DLL1 импорта
Null
Таблица импорта подстановки DLL2
Null
Таблица подстановки DLL3
Null
Таблица hint-Name
Сведения о импорте начинаются с таблицы каталогов импорта, которая описывает оставшуюся часть сведений о импорте. Таблица каталогов импорта содержит сведения об адресе, которые используются для разрешения ссылок на исправления точек входа в образе DLL. Таблица каталогов импорта состоит из массива записей каталога импорта, одна запись для каждой библиотеки DLL, к которой ссылается образ. Последняя запись каталога пуста (заполнена значениями NULL), которая указывает конец таблицы каталогов.
Каждая запись каталога импорта имеет следующий формат:
Смещение | Размер | Поле | Description |
---|---|---|---|
0 |
4 |
Импорт таблицы подстановки RVA (характеристики) |
RVA таблицы подстановки импорта. Эта таблица содержит порядковый номер имени для каждого импорта. (Имя "Характеристики" используется в Winnt.h, но больше не описывает это поле.) |
4 |
4 |
Метка времени и даты |
Метка, которая имеет значение нулю, пока изображение не будет привязано. После привязки изображения это поле устанавливается на метку времени или данных библиотеки DLL. |
8 |
4 |
Цепочка пересылки |
Индекс ссылки на первый сервер пересылки. |
12 |
4 |
Имя RVA |
Адрес строки ASCII, содержащей имя библиотеки DLL. Этот адрес относится к базе образа. |
16 |
4 |
Импорт RVA таблицы адресов (таблица Thunk) |
RVA таблицы адресов импорта. Содержимое этой таблицы идентично содержимому таблицы подстановки импорта, пока изображение не будет привязано. |
Таблица подстановки импорта — это массив 32-разрядных чисел для PE32 или массив 64-разрядных чисел для PE32+. Каждая запись использует формат битового поля, описанный в следующей таблице. В этом формате бит 31 является наиболее значительным для PE32 и 63 является самым значительным для PE32+. Коллекция этих записей описывает все импорты из заданной библиотеки DLL. Последняя запись имеет значение null (NULL), чтобы указать конец таблицы.
Биты | Размер | Битовое поле | Description |
---|---|---|---|
31/63 |
1 |
Порядковый или имя флаг |
Если этот бит задан, импортируйте по порядку. В противном случае импортируйте по имени. Бит маскируется как 0x80000000 для PE32, 0x8000000000000000 для PE32+. |
15-0 |
16 |
Порядковое числительное |
16-разрядное порядковое число. Это поле используется только в том случае, если бит флага ordinal/Name имеет значение 1 (импорт по порядковой номеру). Биты 30-15 или 62-15 должны быть 0. |
30-0 |
31 |
Указание и имя таблицы RVA |
31-разрядная RVA записи таблицы подсказок и имен. Это поле используется только в том случае, если битовое значение ordinal/Name Flag равно 0 (импорт по имени). Для PE32+ битов 62-31 должно быть равно нулю. |
Одна таблица подсказок и имен достаточно для всего раздела импорта. Каждая запись в таблице подсказок и имен имеет следующий формат:
Смещение | Размер | Поле | Description |
---|---|---|---|
0 |
2 — . |
Подсказка |
Индекс в таблице указателя имени экспорта. Сначала выполняется попытка совпадения с этим значением. Если он завершается ошибкой, двоичный поиск выполняется в таблице указателя имени экспорта DLL. |
2 — . |
переменная |
Имя |
Строка ASCII, содержащая имя для импорта. Это строка, которая должна соответствовать общедоступному имени в библиотеке DLL. Эта строка учитывает регистр и завершается байтом NULL. |
* |
0 или 1 |
Подушечка |
Конечный байт нулевой панели, который появляется после байта, завершающегося значением NULL, при необходимости, для выравнивания следующей записи на даже границе. |
Структура и содержимое таблицы адресов импорта идентичны структуре таблицы подстановок импорта, пока файл не будет привязан. Во время привязки записи в таблице адресов импорта перезаписываются с 32-разрядными (для PE32) или 64-разрядными (для PE32+) адресами импортируемых символов. Эти адреса являются фактическими адресами памяти символов, хотя технически они по-прежнему называются виртуальными адресами. Загрузчик обычно обрабатывает привязку.
Раздел PDATA содержит массив записей таблицы функций, которые используются для обработки исключений. Он указывает на запись таблицы исключений в каталоге данных изображения. Записи должны быть отсортированы в соответствии с адресами функции (первым полем в каждой структуре), прежде чем отправляться в окончательное изображение. Целевая платформа определяет, какие из трех вариантов формата записи таблицы функций, описанных ниже.
Для 32-разрядных изображений MIPS записи таблицы функций имеют следующий формат:
Смещение | Размер | Поле | Description |
---|---|---|---|
0 |
4 |
Начальный адрес |
Va для соответствующей функции. |
4 |
4 |
Конечный адрес |
VA конца функции. |
8 |
4 |
Обработчик исключений |
Указатель на обработчик исключений, который необходимо выполнить. |
12 |
4 |
Данные обработчика |
Указатель на дополнительные сведения, передаваемые обработчику. |
16 |
4 |
Адрес конца пролога |
VA конца пролога функции. |
Для платформ ARM, PowerPC, SH3 и SH4 Windows CE записи таблицы функций имеют следующий формат:
Смещение | Размер | Поле | Description |
---|---|---|---|
0 |
4 |
Начальный адрес |
Va для соответствующей функции. |
4 |
8 бит |
Длина пролога |
Количество инструкций в прологе функции. |
4 |
22 бита |
Длина функции |
Количество инструкций в функции. |
4 |
1 бит |
32-разрядный флаг |
Если задано, функция состоит из 32-разрядных инструкций. Если ясно, функция состоит из 16-разрядных инструкций. |
4 |
1 бит |
Флаг исключения |
Если задано, для функции существует обработчик исключений. В противном случае обработчик исключений не существует. |
Для платформ x64 и Itanium записи таблицы функций имеют следующий формат:
Смещение | Размер | Поле | Description |
---|---|---|---|
0 |
4 |
Начальный адрес |
RVA соответствующей функции. |
4 |
4 |
Конечный адрес |
RVA конца функции. |
8 |
4 |
Сведения о очистке |
RVA сведений о очистке. |
Базовая таблица перемещений содержит записи для всех базовых перемещений на изображении. Поле базовой таблицы перемещений в необязательных каталогах данных заголовка дает количество байтов в базовой таблице перемещений. Дополнительные сведения см. в дополнительных каталогах данных заголовков (только изображения). Базовая таблица перемещений делится на блоки. Каждый блок представляет базовые перемещения для страницы 4K. Каждый блок должен начинаться с 32-разрядной границы.
Загрузчик не требуется для обработки базовых перемещений, разрешенных компоновщиком, если только образ загрузки не может быть загружен в базу образа, указанной в заголовке PE.
Каждый базовый блок перемещений начинается со следующей структуры:
Смещение | Размер | Поле | Description |
---|---|---|---|
0 |
4 |
Страница RVA |
База изображений плюс страница RVA добавляется в каждое смещение, чтобы создать va, где необходимо применить базовое перемещение. |
4 |
4 |
Размер блока |
Общее количество байтов в базовом блоке перемещения, включая поля "Размер страницы" и "Размер блока", а также поля "Тип и смещение", приведенные ниже. |
Затем за полем "Размер блока" следует любое количество записей полей "Тип" или "Смещение". Каждая запись — это WORD (2 байта) и имеет следующую структуру:
Смещение | Размер | Поле | Description |
---|---|---|---|
0 |
4 бита |
Введите . |
Хранящееся в высоких 4 битах WORD, значение, указывающее тип базового перемещения, который необходимо применить. Дополнительные сведения см. в разделе "Базовые типы перемещения". |
0 |
12 битов |
Смещение |
Хранится в оставшихся 12 битах WORD, смещение от начального адреса, указанного в поле Страницы RVA для блока. Это смещение указывает, где необходимо применить базовое перемещение. |
Чтобы применить базовое перемещение, разница вычисляется между предпочтительным базовым адресом и базой, в которой фактически загружен образ. Если изображение загружается в предпочтительной базе, разница равна нулю, поэтому базовые перемещения не должны быть применены.
Константа | значение | Описание |
---|---|---|
IMAGE_REL_BASED_ABSOLUTE |
0 |
Базовое перемещение пропускается. Этот тип можно использовать для заполнения блока. |
IMAGE_REL_BASED_HIGH |
1 |
Базовое перемещение добавляет высокий 16 бит разницы в 16-разрядное поле при смещение. 16-разрядное поле представляет большое значение 32-разрядного слова. |
IMAGE_REL_BASED_LOW |
2 — . |
Базовое перемещение добавляет низкие 16 бит разницы в 16-разрядное поле при смещение. 16-разрядное поле представляет низкую половину 32-разрядного слова. |
IMAGE_REL_BASED_HIGHLOW |
3 |
Базовое перемещение применяет все 32 бита разницы к 32-разрядному полю с смещением. |
IMAGE_REL_BASED_HIGHADJ |
4 |
Базовое перемещение добавляет высокий 16 бит разницы в 16-разрядное поле при смещение. 16-разрядное поле представляет большое значение 32-разрядного слова. Низкие 16 битов 32-разрядного значения хранятся в 16-разрядном слове, которое следует этому базовому перемещению. Это означает, что это базовое перемещение занимает два слота. |
IMAGE_REL_BASED_MIPS_JMPADDR |
5 |
Интерпретация перемещения зависит от типа компьютера. Если тип компьютера — MIPS, базовое перемещение применяется к инструкции перехода MIPS. |
IMAGE_REL_BASED_ARM_MOV32 |
5 |
Это перемещение имеет смысл только в том случае, если тип компьютера — ARM или Thumb. Базовое перемещение применяет 32-разрядный адрес символа в последовательной паре инструкций MOVW/MOVT. |
IMAGE_REL_BASED_RISCV_HIGH20 |
5 |
Это перемещение имеет смысл только в том случае, если тип компьютера — RISC-V. Базовое перемещение применяется к высоким 20 битам 32-разрядного абсолютного адреса. |
6 . |
Зарезервировано, должно быть равно нулю. |
|
IMAGE_REL_BASED_THUMB_MOV32 |
7 |
Это перемещение имеет смысл только в том случае, если тип компьютера имеет значение Thumb. Базовое перемещение применяет 32-разрядный адрес символа к последовательной паре инструкций MOVW/MOVT. |
IMAGE_REL_BASED_RISCV_LOW12I |
7 |
Это перемещение имеет смысл только в том случае, если тип компьютера — RISC-V. Базовое перемещение применяется к низким 12 битам 32-разрядного абсолютного адреса, сформированного в формате инструкции типа RISC-V. |
IMAGE_REL_BASED_RISCV_LOW12S |
8 |
Это перемещение имеет смысл только в том случае, если тип компьютера — RISC-V. Базовое перемещение применяется к низким 12 битам 32-разрядного абсолютного адреса, сформированного в формате инструкций типа RISC-V. |
IMAGE_REL_BASED_LOONGARCH32_MARK_LA |
8 |
Это перемещение имеет смысл только в том случае, если тип компьютера — LoongArch 32-разрядная версия. Базовое перемещение применяется к 32-разрядному абсолютному адресу, сформированном двумя последовательными инструкциями. |
IMAGE_REL_BASED_LOONGARCH64_MARK_LA |
8 |
Это перемещение имеет смысл только в том случае, если тип компьютера — LoongArch 64-разрядная версия. Базовое перемещение применяется к 64-разрядному абсолютному адресу, сформированном в четырех последовательных инструкциях. |
IMAGE_REL_BASED_MIPS_JMPADDR16 |
9 |
Перемещение имеет смысл только в том случае, если тип компьютера — MIPS. Базовое перемещение применяется к инструкции перехода MIPS16. |
IMAGE_REL_BASED_DIR64 |
10 |
Базовое перемещение применяет разницу к 64-разрядному полю со смещением. |
Раздел .tls обеспечивает прямую поддержку PE и COFF для локального хранилища статических потоков (TLS). TLS — это специальный класс хранилища, поддерживаемый Windows, в котором объект данных не является переменной автоматического (стека), но является локальным для каждого отдельного потока, выполняющего код. Таким образом, каждый поток может поддерживать другое значение переменной, объявленной с помощью TLS.
Обратите внимание, что любое количество данных TLS можно поддерживать с помощью вызовов TLSAlloc, TlsFree, TlsSetValue и TlsGetValue. Реализация PE или COFF является альтернативным подходом к использованию API и имеет преимущество быть проще с точки зрения высокоуровневого программиста. Эта реализация позволяет определять и инициализировать данные TLS аналогично обычным статическим переменным в программе. Например, в Visual C++ статическую переменную TLS можно определить следующим образом, не используя API Windows:
__declspec (thread) int tlsFlag = 1;
Для поддержки этой конструкции программирования раздел PE и COFF .tls указывает следующие сведения: данные инициализации, подпрограммы обратного вызова для инициализации и завершения потока и индекс TLS, которые описаны в следующем обсуждении.
Примечание
До Windows Vista статически объявленные объекты данных TLS можно использовать только в статически загруженных файлах изображений. Этот факт делает его ненадежным для использования статических данных TLS в библиотеке DLL, если вы не знаете, что библиотека DLL или что-либо статически связанное с ней, никогда не будет динамически загружаться с помощью функции API LoadLibrary. Тем не менее, начиная с Windows Vista, улучшения были сделаны в загрузчике Windows, чтобы лучше поддерживать динамическую загрузку БИБЛИОТЕК DLL со статическим TLS. Это изменение означает, что библиотеки DLL со статически объявленными объектами данных TLS теперь можно использовать более надежно, даже если они загружаются динамически с помощью LoadLibrary. Загрузчик может распределить слоты TLS для таких БИБЛИОТЕК DLL во время загрузки, что упрощает ограничения, которые присутствуют в более ранних версиях Windows.
Примечание
Ссылки на 32-разрядные смещения и умножения индексов 4 применяются к системам с 32-разрядными архитектурами. В системе на основе 64-разрядных архитектур настройте их по мере необходимости.
Исполняемый код обращается к статическому объекту данных TLS, выполнив следующие действия.
Во время ссылки компоновщик задает поле "Адрес индекса" каталога TLS. Это поле указывает на расположение, в котором программа ожидает получения индекса TLS.
Библиотека времени выполнения Майкрософт упрощает этот процесс, определяя образ памяти каталога TLS и предоставляя ему специальное имя "__tls_used" (платформы Intel x86) или "_tls_used" (другие платформы). Компоновщик ищет этот образ памяти и использует данные там для создания каталога TLS. Другие компиляторы, поддерживающие TLS и работающие с компоновщиком Майкрософт, должны использовать этот же метод.
При создании потока загрузчик передает адрес массива TLS потока, помещая адрес блока среды потока (TEB) в регистр FS. Указатель на массив TLS находится в смещение 0x2C с начала TEB. Такое поведение зависит от Intel x86.
Загрузчик назначает значение индекса TLS месту, указанному полем "Адрес индекса".
Исполняемый код извлекает индекс TLS, а также расположение массива TLS.
В коде используется индекс TLS и расположение массива TLS (умножение индекса на 4 и его использование в качестве смещения к массиву) для получения адреса области данных TLS для заданной программы и модуля. Каждый поток имеет собственную область данных TLS, но это прозрачно для программы, которая не должна знать, как выделены данные для отдельных потоков.
Доступ к отдельному объекту данных TLS осуществляется в виде фиксированного смещения в область данных TLS.
Массив TLS — это массив адресов, которые система поддерживает для каждого потока. Каждый адрес в этом массиве предоставляет расположение данных TLS для заданного модуля (EXE или DLL) в программе. Индекс TLS указывает, какой элемент массива следует использовать. Индекс — это число (понятное только для системы), определяющее модуль.
Каталог TLS имеет следующий формат:
Смещение (PE32/ PE32+) | Размер (PE32/ PE32+) | Поле | Description |
---|---|---|---|
0 |
4/8 |
Необработанный запуск данных VA |
Начальный адрес шаблона TLS. Шаблон — это блок данных, используемых для инициализации данных TLS. Система копирует все эти данные при каждом создании потока, поэтому его не следует повреждено. Обратите внимание, что этот адрес не является RVA; это адрес, для которого должен быть базовый перемещение в разделе reloc. |
4/8 |
4/8 |
Необработанные конечные данные VA |
Адрес последнего байта TLS, за исключением нулевых заливок. Как и в поле "Необработанный запуск данных", это va, а не RVA. |
8/16 |
4/8 |
Адрес индекса |
Расположение для получения индекса TLS, который назначает загрузчик. Это расположение находится в обычном разделе данных, поэтому его можно указать символьное имя, доступное программе. |
12/24 |
4/8 |
Адрес обратных вызовов |
Указатель на массив функций обратного вызова TLS. Массив завершается значением NULL, поэтому если функция обратного вызова не поддерживается, это поле указывает на 4 байта, равное нулю. Сведения о прототипе этих функций см. в разделе "Функции обратного вызова TLS". |
16/32 |
4 |
Размер нулевой заливки |
Размер шаблона в байтах за пределами инициализированных данных, разделенных полями "Необработанный запуск данных" и "Необработанный конец данных". Общий размер шаблона должен совпадать с общим размером данных TLS в файле изображения. Нулевая заливка — это объем данных, поступающих после инициализированных ненулевых данных. |
20/36 |
4 |
Характеристики |
Четыре бита [23:20] описывают сведения о выравнивании. Возможные значения определяются как IMAGE_SCN_ALIGN_*, которые также используются для описания выравнивания раздела в файлах объектов. Остальные 28 бит зарезервированы для дальнейшего использования. |
Программа может предоставить одну или несколько функций обратного вызова TLS для поддержки дополнительной инициализации и завершения для объектов данных TLS. Обычное использование такой функции обратного вызова — вызов конструкторов и деструкторов для объектов.
Хотя обычно не существует более одной функции обратного вызова, обратный вызов реализуется как массив, чтобы можно было добавить дополнительные функции обратного вызова при необходимости. Если есть несколько функций обратного вызова, каждая функция вызывается в порядке, в котором его адрес отображается в массиве. Указатель null завершает массив. В этом случае массив обратного вызова имеет пустой список (без поддержки обратного вызова), в этом случае массив обратного вызова имеет ровно один элемент-пустой указатель.
Прототип функции обратного вызова (указывает на указатель типа PIMAGE_TLS_CALLBACK) имеет те же параметры, что и функция точки входа DLL:
typedef VOID
(NTAPI *PIMAGE_TLS_CALLBACK) (
PVOID DllHandle,
DWORD Reason,
PVOID Reserved
);
Зарезервированный параметр должен иметь значение нулю. Параметр Reason может принимать следующие значения:
Параметр | значение | Описание |
---|---|---|
DLL_PROCESS_ATTACH |
1 |
Начался новый процесс, включая первый поток. |
DLL_THREAD_ATTACH |
2 — . |
Создан новый поток. Это уведомление отправляется для всех, кроме первого потока. |
DLL_THREAD_DETACH |
3 |
Поток будет завершен. Это уведомление отправляется для всех, кроме первого потока. |
DLL_PROCESS_DETACH |
0 |
Процесс завершается, включая исходный поток. |
Структура конфигурации нагрузки (IMAGE_LOAD_CONFIG_DIRECTORY) ранее использовалась в очень ограниченных случаях в самой операционной системе Windows NT для описания различных функций слишком сложной или слишком большой, чтобы описать в заголовке файла или необязательном заголовке образа. Текущие версии компоновщика Майкрософт и Windows XP и более поздних версий Windows используют новую версию этой структуры для 32-разрядных систем на основе x86, включающих зарезервированную технологию SEH. Это предоставляет список безопасных структурированных обработчиков исключений, которые операционная система использует во время отправки исключений. Если адрес обработчика находится в диапазоне va изображения и помечен как зарезервированный SEH-aware (то есть IMAGE_DLLCHARACTERISTICS_NO_SEH ясно в поле DllCharacteristics необязательного заголовка, как описано ранее), обработчик должен находиться в списке известных безопасных обработчиков для этого изображения. В противном случае операционная система завершает работу приложения. Это помогает предотвратить перехват обработчика исключений x86, который использовался в прошлом для контроля над операционной системой.
Компоновщик Майкрософт автоматически предоставляет структуру конфигурации нагрузки по умолчанию для включения зарезервированных данных SEH. Если пользовательский код уже предоставляет структуру конфигурации нагрузки, он должен включать новые зарезервированные поля SEH. В противном случае компоновщик не может включать зарезервированные данные SEH, а изображение не помечается как содержащее зарезервированный SEH.
Запись каталога данных для предварительно зарезервированной структуры конфигурации загрузки SEH должна указывать определенный размер структуры конфигурации нагрузки, так как загрузчик операционной системы всегда ожидает, что он будет определенным значением. В этом отношении размер действительно является только проверкой версии. Для совместимости с Windows XP и более ранними версиями Windows размер должен быть 64 для образов x86.
Структура конфигурации нагрузки имеет следующий макет для 32-разрядных и 64-разрядных PE-файлов:
Смещение | Размер | Поле | Description |
---|---|---|---|
0 |
4 |
Характеристики |
Флаги, указывающие атрибуты файла, которые в настоящее время не используются. |
4 |
4 |
TimeDateStamp |
Значение метки даты и времени. Значение представлено в количестве секунд, прошедших с полуночи (00:00:00), 1 января 1970 года, универсальное координированное время, согласно системным часам. Метка времени можно распечатать с помощью функции времени выполнения C (CRT). |
8 |
2 — . |
MajorVersion |
Номер основной версии. |
10 |
2 — . |
MinorVersion |
Дополнительный номер версии. |
12 |
4 |
GlobalFlagsClear |
Флаги глобального загрузчика, которые необходимо очистить для этого процесса, так как загрузчик запускает процесс. |
16 |
4 |
GlobalFlagsSet |
Флаги глобального загрузчика, заданные для этого процесса, как загрузчик запускает процесс. |
20 |
4 |
CriticalSectionDefaultTimeout |
Значение времени ожидания по умолчанию, используемое для критически важных разделов этого процесса, которые заброшены. |
24 |
4/8 |
DeCommitFreeBlockThreshold |
Память, которую необходимо освободить перед возвратом в систему в байтах. |
28/32 |
4/8 |
DeCommitTotalFreeThreshold |
Общий объем свободной памяти в байтах. |
32/40 |
4/8 |
LockPrefixTable |
[только x86] Va в списке адресов, в которых используется префикс LOCK, чтобы их можно было заменить noP на отдельных процессорах. |
36/48 |
4/8 |
MaximumAllocationSize |
Максимальный размер выделения в байтах. |
40/56 |
4/8 |
VirtualMemoryThreshold |
Максимальный размер виртуальной памяти в байтах. |
44/64 |
4/8 |
ProcessAffinityMask |
Задание этого поля ненулевым значением эквивалентно вызову SetProcessAffinityMask с этим значением во время запуска процесса (только .exe). |
48/72 |
4 |
ProcessHeapFlags |
Флаги кучи процесса, соответствующие первому аргументу функции HeapCreate. Эти флаги применяются к куче процесса, созданной во время запуска процесса. |
52/76 |
2 — . |
CSDVersion |
Идентификатор версии пакета обновления. |
54/78 |
2 — . |
ЗависимыеFlags |
Флаги загрузки по умолчанию, используемые при разрешении статического связанного импорта модуля. |
56/80 |
4/8 |
EditList |
Зарезервировано для использования системой. |
60/88 |
4/8 |
SecurityCookie |
Указатель на файл cookie, используемый реализацией Visual C++ или GS. |
64/96 |
4/8 |
SEHandlerTable |
[только x86] Va для отсортированных таблиц RVAs каждого допустимого уникального обработчика SE на изображении. |
68/104 |
4/8 |
SEHandlerCount |
[только x86] Количество уникальных обработчиков в таблице. |
72/112 |
4/8 |
GuardCFCheckFunctionPointer |
Va, в котором хранится указатель на контрольную функцию Flow Guard. |
76/120 |
4/8 |
GuardCFDispatchFunctionPointer |
Va, в котором хранится указатель диспетчера Flow Guard. |
80/128 |
4/8 |
GuardCFFunctionTable |
Va для отсортированных таблиц RVAs каждой функции Control Flow Guard на изображении. |
84/136 |
4/8 |
GuardCFFunctionCount |
Количество уникальных RVAs в приведенной выше таблице. |
88/144 |
4 |
GuardFlags |
Контроль связанных флагов Flow Guard. |
92/148 |
12 |
CodeIntegrity |
Сведения о целостности кода. |
104/160 |
4/8 |
GuardAddressTakenIatEntryTable |
Va, где хранится адрес Control Flow Guard, взятый в таблицу IAT. |
108/168 |
4/8 |
GuardAddressTakenIatEntryCount |
Количество уникальных RVAs в приведенной выше таблице. |
112/176 |
4/8 |
GuardLongJumpTargetTable |
Va, где хранится целевая таблица целевого объекта Flow Guard в течение длительного перехода. |
116/184 |
4/8 |
GuardLongJumpTargetCount |
Количество уникальных RVAs в приведенной выше таблице. |
Поле GuardFlags содержит сочетание одного или нескольких следующих флагов и подфилдов:
Модуль выполняет проверки целостности потока управления с помощью поддержки, предоставленной системой.
#define IMAGE_GUARD_CF_INSTRUMENTED 0x00000100
Модуль выполняет контрольный поток и проверяет целостность записи.
#define IMAGE_GUARD_CFW_INSTRUMENTED 0x00000200
Модуль содержит допустимые метаданные целевого потока управления.
#define IMAGE_GUARD_CF_FUNCTION_TABLE_PRESENT 0x00000400
Модуль не использует файл cookie безопасности /GS.
#define IMAGE_GUARD_SECURITY_COOKIE_UNUSED 0x00000800
Модуль поддерживает только задержку загрузки IAT для чтения.
#define IMAGE_GUARD_PROTECT_DELAYLOAD_IAT 0x00001000
Таблица импорта задержки в собственном разделе .didat (без ничего другого в нем), которая может быть свободно перезащищена.
#define IMAGE_GUARD_DELAYLOAD_IAT_IN_ITS_OWN_SECTION 0x00002000
Модуль содержит отключаемые сведения о экспорте. Это также указывает, что адрес, принятый в таблице IAT, также присутствует в конфигурации загрузки.
#define IMAGE_GUARD_CF_EXPORT_SUPPRESSION_INFO_PRESENT 0x00004000
Модуль обеспечивает подавление экспорта.
#define IMAGE_GUARD_CF_ENABLE_EXPORT_SUPPRESSION 0x00008000
Модуль содержит сведения о целевом объекте longjmp.
#define IMAGE_GUARD_CF_LONGJUMP_TABLE_PRESENT 0x00010000
Маска для подполя, содержащего шаги записей таблицы функций Control Flow Guard (т. е. дополнительное количество байтов на запись таблицы).
#define IMAGE_GUARD_CF_FUNCTION_TABLE_SIZE_MASK 0xF0000000
Кроме того, заголовок winnt.h пакета SDK для Windows определяет этот макрос для количества битов, чтобы изменить значение GuardFlags вправо, чтобы оправдывать таблицу функций Control Flow Guard вправо:
#define IMAGE_GUARD_CF_FUNCTION_TABLE_SIZE_SHIFT 28
Ресурсы индексируются структурой дерева с несколькими уровнями. Общая конструкция может включать уровни 2**31. Однако по соглашению Windows использует три уровня:
- Язык имени типа
Ряд таблиц каталогов ресурсов относится ко всем уровням следующим образом: за каждой таблицей каталогов следует ряд записей каталога, которые дают имя или идентификатор (идентификатор) для этого уровня (тип, имя или уровень языка) и адрес описания данных или другой таблицы каталогов. Если адрес указывает на описание данных, данные являются конечными в дереве. Если адрес указывает на другую таблицу каталогов, эта таблица перечисляет записи каталога на следующем уровне вниз.
Идентификаторы типа, имени и языка листа определяются путем, который выполняется в таблицах каталогов для достижения конечной страницы. Первая таблица определяет идентификатор типа, вторая таблица (указанная записью каталога в первой таблице) определяет идентификатор имени, а третья таблица определяет идентификатор языка.
Общая структура раздела RSRC:
Data | Description |
---|---|
Таблицы каталогов ресурсов (и записи каталога ресурсов) |
Ряд таблиц, по одному для каждой группы узлов в дереве. Все узлы верхнего уровня (тип) перечислены в первой таблице. Записи в этой таблице указывают на таблицы второго уровня. Каждое дерево второго уровня имеет одинаковый идентификатор типа, но разные идентификаторы имен. Деревья третьего уровня имеют одинаковые идентификаторы типов и имен, но разные идентификаторы языка. За каждой отдельной таблицей сразу же следует записи каталога, в которых каждая запись имеет имя или числовый идентификатор, а также указатель на описание данных или таблицу на следующем нижнем уровне. |
Строки каталога ресурсов |
Строки Юникода с двумя байтами, которые служат строковыми данными, указывающими на записи каталога. |
Описание данных ресурса |
Массив записей, указывающих на таблицы, описывающие фактический размер и расположение данных ресурса. Эти записи являются листьями в дереве описания ресурсов. |
Данные ресурсов |
Необработанные данные раздела ресурса. Сведения о размере и расположении в поле "Описания данных ресурсов" разделяют отдельные регионы данных ресурса. |
Каждая таблица каталога ресурсов имеет следующий формат. Эта структура данных должна рассматриваться как заголовок таблицы, так как таблица на самом деле состоит из записей каталога (описанных в разделе 6.9.2, "Записи каталога ресурсов") и этой структуры:
Смещение | Размер | Поле | Description |
---|---|---|---|
0 |
4 |
Характеристики |
Флаги ресурсов. Это поле зарезервировано для дальнейшего использования. В настоящее время оно равно нулю. |
4 |
4 |
Метка времени и даты |
Время создания данных ресурса компилятором ресурсов. |
8 |
2 — . |
Основная версия |
Номер основной версии, заданный пользователем. |
10 |
2 — . |
Дополнительная версия |
Дополнительный номер версии, заданный пользователем. |
12 |
2 — . |
Количество записей имен |
Количество записей каталога сразу после таблицы, которая использует строки для идентификации записей типа, имени или языка (в зависимости от уровня таблицы). |
14 |
2 — . |
Количество записей идентификаторов |
Количество записей каталога сразу после записей Name, использующих числовые идентификаторы для записей type, Name или Language. |
Записи каталога составляют строки таблицы. Каждая запись каталога ресурсов имеет следующий формат. Указывает ли запись имя или запись идентификатора, указанная в таблице каталога ресурсов, которая указывает, сколько записей имени и идентификаторов следует ему (помните, что все записи name предшествуют всем записям идентификатора таблицы). Все записи таблицы сортируются по возрастанию: записи "Имя" по строке с учетом регистра и записи идентификаторов по числовым значениям. Смещения относительно адреса в IMAGE_DIRECTORY_ENTRY_RESOURCE DataDirectory. Дополнительные сведения см . в разделе пиринга внутри PE: обзор формата переносимого исполняемого файла Win32.
Смещение | Размер | Поле | Description |
---|---|---|---|
0 |
4 |
Смещение имени |
Смещение строки, которая предоставляет запись типа, имени или идентификатора языка в зависимости от уровня таблицы. |
0 |
4 |
Идентификатор целочисленного числа |
32-разрядное целое число, определяющее запись типа, имени или идентификатора языка. |
4 |
4 |
Смещение записи данных |
Высокий бит 0. Адрес записи данных ресурса (лист). |
4 |
4 |
Смещение подкаталога |
Высокий бит 1. Ниже 31 бит — адрес другой таблицы каталога ресурсов (следующий уровень вниз). |
Область строки каталога ресурсов состоит из строк Юникода, которые выровнены по словам. Эти строки хранятся вместе после последней записи каталога ресурсов и перед первой записью данных ресурса. Это сводит к минимуму влияние этих строк переменной длины на выравнивание записей каталога фиксированного размера. Каждая строка каталога ресурсов имеет следующий формат:
Смещение | Размер | Поле | Description |
---|---|---|---|
0 |
2 — . |
Длина |
Размер строки, не включая поле длины. |
2 — . |
переменная |
Строка Юникода |
Строковые данные юникода переменной длины, выровненные по слову. |
Каждая запись данных ресурса описывает фактическую единицу необработанных данных в области данных ресурсов. Запись данных ресурсов имеет следующий формат:
Смещение | Размер | Поле | Description |
---|---|---|---|
0 |
4 |
RVA данных |
Адрес единицы данных ресурса в области данных ресурсов. |
4 |
4 |
Размер |
Размер в байтах данных ресурса, на которые указывает поле RVA данных. |
8 |
4 |
Codepage |
Кодовая страница, используемая для декодирования значений точек кода в данных ресурса. Как правило, кодовая страница будет кодовой страницей Юникода. |
12 |
4 |
Зарезервировано, должно быть 0. |
Метаданные СРЕДЫ CLR хранятся в этом разделе. Он используется для указания того, что файл объекта содержит управляемый код. Формат метаданных не документирован, но может передаваться интерфейсам СРЕДЫ CLR для обработки метаданных.
Допустимые обработчики исключений объекта перечислены в разделе SXData этого объекта. Раздел помечается IMAGE_SCN_LNK_INFO. Он содержит индекс символов COFF каждого допустимого обработчика, используя 4 байта на индекс.
Кроме того, компилятор помечает объект COFF как зарегистрированный SEH путем создания абсолютного символа "@feat.00" с LSB поля значения значением 1. Объект COFF без зарегистрированных обработчиков SEH будет иметь символ "@feat.00", но не раздел Sxdata .
- Сигнатура архива файла
- Архив заголовков элементов
- Первый член компоновщика
- Второй элемент компоновщика
- Член Longnames
Формат архива COFF предоставляет стандартный механизм хранения коллекций файлов объектов. Эти коллекции обычно называются библиотеками в документации по программированию.
Первые 8 байт архива состоят из подписи файла. Остальная часть архива состоит из ряда членов архива, как показано ниже.
Первые и второй члены — это "компоновщики". Каждый из этих элементов имеет собственный формат, как описано в разделе "Тип имени импорта". Как правило, компоновщик помещает сведения в эти элементы архива. Элементы компоновщика содержат каталог архива.
Третий элемент — это член longnames. Этот необязательный элемент состоит из ряда строк ASCII, завершаемых null, в которых каждая строка — имя другого элемента архива.
Остальная часть архива состоит из стандартных (object-file) элементов. Каждый из этих элементов содержит содержимое одного файла объекта в целом.
Заголовок элемента архива предшествует каждому элементу. В следующем списке показана общая структура архива:
Подпись :"!<arch>\n" |
---|
Верхний колонтитул |
---|
1-й член компоновщика |
Верхний колонтитул |
---|
2-й член компоновщика |
Верхний колонтитул |
---|
Член Longnames |
Верхний колонтитул |
---|
Содержимое OBJ-файла 1 (формат COFF) |
Верхний колонтитул |
---|
Содержимое OBJ-файла 2 (формат COFF) |
...
Верхний колонтитул |
---|
Содержимое OBJ-файла N (формат COFF) |
Подпись архивного файла определяет тип файла. Любая программа (например, компоновщик), принимающую архивный файл в качестве входных данных, может проверить тип файла, прочитав эту подпись. Подпись состоит из следующих символов ASCII, в которых каждый приведенный ниже символ представлен буквально, за исключением символа newline (\n):
!<arch>\n
Заголовок winnt.h пакета SDK для Windows определяет следующие макросы:
#define IMAGE_ARCHIVE_START_SIZE 8
#define IMAGE_ARCHIVE_START "!<arch>\n"
#define IMAGE_ARCHIVE_END "`\n"
#define IMAGE_ARCHIVE_PAD "\n"
#define IMAGE_ARCHIVE_LINKER_MEMBER "/ "
#define IMAGE_ARCHIVE_LONGNAMES_MEMBER "// "
#define IMAGE_ARCHIVE_HYBRIDMAP_MEMBER "/<HYBRIDMAP>/ "
Перед каждым элементом (компоновщиком, длинными именами или членом файла объекта) предшествует заголовок. Заголовок элемента архива имеет следующий формат, в котором каждое поле является текстовой строкой ASCII, которая остается оправданной и заполненной пробелами в конце поля. В любом из этих полей не существует завершающего символа NULL.
Каждый заголовок элемента начинается с первого даже адреса после окончания предыдущего элемента архива, один байт "\n" (IMAGE_ARCHIVE_PAD) может быть вставлен после того, как элемент архива начнется со следующего элемента.
Смещение | Размер | Поле | Description |
---|---|---|---|
0 |
16 |
Имя |
Имя элемента архива с косой чертой (/) добавлено для завершения имени. Если первый символ является косой чертой, имя имеет специальную интерпретацию, как описано в следующей таблице. |
16 |
12 |
Date |
Дата и время создания элемента архива: это десятичное представление ASCII числа секунд с 1.1.1.1970 UCT. |
28 |
6 . |
Идентификатор пользователя |
Десятичное представление идентификатора пользователя ASCII. Это поле не содержит значимого значения на платформах Windows, так как средства Майкрософт выдают все пустые значения. |
34 |
6 . |
Идентификатор группы |
Десятичное представление идентификатора группы ASCII. Это поле не содержит значимого значения на платформах Windows, так как средства Майкрософт выдают все пустые значения. |
40 |
8 |
Режим |
Восьмеричное представление восьмеричного представления файлового режима члена. Это значение ST_MODE из _wstat функции времени выполнения C. |
48 |
10 |
Размер |
Десятичное представление ASCII общего размера элемента архива, не включая размер заголовка. |
58 |
2 — . |
Конец заголовка |
Два байта (0x60 0x0A) в строке C "\n" (IMAGE_ARCHIVE_END). |
Поле "Имя" имеет один из форматов, показанных в следующей таблице. Как упоминалось ранее, каждая из этих строк остается оправданной и заполнена конечными пробелами в поле размером 16 байт:
Содержимое поля Name | Description |
---|---|
имя/ |
Имя элемента архива. |
/ |
Элемент архива является одним из двух членов компоновщика. Оба члена компоновщика имеют это имя. |
// |
Элемент архива — это член longnames, состоящий из ряда строк ASCII, завершаемых значением NULL. Член longnames является третьим элементом архива и является необязательным. |
/n |
Имя элемента архива находится в смещение n в элементе longnames. Число n — десятичное представление смещения. Например: "/26" указывает, что имя элемента архива находится в 26 байтах за пределами начала содержимого члена longnames. |
Имя первого члена компоновщика — "/" (IMAGE_ARCHIVE_LINKER_MEMBER). Первый член компоновщика включен для обратной совместимости. Он не используется текущими компоновщиками, но его формат должен быть правильным. Этот элемент компоновщика предоставляет каталог имен символов, как и второй элемент компоновщика. Для каждого символа информация указывает, где найти архивный элемент, содержащий символ.
Первый член компоновщика имеет следующий формат. Эти сведения отображаются после заголовка:
Смещение | Размер | Поле | Description |
---|---|---|---|
0 |
4 |
Количество символов |
Без знака, содержащий количество индексированных символов. Это число хранится в формате big-endian. Каждый член файла объекта обычно определяет один или несколько внешних символов. |
4 |
4 * n |
Смещения |
Массив смещения файлов для архивных заголовков элементов, в которых n равно полю "Число символов". Каждое число в массиве является неподписанным длинным, хранящимся в формате big-endian. Для каждого символа, именуемого в строковой таблице, соответствующий элемент в массиве смещения дает расположение элемента архива, содержащего символ. |
* |
* |
Строка таблицы |
Ряд строк, завершающих значение NULL, которые называют все символы в каталоге. Каждая строка начинается сразу после null-символа в предыдущей строке. Число строк должно быть равно значению поля "Число символов". |
Элементы в массиве смещения должны быть упорядочены в порядке возрастания. Этот факт подразумевает, что символы в строковой таблице должны быть упорядочены в соответствии с порядком членов архива. Например, все символы в первом элементе объекта-файла должны быть перечислены перед символами во втором файле объекта.
Как и первый член компоновщика, второй член компоновщика имеет имя "/" (IMAGE_ARCHIVE_LINKER_MEMBER). Хотя оба элемента компоновщика предоставляют каталог символов и архивных элементов, содержащих их, второй член компоновщика используется в предпочтениях ко всем текущим компоновщикам. Второй член компоновщика содержит имена символов в лексическом порядке, что позволяет ускорить поиск по имени.
Второй член имеет следующий формат. Эти сведения отображаются после заголовка:
Смещение | Размер | Поле | Description |
---|---|---|---|
0 |
4 |
Количество членов |
Неподписанный длинный объект, содержащий количество членов архива. |
4 |
4 * м |
Смещения |
Массив смещения файлов к архивным заголовкам элементов, расположенным в порядке возрастания. Каждое смещение является несписанным длинным. Число m равно значению поля "Число членов". |
* |
4 |
Количество символов |
Неподписанный длинный знак, содержащий число индексированных символов. Каждый член файла объекта обычно определяет один или несколько внешних символов. |
* |
2 * n |
Индексы |
Массив 1-х индексов (без знака short), которые сопоставляют имена символов с смещениями элементов архива. Число n равно полю "Число символов". Для каждого символа, именованного в строковой таблице, соответствующий элемент в массиве Indexs предоставляет индекс в массив смещения. Массив смещения, в свою очередь, дает расположение элемента архива, содержащего символ. |
* |
* |
Строка таблицы |
Ряд строк, завершающих значение NULL, которые называют все символы в каталоге. Каждая строка начинается сразу после байта NULL в предыдущей строке. Число строк должно быть равно значению поля "Число символов". В этой таблице перечислены все имена символов в лексическом порядке по возрастанию. |
Имя элемента longnames — "/" (IMAGE_ARCHIVE_LONGNAMES_MEMBER). Член longnames — это ряд строк архивных имен элементов. Имя отображается только в том случае, если в поле "Имя" недостаточно места (16 байт). Член longnames необязателен. Он может быть пустым только с заголовком, или он может быть полностью отсутствует без даже заголовка.
Строки завершаются значением NULL. Каждая строка начинается сразу после байта NULL в предыдущей строке.
Традиционные библиотеки импорта, то есть библиотеки, описывающие экспорты из одного образа для использования другим, обычно следуют макету, описанному в разделе 7, формат файла архива (библиотека). Основное различие заключается в том, что элементы библиотеки импорта содержат псевдо-объектные файлы вместо реальных, в которых каждый член включает в себя вклады раздела, необходимые для создания таблиц импорта, описанных в разделе 6.4, компоновщик .idata Создает этот архив при создании экспортного приложения.
Вклады раздела для импорта можно вывести из небольшого набора сведений. Компоновщик может создавать полные подробные сведения в библиотеку импорта для каждого члена во время создания библиотеки или записывать только канонические сведения в библиотеку и позволить приложению, которое позже использовать его, создайте необходимые данные на лету.
В библиотеке импорта с длинным форматом один член содержит следующие сведения:
- Заголовок элемента архива
- Заголовок файла
- Заголовки разделов
- Данные, соответствующие каждому заголовку раздела
- Таблица символов COFF
- Строки
В отличие от этого, короткая библиотека импорта записывается следующим образом:
- Заголовок элемента архива
- Заголовок импорта
- Строка имени импорта с завершением null
- Строка имени DLL, завершаемой null
Это достаточно информации, чтобы точно восстановить все содержимое элемента во время его использования.
Заголовок импорта содержит следующие поля и смещения:
Смещение | Размер | Поле | Description |
---|---|---|---|
0 |
2 — . |
Sig1 |
Должен быть IMAGE_FILE_MACHINE_UNKNOWN. Дополнительные сведения см. в разделе "Типы компьютеров". |
2 — . |
2 — . |
Sig2 |
Должно быть 0xFFFF. |
4 |
2 — . |
Версия |
Версия структуры. |
6 . |
2 — . |
Машина |
Число, определяющее тип целевого компьютера. Дополнительные сведения см. в разделе "Типы компьютеров". |
8 |
4 |
Метка даты времени |
Время и дата создания файла. |
12 |
4 |
Размер данных |
Размер строк, которые следуют за заголовком. |
16 |
2 — . |
Порядковый номер/подсказка |
Порядковый номер или указание для импорта, определенное значением в поле "Тип имени". |
18 |
2 бита |
Введите . |
Тип импорта. Сведения о конкретных значениях и описаниях см. в разделе "Тип импорта". |
3 бита |
Тип имени |
Тип имени импорта. Дополнительные сведения см. в разделе "Тип имени импорта". |
|
11 бит |
Скрытный |
Зарезервировано, должно быть 0. |
За этой структурой следует две строки, завершающиеся значением NULL, описывающие имя импортированного символа и библиотеку DLL, из которой она была получена.
Для поля Type в заголовке импорта определены следующие значения:
Константа | значение | Описание |
---|---|---|
IMPORT_OBJECT_CODE |
0 |
Исполняемый код. |
IMPORT_OBJECT_DATA |
1 |
Данные. |
IMPORT_OBJECT_CONST |
2 — . |
Указан как CONST в def-файле. |
Эти значения используются для определения того, какие вклады разделов должны создаваться средством, использующим библиотеку, если он должен получить доступ к этим данным.
Имя символа импорта, завершаемого значением NULL, сразу после соответствующего заголовка импорта. Следующие значения определяются для поля "Тип имени" в заголовке импорта. Они указывают, как имя будет использоваться для создания правильных символов, представляющих импорт:
Константа | значение | Описание |
---|---|---|
IMPORT_OBJECT_ORDINAL | 0 | Импорт выполняется по порядковой номеру. Это означает, что значение в поле порядкового или намека заголовка импорта — порядковый номер импорта. Если эта константа не указана, поле порядкового или подсказка всегда должно быть интерпретировано как указание импорта. |
IMPORT_OBJECT_NAME | 1 | Имя импорта идентично имени открытого символа. |
IMPORT_OBJECT_NAME_NOPREFIX | 2 | Имя импорта — это имя открытого символа, но пропускает ведущие символы ?, @или при необходимости _. |
IMPORT_OBJECT_NAME_UNDECORATE | 3 | Имя импорта — это имя открытого символа, но пропускает ведущие символы ?, @, или при необходимости _, и усечение на первом @. |
Ожидается, что для проверки целостности изображений используется несколько сертификатов атрибутов. Однако наиболее распространенной является сигнатура Authenticode. Подпись Authenticode можно использовать для проверки того, что соответствующие разделы файла изображения PE не были изменены каким-либо образом из исходной формы файла. Для выполнения этой задачи подписи Authenticode содержат то, что называется хэшом изображения PE
Хэш изображения Authenticode PE или хэш файла для короткого времени аналогичен контрольной сумме файла, что он создает небольшое значение, связанное с целостностью файла. Контрольная сумма создается простым алгоритмом и используется в основном для обнаружения сбоев памяти. То есть он используется для определения того, поврежден ли блок памяти на диске, и значения, хранящиеся там, повреждены. Хэш файла аналогичен контрольной сумме в том, что он также обнаруживает повреждение файлов. Однако, в отличие от большинства алгоритмов контрольной суммы, очень трудно изменить файл, чтобы он имеет тот же хэш файла, что и исходная (немодифицированная) форма. То есть контрольная сумма предназначена для обнаружения простых сбоев памяти, которые приводят к повреждению, но хэш файла можно использовать для обнаружения преднамеренного и даже тонкого изменения файла, таких как вирусы, хакеры или троянские программы лошади.
В сигнатуре Authenticode хэш файла цифрово подписывается с помощью закрытого ключа, известного только для подписи файла. Потребитель программного обеспечения может проверить целостность файла, вычисляя хэш-значение файла и сравнивая его со значением подписанного хэша, содержащегося в цифровой подписи Authenticode. Если хэши файлов не совпадают, часть файла, доступная хэшом изображения PE, была изменена.
Невозможно или желательно включить все данные файла изображения в вычисление хэша изображения PE. Иногда это просто представляет нежелательные характеристики (например, сведения об отладке нельзя удалить из общедоступных файлов); иногда это просто невозможно. Например, невозможно включить все сведения в файл изображения в сигнатуру Authenticode, а затем вставить подпись Authenticode, содержащую хэш изображения PE, в изображение PE, а затем создать идентичный хэш изображения PE, включив все данные файла изображения в вычисление еще раз, так как файл теперь содержит подпись Authenticode, которая не была первоначально там.
В этом разделе описывается, как вычисляется хэш изображения PE и какие части изображения PE можно изменить без недопустимой подписи Authenticode.
Примечание
Хэш изображения PE для определенного файла можно включить в отдельный файл каталога без включения сертификата атрибута в хэшированного файла. Это важно, так как становится возможным недопустимое хэш изображения PE в файле каталога Authenticode с подписью Authenticode, изменив изображение PE, которое на самом деле не содержит подпись Authenticode.
Все данные в разделах изображения PE, указанные в таблице разделов, хэшируются полностью, за исключением следующих диапазонов исключений:
Поле CheckSum файла полей, относящихся к Windows, необязательного заголовка. Эта контрольная сумма включает весь файл (включая все сертификаты атрибутов в файле). По всей вероятности, контрольная сумма будет отличаться от исходного значения после вставки подписи Authenticode.
Сведения, связанные с сертификатами атрибутов. Области изображения PE, связанные с сигнатурой Authenticode, не включаются в вычисление хэша изображения PE, так как подписи Authenticode можно добавлять или удалять из изображения, не влияя на общую целостность изображения. Это не проблема, так как существуют пользовательские сценарии, зависящие от повторной подписи изображений PE или добавления метки времени. Authenticode исключает следующие сведения из вычисления хэша:
Поле таблицы сертификатов необязательных каталогов данных заголовка.
Таблица сертификатов и соответствующие сертификаты, на которые указывает поле таблицы сертификатов, указанное непосредственно выше.
Чтобы вычислить хэш изображения PE, Authenticode упорядочивает разделы, указанные в таблице разделов по диапазону адресов, а затем хэширует результирующая последовательность байтов, передавая диапазоны исключений.
Сведения о конце последнего раздела. Область после последнего раздела (определяется наивысшим смещением) не хэшируется. Эта область обычно содержит сведения об отладке. Сведения об отладке, как правило, можно рассматривать как рекомендации для отладчиков; Это не влияет на фактическую целостность исполняемой программы. Довольно буквально можно удалить отладочную информацию из образа после доставки продукта и не повлиять на функциональные возможности программы. На самом деле это иногда делается как мера экономии дисков. Следует отметить, что сведения об отладке, содержащиеся в указанных разделах образа PE, нельзя удалить без недопустимой подписи Authenticode.
Средства makecert и signtool, предоставляемые в пакете SDK для платформы Windows, можно использовать для экспериментирования с созданием и проверкой подписей Authenticode. Дополнительные сведения см. в разделе "Справочник" ниже.
Скачивание и средства для Windows (включает пакет SDK для Windows)
Создание, просмотр и управление сертификатами
Пошаговое руководство по подписи кода в режиме ядра (.doc)
Формат переносимой исполняемой подписи Windows Authenticode (.docx)