Составители:
Рубрика:
2.1.6.1. Этап 1. Заполнение заголовка PE-файла
Первый этап включает заполнение структуры HEADERS. Всю работу на
этом этапе выполняет функция make_headers, принимающая блок входных
параметров и файловый дескриптор. Прототип функции:
void make_headers (FILE* file, PINPUT_PARAMETERS inP);
Структура HEADERS включает в себя заголовок MS-DOS, сигнатуру PE,
заголовок PE, дополнительный заголовок PE, директории данных и заго-
ловки секций. Формат структур IMAGE_DATA_DIRECTORY и
IMAGE_SECTION_HEADER, которые входят в структуру HEADERS, можно найти
дальше:
struct HEADERS {
char ms_dos_header[128]; // заголовок MS-DOS
unsigned long signature; // сигнатура PE
struct _IMAGE_FILE_HEADER { // заголовок PE
unsigned short Machine;
unsigned short NumberOfSections;
unsigned long TimeDateStamp;
unsigned long PointerToSymbolTable;
unsigned long NumberOfSymbols;
unsigned short OptionalHeaderSize;
unsigned short Characteristics;
}PeHdr;
struct _IMAGE_OPTIONAL_HEADER {
//Дополнительный заголовок PE
unsigned short Magic;
unsigned char LMajor;
unsigned char LMinor;
unsigned long CodeSize;
unsigned long SizeOfInitializedData;
unsigned long SizeOfUninitializedData;
unsigned long EntryPointRVA;
unsigned long BaseOfCode;
unsigned long BaseOfData;
unsigned long ImageBase;
unsigned long SectionAlignment;
unsigned long FileAlignment;
unsigned short OSMajor;
unsigned short OSMinor;
unsigned short UserMajor;
unsigned short UserMinor;
Структура программных компонентов
55
В модуле генерации определена функция make_file, которая прини-
мает блок входных параметров и дескриптор выходного файла:
void make_file (FILE* file, PINPUT_PARAMETERS inP)
{
make_headers (file, inP); // 1 этап
make_text_section (file, inP); // 2 этап
make_cli_section (file, inP); // 3 этап
make_reloc_section (file, inP); // 4 этап
};
Как видно из приведенного листинга, эта функция вызывает еще че-
тыре функции, поскольку процесс генерации PE файла разбит на четыре
этапа.
Блок входных параметров описывается структурой INPUT_PARAMETERS:
unsigned long Type;
Тип исполняемого файла: exe или dll. Поле может принимать
значения:
EXE_TYPE – выходной файл-exe;
DLL_TYPE – выходной файл-dll.
unsigned char* metadata;
Это поле содержит указатель на область памяти, где находятся
метаданные в бинарном виде.
unsigned char* cilcode;
Указатель на область памяти, где лежит CIL-код методов в би-
нарном виде.
unsigned long SizeOfMetadata;
Размер метаданных.
unsigned long SizeOfCilCode;
Размер CIL-кода методов.
unsigned long ImageBase;
Базовый адрес загрузки.
unsigned long FileAlignment;
Выравнивание секций в файле.
unsigned long EntryPointToken;
Точка входа в сборку (токен метаданных, соответствующий
некоторому статическому методу).
unsigned short Subsystem;
Тип подсистемы Console или Windows GUI. Поле может прини-
мать значения:
IMAGE_SUBSYSTEM_WINDOWS_GUI – подсистема Windows GUI;
IMAGE_SUBSYSTEM_WINDOWS_CUI – подсистема Windows CUI.
Этих входных данных достаточно для генерации сборки .NET.
Подробно рассмотрим каждый этап выполнения программы.
54
CIL и системное программирование в Microsoft .NET
54 CIL и системное программирование в Microsoft .NET Структура программных компонентов 55 В модуле генерации определена функция make_file, которая прини- 2.1.6.1. Этап 1. Заполнение заголовка PE-файла мает блок входных параметров и дескриптор выходного файла: Первый этап включает заполнение структуры HEADERS. Всю работу на void make_file (FILE* file, PINPUT_PARAMETERS inP) этом этапе выполняет функция make_headers, принимающая блок входных { параметров и файловый дескриптор. Прототип функции: make_headers (file, inP); // 1 этап void make_headers (FILE* file, PINPUT_PARAMETERS inP); make_text_section (file, inP); // 2 этап Структура HEADERS включает в себя заголовок MS-DOS, сигнатуру PE, make_cli_section (file, inP); // 3 этап заголовок PE, дополнительный заголовок PE, директории данных и заго- make_reloc_section (file, inP); // 4 этап ловки секций. Формат структур IMAGE_DATA_DIRECTORY и }; IMAGE_SECTION_HEADER, которые входят в структуру HEADERS, можно найти Как видно из приведенного листинга, эта функция вызывает еще че- дальше: тыре функции, поскольку процесс генерации PE файла разбит на четыре struct HEADERS { этапа. char ms_dos_header[128]; // заголовок MS-DOS Блок входных параметров описывается структурой INPUT_PARAMETERS: unsigned long signature; // сигнатура PE unsigned long Type; Тип исполняемого файла: exe или dll. Поле может принимать struct _IMAGE_FILE_HEADER { // заголовок PE значения: unsigned short Machine; EXE_TYPE – выходной файл-exe; unsigned short NumberOfSections; DLL_TYPE – выходной файл-dll. unsigned long TimeDateStamp; unsigned char* metadata; unsigned long PointerToSymbolTable; Это поле содержит указатель на область памяти, где находятся unsigned long NumberOfSymbols; метаданные в бинарном виде. unsigned short OptionalHeaderSize; unsigned char* cilcode; unsigned short Characteristics; Указатель на область памяти, где лежит CIL-код методов в би- }PeHdr; нарном виде. unsigned long SizeOfMetadata; struct _IMAGE_OPTIONAL_HEADER { Размер метаданных. //Дополнительный заголовок PE unsigned long SizeOfCilCode; unsigned short Magic; Размер CIL-кода методов. unsigned char LMajor; unsigned long ImageBase; unsigned char LMinor; Базовый адрес загрузки. unsigned long CodeSize; unsigned long FileAlignment; unsigned long SizeOfInitializedData; Выравнивание секций в файле. unsigned long SizeOfUninitializedData; unsigned long EntryPointToken; unsigned long EntryPointRVA; Точка входа в сборку (токен метаданных, соответствующий unsigned long BaseOfCode; некоторому статическому методу). unsigned long BaseOfData; unsigned short Subsystem; unsigned long ImageBase; Тип подсистемы Console или Windows GUI. Поле может прини- unsigned long SectionAlignment; мать значения: unsigned long FileAlignment; IMAGE_SUBSYSTEM_WINDOWS_GUI – подсистема Windows GUI; unsigned short OSMajor; IMAGE_SUBSYSTEM_WINDOWS_CUI – подсистема Windows CUI. unsigned short OSMinor; Этих входных данных достаточно для генерации сборки .NET. unsigned short UserMajor; Подробно рассмотрим каждый этап выполнения программы. unsigned short UserMinor;
Страницы
- « первая
- ‹ предыдущая
- …
- 32
- 33
- 34
- 35
- 36
- …
- следующая ›
- последняя »