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

UptoLike

Hdr.TEXT_SECTION.SizeOfRawData = SIZEOF_TEXT(inP);
Hdr.TEXT_SECTION.PointerToRawData = SIZEOF_HEADERS(inP);
//END of initializing TEXT section
//.cli section
memset(Hdr.CLI_SECTION.Name, 0, sizeof(Hdr.CLI_SECTION.Name));
strcpy((char*)Hdr.CLI_SECTION.Name, “.cli”);
Hdr.CLI_SECTION.VirtualSize = SIZEOF_CLI_NOTALIGNED;
Hdr.CLI_SECTION.VirtualAddress = SIZEOF_HEADERS_M(inP) +
SIZEOF_TEXT_M(inP);
Hdr.CLI_SECTION.SizeOfRawData = SIZEOF_CLI(inP);
Hdr.CLI_SECTION.PointerToRawData = SIZEOF_HEADERS(inP) +
SIZEOF_TEXT(inP);
//END of initializing CLI section
//.RELOC section
memset(Hdr.RELOC_SECTION.Name, 0, sizeof(Hdr.RELOC_SECTION.Name));
strcpy((char*)Hdr.RELOC_SECTION.Name, “.reloc”);
Hdr.RELOC_SECTION.VirtualSize = SIZEOF_RELOC_NOTALIGNED;
Hdr.RELOC_SECTION.VirtualAddress = RVA_OF_RELOC(inP);
Hdr.RELOC_SECTION.SizeOfRawData = SIZEOF_RELOC(inP);
Hdr.RELOC_SECTION.PointerToRawData = SIZEOF_HEADERS(inP) +
SIZEOF_TEXT(inP) + SIZEOF_CLI(inP);
//END of initializing .RELOC section
image = malloc(SIZEOF_HEADERS(inP));
memset(image,0,SIZEOF_HEADERS(inP));
memcpy(image,(char *)&Hdr, SIZEOF_HEADERS_NOTALIGNED);
fwrite(image,1,SIZEOF_HEADERS(inP),file);
free(image);
};
// initialize .TEXT section
void make_text_section(FILE * file, PINPUT_PARAMETERS inP) {
char * image;
image = malloc(SIZEOF_TEXT(inP));
memset(image, 0, SIZEOF_TEXT(inP));
memcpy(image, inP->metadata, inP->SizeOfMetadata);
Исходный код программы pegen
285
if(inP->Type == EXE_TYPE)
Hdr.PeHdr.Characteristics = 0x010E;
else
Hdr.PeHdr.Characteristics = 0x210E;
Hdr.OptHdr.CodeSize = SIZEOF_TEXT_M(inP);
Hdr.OptHdr.SizeOfInitializedData = SIZEOF_TEXT_M(inP);
Hdr.OptHdr.EntryPointRVA = RVA_OF_CLI(inP);
Hdr.OptHdr.BaseOfCode = RVA_OF_TEXT;
Hdr.OptHdr.BaseOfData = 0;
Hdr.OptHdr.ImageBase = inP->ImageBase;
Hdr.OptHdr.FileAlignment = inP->FileAlignment;
Hdr.OptHdr.ImageSize = RVA_OF_RELOC(inP) + SIZEOF_RELOC_M;
Hdr.OptHdr.HeaderSize = SIZEOF_HEADERS(inP);
Hdr.OptHdr.Subsystem = inP->Subsystem;
// Import Directory
Hdr.IMPORT_DIRECTORY.RVA = RVA_OF_CLI(inP) +
OFFSETOF(struct CLI_SECTION_IMAGE,
IMPORT_TABLE.ImportLookupTableRVA);
Hdr.IMPORT_DIRECTORY.Size = 0x53;
// Import Address Directory
Hdr.IAT_DIRECTORY.RVA = RVA_OF_CLI(inP) +
OFFSETOF(struct CLI_SECTION_IMAGE,
IMPORT_TABLE.HintNameTableRVA2);
Hdr.IAT_DIRECTORY.Size = 0x08;
// Base Reloc Directory
Hdr.BASE_RELOC_DIRECTORY.RVA = RVA_OF_RELOC(inP);
Hdr.BASE_RELOC_DIRECTORY.Size = 0x0C;
// CLI Directory
Hdr.CLI_DIRECTORY.RVA = RVA_OF_CLI(inP) + SIZEOF_JMP_STUB;
Hdr.CLI_DIRECTORY.Size = SIZEOF_CLI_HEADER;
//TEXT section
memset(Hdr.TEXT_SECTION.Name, 0, sizeof(Hdr.TEXT_SECTION.Name));
strcpy((char*)Hdr.TEXT_SECTION.Name, “.text”);
Hdr.TEXT_SECTION.VirtualSize = SIZEOF_TEXT_NOTALIGNED(inP);
Hdr.TEXT_SECTION.VirtualAddress = SIZEOF_HEADERS_M(inP);
284
CIL и системное программирование в Microsoft .NET
284                        CIL и системное программирование в Microsoft .NET   Исходный код программы pegen                                              285


      if(inP->Type == EXE_TYPE)                                                          Hdr.TEXT_SECTION.SizeOfRawData   = SIZEOF_TEXT(inP);
        Hdr.PeHdr.Characteristics = 0x010E;                                              Hdr.TEXT_SECTION.PointerToRawData = SIZEOF_HEADERS(inP);
      else                                                                               //END of initializing TEXT section
        Hdr.PeHdr.Characteristics = 0x210E;
                                                                                         //.cli section
      Hdr.OptHdr.CodeSize = SIZEOF_TEXT_M(inP);                                          memset(Hdr.CLI_SECTION.Name, 0, sizeof(Hdr.CLI_SECTION.Name));
      Hdr.OptHdr.SizeOfInitializedData = SIZEOF_TEXT_M(inP);                             strcpy((char*)Hdr.CLI_SECTION.Name, “.cli”);
      Hdr.OptHdr.EntryPointRVA = RVA_OF_CLI(inP);
      Hdr.OptHdr.BaseOfCode = RVA_OF_TEXT;                                               Hdr.CLI_SECTION.VirtualSize      = SIZEOF_CLI_NOTALIGNED;
      Hdr.OptHdr.BaseOfData = 0;                                                         Hdr.CLI_SECTION.VirtualAddress    = SIZEOF_HEADERS_M(inP) +
      Hdr.OptHdr.ImageBase = inP->ImageBase;                                                                  SIZEOF_TEXT_M(inP);
      Hdr.OptHdr.FileAlignment = inP->FileAlignment;                                     Hdr.CLI_SECTION.SizeOfRawData     = SIZEOF_CLI(inP);
      Hdr.OptHdr.ImageSize = RVA_OF_RELOC(inP) + SIZEOF_RELOC_M;                         Hdr.CLI_SECTION.PointerToRawData = SIZEOF_HEADERS(inP) +
      Hdr.OptHdr.HeaderSize = SIZEOF_HEADERS(inP);                                                            SIZEOF_TEXT(inP);
      Hdr.OptHdr.Subsystem = inP->Subsystem;                                             //END of initializing CLI section

      // Import Directory                                                                //.RELOC section
      Hdr.IMPORT_DIRECTORY.RVA    = RVA_OF_CLI(inP) +                                    memset(Hdr.RELOC_SECTION.Name, 0, sizeof(Hdr.RELOC_SECTION.Name));
        OFFSETOF(struct CLI_SECTION_IMAGE,                                               strcpy((char*)Hdr.RELOC_SECTION.Name, “.reloc”);
          IMPORT_TABLE.ImportLookupTableRVA);
      Hdr.IMPORT_DIRECTORY.Size         = 0x53;                                          Hdr.RELOC_SECTION.VirtualSize      = SIZEOF_RELOC_NOTALIGNED;
                                                                                         Hdr.RELOC_SECTION.VirtualAddress = RVA_OF_RELOC(inP);
       // Import Address Directory                                                       Hdr.RELOC_SECTION.SizeOfRawData   = SIZEOF_RELOC(inP);
       Hdr.IAT_DIRECTORY.RVA    = RVA_OF_CLI(inP) +                                      Hdr.RELOC_SECTION.PointerToRawData = SIZEOF_HEADERS(inP) +
         OFFSETOF(struct CLI_SECTION_IMAGE,                                                                   SIZEOF_TEXT(inP) + SIZEOF_CLI(inP);
      IMPORT_TABLE.HintNameTableRVA2);                                                   //END of initializing .RELOC section
       Hdr.IAT_DIRECTORY.Size          = 0x08;
                                                                                         image = malloc(SIZEOF_HEADERS(inP));
      // Base Reloc Directory
      Hdr.BASE_RELOC_DIRECTORY.RVA = RVA_OF_RELOC(inP);                                  memset(image,0,SIZEOF_HEADERS(inP));
      Hdr.BASE_RELOC_DIRECTORY.Size      = 0x0C;                                         memcpy(image,(char *)&Hdr, SIZEOF_HEADERS_NOTALIGNED);
                                                                                         fwrite(image,1,SIZEOF_HEADERS(inP),file);
      // CLI Directory                                                                   free(image);
      Hdr.CLI_DIRECTORY.RVA     = RVA_OF_CLI(inP) + SIZEOF_JMP_STUB;                };
      Hdr.CLI_DIRECTORY.Size    = SIZEOF_CLI_HEADER;
                                                                                    // initialize .TEXT section
      //TEXT section                                                                void make_text_section(FILE * file, PINPUT_PARAMETERS inP) {
      memset(Hdr.TEXT_SECTION.Name, 0, sizeof(Hdr.TEXT_SECTION.Name));                char * image;
      strcpy((char*)Hdr.TEXT_SECTION.Name, “.text”);
                                                                                         image = malloc(SIZEOF_TEXT(inP));
      Hdr.TEXT_SECTION.VirtualSize    = SIZEOF_TEXT_NOTALIGNED(inP);                     memset(image, 0, SIZEOF_TEXT(inP));
      Hdr.TEXT_SECTION.VirtualAddress   = SIZEOF_HEADERS_M(inP);                         memcpy(image, inP->metadata, inP->SizeOfMetadata);