Составители:
Рубрика:
ной программы;
0x0008 – файл не содержит информации о символах исходной
программы;
0x0100 – файл предназначен для исполнения на 32-разрядной
машине.
Если сборка представляет собой динамическую библиотеку, то
дополнительно нужно установить флаг 0x2000.
Таким образом, значение поля Characteristics для exe-файлов
– 0x010E, а для dll-файлов – 0x210E.
Если исполняемый файл не содержит таблицы релокаций, то
дополнительно нужно установить флаг 0x0001.
2.1.3.3. Дополнительный заголовок PE-файла
Дополнительный заголовок PE-файла следует сразу за основным за-
головком. В современной документации он называется «PE Optional
Header». Строго говоря, «optional» означает «необязательный», а не «до-
полнительный». Дело в том, что в объектных файлах этот заголовок дейст-
вительно необязателен, но так как в исполняемых файлах он всегда при-
сутствует, мы будем называть его «дополнительным».
Поля дополнительного заголовка можно разделить на три группы:
• Стандартные поля.
Группа стандартных полей пришла в PE из формата COFF. Они
содержат основную информацию, необходимую для загрузки и
исполнения PE-файла.
• Поля, специфичные для Windows NT.
Эти поля специально предназначены для загрузчика Windows
NT. В формате COFF они изначально не присутствовали.
• Директории данных.
Местонахождение некоторых важных структур данных в образе
загруженного в память PE-файла задается в так называемых ди-
ректориях данных (Data Directories). Каждая директория содер-
жит RVA и размер соответствующей структуры. Всего в допол-
нительном заголовке хранятся 16 директорий данных.
В состав дополнительного заголовка PE-файла входят следующие
стандартные поля:
unsigned short Magic;
Константа, задающая тип PE-файла:
0x010B – 32-разрядный файл;
0x020B – 64-разрядный файл.
Для сборок .NET должно быть установлено значение 0x010B.
char LMajor;
Старшее число версии компоновщика. Для сборок .NET – 6.
Структура программных компонентов
43
При разработке программного обеспечения, выполняющего чтение
PE-файлов, важно не забыть осуществить проверку сигнатуры. Дело в
том, что исполняемые файлы в устаревших форматах также начинаются с
похожего заголовка MS-DOS, после которого располагаются другие сиг-
натуры: «NE» для 16-разрядных приложений Windows, «LE» для виртуаль-
ных драйверов устройств, и даже «LX» для исполняемых файлов OS/2.
2.1.3.2. Заголовок PE-файла
Заголовок PE-файла непосредственно следует за сигнатурой PE-фай-
ла. В современной документации он называется «PE File Header», но в бо-
лее старых текстах можно встретить название «COFF Header».
Заголовок PE-файла состоит из следующих полей:
unsigned short Machine;
Это поле содержит идентификатор процессора, для которого
предназначен исполняемый файл. Для сборок .NET всегда ис-
пользуется значение 0x14c.
unsigned short NumberOfSections;
Задает количество секций в PE-файле. Массив заголовков сек-
ций следует сразу после всех заголовков, и это поле, таким обра-
зом, определяет размер этого массива.
long TimeDateStamp;
Время создания файла. Отсчитывается в секундах от начала 1
января 1970 года по Гринвичу. Самый простой способ получения
времени в этом формате – вызов функции time() из стандарт-
ной библиотеки языка C.
long PointerToSymbolTable;
long NumberOfSymbols;
Эти два поля использовались раньше для организации хранения
отладочной информации внутри COFF-файла. В настоящий
момент они не используются и всегда содержат нули.
unsigned short OptionalHeaderSize;
Задает размер дополнительного заголовка PE-файла, который
следует непосредственно за заголовком PE-файла. Сборки
.NET, как правило, содержат значение 0xE0 в этом поле. Вооб-
ще, наличие этого поля позволяет расширять формат путем до-
бавления новых полей в дополнительный заголовок PE-файла.
unsigned short Characteristics;
Представляет собой комбинацию флагов, задающую характери-
стики исполняемого файла. Для сборок .NET требуется устано-
вить следующий набор флагов:
0x0002 – файл является исполняемым;
0x0004 – файл не содержит информации о номерах строк исход-
42
CIL и системное программирование в Microsoft .NET
42 CIL и системное программирование в Microsoft .NET Структура программных компонентов 43 При разработке программного обеспечения, выполняющего чтение ной программы; PE-файлов, важно не забыть осуществить проверку сигнатуры. Дело в 0x0008 – файл не содержит информации о символах исходной том, что исполняемые файлы в устаревших форматах также начинаются с программы; похожего заголовка MS-DOS, после которого располагаются другие сиг- 0x0100 – файл предназначен для исполнения на 32-разрядной натуры: «NE» для 16-разрядных приложений Windows, «LE» для виртуаль- машине. ных драйверов устройств, и даже «LX» для исполняемых файлов OS/2. Если сборка представляет собой динамическую библиотеку, то дополнительно нужно установить флаг 0x2000. 2.1.3.2. Заголовок PE-файла Таким образом, значение поля Characteristics для exe-файлов Заголовок PE-файла непосредственно следует за сигнатурой PE-фай- – 0x010E, а для dll-файлов – 0x210E. ла. В современной документации он называется «PE File Header», но в бо- Если исполняемый файл не содержит таблицы релокаций, то лее старых текстах можно встретить название «COFF Header». дополнительно нужно установить флаг 0x0001. Заголовок PE-файла состоит из следующих полей: unsigned short Machine; 2.1.3.3. Дополнительный заголовок PE-файла Это поле содержит идентификатор процессора, для которого Дополнительный заголовок PE-файла следует сразу за основным за- предназначен исполняемый файл. Для сборок .NET всегда ис- головком. В современной документации он называется «PE Optional пользуется значение 0x14c. Header». Строго говоря, «optional» означает «необязательный», а не «до- unsigned short NumberOfSections; полнительный». Дело в том, что в объектных файлах этот заголовок дейст- Задает количество секций в PE-файле. Массив заголовков сек- вительно необязателен, но так как в исполняемых файлах он всегда при- ций следует сразу после всех заголовков, и это поле, таким обра- сутствует, мы будем называть его «дополнительным». зом, определяет размер этого массива. Поля дополнительного заголовка можно разделить на три группы: long TimeDateStamp; • Стандартные поля. Время создания файла. Отсчитывается в секундах от начала 1 Группа стандартных полей пришла в PE из формата COFF. Они января 1970 года по Гринвичу. Самый простой способ получения содержат основную информацию, необходимую для загрузки и времени в этом формате – вызов функции time() из стандарт- исполнения PE-файла. ной библиотеки языка C. • Поля, специфичные для Windows NT. long PointerToSymbolTable; Эти поля специально предназначены для загрузчика Windows long NumberOfSymbols; NT. В формате COFF они изначально не присутствовали. Эти два поля использовались раньше для организации хранения • Директории данных. отладочной информации внутри COFF-файла. В настоящий Местонахождение некоторых важных структур данных в образе момент они не используются и всегда содержат нули. загруженного в память PE-файла задается в так называемых ди- unsigned short OptionalHeaderSize; ректориях данных (Data Directories). Каждая директория содер- Задает размер дополнительного заголовка PE-файла, который жит RVA и размер соответствующей структуры. Всего в допол- следует непосредственно за заголовком PE-файла. Сборки нительном заголовке хранятся 16 директорий данных. .NET, как правило, содержат значение 0xE0 в этом поле. Вооб- В состав дополнительного заголовка PE-файла входят следующие ще, наличие этого поля позволяет расширять формат путем до- стандартные поля: бавления новых полей в дополнительный заголовок PE-файла. unsigned short Magic; unsigned short Characteristics; Константа, задающая тип PE-файла: Представляет собой комбинацию флагов, задающую характери- 0x010B – 32-разрядный файл; стики исполняемого файла. Для сборок .NET требуется устано- 0x020B – 64-разрядный файл. вить следующий набор флагов: Для сборок .NET должно быть установлено значение 0x010B. 0x0002 – файл является исполняемым; char LMajor; 0x0004 – файл не содержит информации о номерах строк исход- Старшее число версии компоновщика. Для сборок .NET – 6.
Страницы
- « первая
- ‹ предыдущая
- …
- 26
- 27
- 28
- 29
- 30
- …
- следующая ›
- последняя »