Составители:
Рубрика:
// Заголовок .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
- …
- следующая ›
- последняя »
