Поделиться через


Формат 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

  • Заголовки разделов

  • Необработанные данные:

    кодом

    .

    сведения об отладке

    перемещение

Заголовки файлов

Заголовок PE-файла состоит из заглушки Microsoft MS-DOS, подписи PE, заголовка файла COFF и необязательного заголовка. Заголовок файла объекта COFF состоит из заголовка файла COFF и необязательного заголовка. В обоих случаях заголовки файлов следует сразу же заголовками разделов.

Заглушка MS-DOS (только изображение)

Заглушка 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 (объект и изображение)

В начале файла объекта или сразу после подписи файла изображения является стандартным заголовком файла 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
Адрес, относительный к базе образа начального раздела данных при загрузке в память.

Необязательные поля заголовка windows (только изображение)

Следующие 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

Следующие значения, определенные для поля подсистемы необязательного заголовка, определяют, какая подсистема 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.
Характеристики библиотеки DLL

Следующие значения определяются для поля 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 .

Имя раздела в файле изображения никогда не содержит символ $.

Другое содержимое файла

Структуры данных, описанные до сих пор до необязательного заголовка, находятся в фиксированном смещение от начала файла (или из заголовка 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, которые указывают, как следует изменять данные раздела при размещении в файле образа и последующей загрузке в память.

Файлы изображений не содержат переносов 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

Следующие индикаторы типа перемещения определяются для процессоров 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

Для процессоров 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

Для процессоров 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-разрядный относительный адрес из байта после перемещения.
Процессоры SuperH

Для процессоров 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
Перемещение игнорирует режим раздела.

 

Процессоры IBM PowerPC

Для процессоров 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

Для процессоров 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 (IPF)

Следующие индикаторы типов перемещения определяются для семейства процессоров 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

Для процессоров 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

Для процессоров 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 больше не создаются и в будущем не будут использоваться.

Номера строк 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

Таблица символов в этом разделе унаследована от традиционного формата 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++ в разделах отладки.

Вспомогательный формат 1. Определения функций

Запись таблицы символов помечает начало определения функции, если она имеет все из следующих значений: класс хранилища 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 — .
Неиспользованный

 

Вспомогательный формат 2: символы .bf и EF

Для каждого определения функции в таблице символов три элемента описывают начало, конец и количество строк. Каждый из этих символов имеет класс хранилища 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 — .
Неиспользованный

 

Вспомогательный формат 3: слабые внешние

"Слабые внешние" — это механизм для файлов объектов, который позволяет гибко использовать связь во время связи. Модуль может содержать неразрешенный внешний символ (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; Вместо этого используется поле "Общий размер".

Вспомогательный формат 4. Файлы

Этот формат соответствует записи таблицы символов с файлом класса хранилища (103). Само имя символа должно быть .file, и вспомогательной записи, следующей за ней, присваивается имя файла исходного кода.

Смещение Размер Поле Description
0
18
Имя файла
Строка ANSI, которая дает имя исходного файла. Это заполнено значением NULL, если оно меньше максимальной длины.

 

Вспомогательный формат 5. Определения разделов

Этот формат следует записи таблицы символов, определяющей раздел. Такая запись имеет имя символа, которое является именем раздела (например, 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. Раздел 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  .
Компоновщик выбирает наибольшее определение из всех определений для этого символа. Если несколько определений имеют этот размер, выбор между ними является произвольным.

 

Определение токена CLR (только объект)

Этот вспомогательный символ обычно следует 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 и добавляя число символов, умноженных на размер символа.

В начале строки 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 с начала файла на диске. Чтобы перейти ко всем записям сертификата атрибута, выполните следующие действия.

  1. Добавьте значение dwLength первого сертификата атрибута в начальное смещение.
  2. Округление значения от шага 1 до ближайшего 8-байтового числа, чтобы найти смещение записи второго атрибута.
  3. Добавьте значение смещения из шага 2 во вторую запись сертификата атрибута dwLength и округлите до ближайшего 8-байтового числа, чтобы определить смещение записи сертификата третьего атрибута.
  4. Повторите шаг 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, чтобы восстановить все состояние предварительной загрузки.

Специальные разделы

Типичные разделы 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

Следующие значения определяются для битов расширенных характеристик DLL.

Константа значение Описание
IMAGE_DLLCHARACTERISTICS_EX_CET_COMPAT 0x0001 Изображение совместимо с теневым стеком потока управления.
IMAGE_DLLCHARACTERISTICS_EX_FORWARD_CFI_COMPAT 0x0040 Все целевые объекты ветви во всех разделах кода изображения аннотируются с помощью инструкций защиты целостности потока управления вперед, таких как x86 CET-Косвенное отслеживание ветви (IBT) или инструкции по идентификации целевой ветви ARM (BTI). Этот бит не используется Windows.

.debug$F (только объект)

Данные в этом разделе заменены в Visual C++ версии 7.0 и более поздних версий более обширным набором данных, которые создаются в подразделе .debug$S .

Файлы объектов могут содержать разделы .debug$F, содержимое которых — одна или несколько записей FPO_DATA (сведения об упущении указателя кадра). См. раздел "IMAGE_DEBUG_TYPE_FPO" в типе отладки.

Компоновщик распознает эти записи .debug$F . Если создается отладочная информация, компоновщик сортирует записи FPO_DATA по процедуре RVA и создает для них запись каталога отладки.

Компилятор не должен создавать записи FPO для процедур, имеющих стандартный формат кадра.

.debug$S (только объект)

В этом разделе содержатся сведения об отладке Visual C++ (символьная информация).

.debug$P (только объект)

В этом разделе содержатся сведения об отладке Visual C++ (предварительно скомпилированные сведения). Эти типы являются общими для всех объектов, скомпилированных с помощью предварительно скомпилированного заголовка, созданного с помощью этого объекта.

.debug$T (только объект)

В этом разделе содержатся сведения об отладке Visual C++ (сведения о типе).

Поддержка компоновщика для сведений об отладке Майкрософт

Для поддержки сведений об отладке компоновщик:

  • Собирает все соответствующие данные отладки из разделов .debug$F, debug$S, .debug$P и .debug$T.

  • Обрабатывает эти данные вместе с данными отладки, созданными компоновщиком, в PDB-файл, и создает запись каталога отладки для ссылки на нее.

Раздел drectve (только объект)

Раздел — это раздел директивы, если он имеет флаг IMAGE_SCN_LNK_INFO в заголовке раздела и имеет имя раздела DRECTVE . Компоновщик удаляет раздел DRECTVE после обработки сведений, поэтому раздел не отображается в связанном файле изображения.

Раздел drectve состоит из строки текста, которая может быть закодирована как ANSI или UTF-8. Если маркер порядка байтов UTF-8 (BOM, трехбайтовый префикс, состоящий из 0xEF, 0xBB и 0xBF), строка директив интерпретируется как ANSI. Строка директив — это ряд параметров компоновщика, разделенных пробелами. Каждый параметр содержит дефис, имя параметра и любой соответствующий атрибут. Если параметр содержит пробелы, параметр должен быть заключен в кавычки. Раздел drectve не должен иметь перемещений или номеров строк.

Раздел .edata (только изображение)

Раздел данных экспорта с именем .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, переменной длины.

Раздел idata

Все файлы изображений, импортируемые символами, включая практически все исполняемые файлы (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

Раздел 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 сведений о очистке.

 

Раздел reloc (только изображение)

Базовая таблица перемещений содержит записи для всех базовых перемещений на изображении. Поле базовой таблицы перемещений в необязательных каталогах данных заголовка дает количество байтов в базовой таблице перемещений. Дополнительные сведения см. в дополнительных каталогах данных заголовков (только изображения). Базовая таблица перемещений делится на блоки. Каждый блок представляет базовые перемещения для страницы 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

Раздел .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, выполнив следующие действия.

  1. Во время ссылки компоновщик задает поле "Адрес индекса" каталога TLS. Это поле указывает на расположение, в котором программа ожидает получения индекса TLS.

    Библиотека времени выполнения Майкрософт упрощает этот процесс, определяя образ памяти каталога TLS и предоставляя ему специальное имя "__tls_used" (платформы Intel x86) или "_tls_used" (другие платформы). Компоновщик ищет этот образ памяти и использует данные там для создания каталога TLS. Другие компиляторы, поддерживающие TLS и работающие с компоновщиком Майкрософт, должны использовать этот же метод.

  2. При создании потока загрузчик передает адрес массива TLS потока, помещая адрес блока среды потока (TEB) в регистр FS. Указатель на массив TLS находится в смещение 0x2C с начала TEB. Такое поведение зависит от Intel x86.

  3. Загрузчик назначает значение индекса TLS месту, указанному полем "Адрес индекса".

  4. Исполняемый код извлекает индекс TLS, а также расположение массива TLS.

  5. В коде используется индекс TLS и расположение массива TLS (умножение индекса на 4 и его использование в качестве смещения к массиву) для получения адреса области данных TLS для заданной программы и модуля. Каждый поток имеет собственную область данных TLS, но это прозрачно для программы, которая не должна знать, как выделены данные для отдельных потоков.

  6. Доступ к отдельному объекту данных TLS осуществляется в виде фиксированного смещения в область данных TLS.

Массив TLS — это массив адресов, которые система поддерживает для каждого потока. Каждый адрес в этом массиве предоставляет расположение данных TLS для заданного модуля (EXE или DLL) в программе. Индекс TLS указывает, какой элемент массива следует использовать. Индекс — это число (понятное только для системы), определяющее модуль.

Каталог 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 для поддержки дополнительной инициализации и завершения для объектов данных 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

Раздел RSRC

Ресурсы индексируются структурой дерева с несколькими уровнями. Общая конструкция может включать уровни 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.

 

Раздел .cormeta (только объект)

Метаданные СРЕДЫ CLR хранятся в этом разделе. Он используется для указания того, что файл объекта содержит управляемый код. Формат метаданных не документирован, но может передаваться интерфейсам СРЕДЫ CLR для обработки метаданных.

Раздел SXDATA

Допустимые обработчики исключений объекта перечислены в разделе SXData этого объекта. Раздел помечается IMAGE_SCN_LNK_INFO. Он содержит индекс символов COFF каждого допустимого обработчика, используя 4 байта на индекс.

Кроме того, компилятор помечает объект COFF как зарегистрированный SEH путем создания абсолютного символа "@feat.00" с LSB поля значения значением 1. Объект COFF без зарегистрированных обработчиков SEH будет иметь символ "@feat.00", но не раздел Sxdata .

Формат файла архива (библиотека)

Формат архива 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

Имя элемента 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 Имя импорта — это имя открытого символа, но пропускает ведущие символы ?, @, или при необходимости _, и усечение на первом @.

Приложение A. Вычисление хэша изображения Authenticode PE

Ожидается, что для проверки целостности изображений используется несколько сертификатов атрибутов. Однако наиболее распространенной является сигнатура Authenticode. Подпись Authenticode можно использовать для проверки того, что соответствующие разделы файла изображения PE не были изменены каким-либо образом из исходной формы файла. Для выполнения этой задачи подписи Authenticode содержат то, что называется хэшом изображения PE

Что такое хэш изображения Authenticode PE?

Хэш изображения Authenticode PE или хэш файла для короткого времени аналогичен контрольной сумме файла, что он создает небольшое значение, связанное с целостностью файла. Контрольная сумма создается простым алгоритмом и используется в основном для обнаружения сбоев памяти. То есть он используется для определения того, поврежден ли блок памяти на диске, и значения, хранящиеся там, повреждены. Хэш файла аналогичен контрольной сумме в том, что он также обнаруживает повреждение файлов. Однако, в отличие от большинства алгоритмов контрольной суммы, очень трудно изменить файл, чтобы он имеет тот же хэш файла, что и исходная (немодифицированная) форма. То есть контрольная сумма предназначена для обнаружения простых сбоев памяти, которые приводят к повреждению, но хэш файла можно использовать для обнаружения преднамеренного и даже тонкого изменения файла, таких как вирусы, хакеры или троянские программы лошади.

В сигнатуре Authenticode хэш файла цифрово подписывается с помощью закрытого ключа, известного только для подписи файла. Потребитель программного обеспечения может проверить целостность файла, вычисляя хэш-значение файла и сравнивая его со значением подписанного хэша, содержащегося в цифровой подписи Authenticode. Если хэши файлов не совпадают, часть файла, доступная хэшом изображения PE, была изменена.

Что такое хэш изображения Authenticode PE?

Невозможно или желательно включить все данные файла изображения в вычисление хэша изображения PE. Иногда это просто представляет нежелательные характеристики (например, сведения об отладке нельзя удалить из общедоступных файлов); иногда это просто невозможно. Например, невозможно включить все сведения в файл изображения в сигнатуру Authenticode, а затем вставить подпись Authenticode, содержащую хэш изображения PE, в изображение PE, а затем создать идентичный хэш изображения PE, включив все данные файла изображения в вычисление еще раз, так как файл теперь содержит подпись Authenticode, которая не была первоначально там.

Процесс создания хэша образа Authenticode PE

В этом разделе описывается, как вычисляется хэш изображения 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)

SignTool

Формат переносимой исполняемой подписи Windows Authenticode (.docx)

Функции ImageHlp