Common Intermediate Language и системное программирование в Microsoft.Net. Макаров А.В - 34 стр.

UptoLike

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;