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

UptoLike

// Заголовок .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. Директория таблицы адресов импорта.