Составители:
Рубрика:
// Заголовок .text секции
struct IMAGE_SECTION_HEADER TEXT_SECTION;
// Заголовок .cli секции
struct IMAGE_SECTION_HEADER CLI_SECTION;
// Заголовок .reloc секции
struct IMAGE_SECTION_HEADER RELOC_SECTION;
};
struct IMAGE_DATA_DIRECTORY { // Директория данных
unsigned long RVA;
unsigned long Size;
};
struct IMAGE_SECTION_HEADER { // Заголовок секции
unsigned char Name[8];
unsigned long VirtualSize;
unsigned long VirtualAddress;
unsigned long SizeOfRawData;
unsigned long PointerToRawData;
unsigned long PointerToRelocations;
unsigned long PointerToLinenumbers;
unsigned short NumberOfRelocations;
unsigned short NumberOfLinenumbers;
unsigned long Characteristics;
};
В свою очередь функция make_headers вызывает функцию
make_headers_const, которая заполняет поля-константы, одинаковые во
всех сборках.
Для нашего учебного примера выберем расположение секции в фай-
ле, указанное на рис. 2.6.
Как можно заметить, сгенерированная сборка .NET состоит из 3 секций:
1. Секция «.text» (содержит тела методов и метаданные);
2. Секция «.cli» (содержит точку входа, заголовок CLI, таблицу им-
порта);
3. Секция «.reloc» (секция релокаций).
Следовательно, после дополнительного заголовка в структуре HEADERS
будут находиться 3 заголовка секций.
Для сборок .NET необходимы 4 директории данных:
1. Директория импорта;
2. Директория релокации;
3. Директория заголовка CLI;
4. Директория таблицы адресов импорта.
Структура программных компонентов
57
unsigned short SubsysMajor;
unsigned short SubsysMinor;
unsigned long Reserved;
unsigned long ImageSize;
unsigned long HeaderSize;
unsigned long FileCheckSum;
unsigned short Subsystem;
unsigned short DllFlags;
unsigned long StackReserveSize;
unsigned long StackCommitSize;
unsigned long HeapReserveSize;
unsigned long HeapCommitSize;
unsigned long LoaderFlags;
unsigned long NumberOfDataDirectories;
}OptHdr;
// Поле не используется в сборках. Заполняется нулями
struct IMAGE_DATA_DIRECTORY STUB1;
// Директория импорта
struct IMAGE_DATA_DIRECTORY IMPORT_DIRECTORY;
// Поле не используется в сборках. Заполняется нулями
struct IMAGE_DATA_DIRECTORY STUB2[3];
// Директория релокации
struct IMAGE_DATA_DIRECTORY BASE_RELOC_DIRECTORY;
// Поле не используется в сборках. Заполняется нулями
struct IMAGE_DATA_DIRECTORY STUB3[6];
// Директория таблицы адресов импорта
struct IMAGE_DATA_DIRECTORY IAT_DIRECTORY;
// Поле не используется в сборках. Заполняется нулями
struct IMAGE_DATA_DIRECTORY STUB4;
// Директория заголовка CLI
struct IMAGE_DATA_DIRECTORY CLI_DIRECTORY;
// Поле не используется в сборках. Заполняется нулями
struct IMAGE_DATA_DIRECTORY STUB5;
56
CIL и системное программирование в Microsoft .NET
56 CIL и системное программирование в Microsoft .NET Структура программных компонентов 57 unsigned short SubsysMajor; // Заголовок .text секции unsigned short SubsysMinor; struct IMAGE_SECTION_HEADER TEXT_SECTION; unsigned long Reserved; // Заголовок .cli секции unsigned long ImageSize; struct IMAGE_SECTION_HEADER CLI_SECTION; unsigned long HeaderSize; // Заголовок .reloc секции unsigned long FileCheckSum; struct IMAGE_SECTION_HEADER RELOC_SECTION; unsigned short Subsystem; }; unsigned short DllFlags; unsigned long StackReserveSize; struct IMAGE_DATA_DIRECTORY { // Директория данных unsigned long StackCommitSize; unsigned long RVA; unsigned long HeapReserveSize; unsigned long Size; unsigned long HeapCommitSize; }; unsigned long LoaderFlags; unsigned long NumberOfDataDirectories; struct IMAGE_SECTION_HEADER { // Заголовок секции }OptHdr; unsigned char Name[8]; unsigned long VirtualSize; // Поле не используется в сборках. Заполняется нулями unsigned long VirtualAddress; struct IMAGE_DATA_DIRECTORY STUB1; unsigned long SizeOfRawData; unsigned long PointerToRawData; // Директория импорта unsigned long PointerToRelocations; struct IMAGE_DATA_DIRECTORY IMPORT_DIRECTORY; unsigned long PointerToLinenumbers; unsigned short NumberOfRelocations; // Поле не используется в сборках. Заполняется нулями unsigned short NumberOfLinenumbers; struct IMAGE_DATA_DIRECTORY STUB2[3]; unsigned long Characteristics; }; // Директория релокации В свою очередь функция make_headers вызывает функцию struct IMAGE_DATA_DIRECTORY BASE_RELOC_DIRECTORY; make_headers_const, которая заполняет поля-константы, одинаковые во всех сборках. // Поле не используется в сборках. Заполняется нулями Для нашего учебного примера выберем расположение секции в фай- struct IMAGE_DATA_DIRECTORY STUB3[6]; ле, указанное на рис. 2.6. Как можно заметить, сгенерированная сборка .NET состоит из 3 секций: // Директория таблицы адресов импорта 1. Секция «.text» (содержит тела методов и метаданные); struct IMAGE_DATA_DIRECTORY IAT_DIRECTORY; 2. Секция «.cli» (содержит точку входа, заголовок CLI, таблицу им- порта); // Поле не используется в сборках. Заполняется нулями 3. Секция «.reloc» (секция релокаций). struct IMAGE_DATA_DIRECTORY STUB4; Следовательно, после дополнительного заголовка в структуре HEADERS будут находиться 3 заголовка секций. // Директория заголовка CLI Для сборок .NET необходимы 4 директории данных: struct IMAGE_DATA_DIRECTORY CLI_DIRECTORY; 1. Директория импорта; 2. Директория релокации; // Поле не используется в сборках. Заполняется нулями 3. Директория заголовка CLI; struct IMAGE_DATA_DIRECTORY STUB5; 4. Директория таблицы адресов импорта.
Страницы
- « первая
- ‹ предыдущая
- …
- 33
- 34
- 35
- 36
- 37
- …
- следующая ›
- последняя »