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

UptoLike

cls.IMPORT_TABLE.ImportAddressTableRVA = RVA_OF_CLI(inP) +
OFFSETOF(struct CLI_SECTION_IMAGE,
IMPORT_TABLE.HintNameTableRVA2);
memset(cls.IMPORT_TABLE.zero, 0, 20);
cls.IMPORT_TABLE.HintNameTableRVA1 = (RVA_OF_CLI(inP) +
OFFSETOF(struct CLI_SECTION_IMAGE, IMPORT_TABLE.Hint)) ;
cls.IMPORT_TABLE.zero1 = 0;
cls.IMPORT_TABLE.HintNameTableRVA2 = (RVA_OF_CLI(inP) +
OFFSETOF(struct CLI_SECTION_IMAGE, IMPORT_TABLE.Hint));
cls.IMPORT_TABLE.zero2 = 0;
cls.IMPORT_TABLE.Hint = 0;
if(inP->Type == EXE_TYPE)
strcpy(cls.IMPORT_TABLE.Name, “_CorExeMain”);
else
strcpy(cls.IMPORT_TABLE.Name, “_CorDllMain”);
strcpy(cls.IMPORT_TABLE.DllName, “mscoree.dll”);
image = malloc(SIZEOF_CLI(inP));
memset(image, 0, SIZEOF_CLI(inP));
memcpy(image, (char *) &cls, SIZEOF_CLI_NOTALIGNED);
fwrite(image,1, SIZEOF_CLI(inP),file);
free(image);
};
// initialize .RELOC section
void make_reloc_section(FILE* file, PINPUT_PARAMETERS inP) {
struct RELOC_SECTION rls;
char * image;
rls.PageRVA = RVA_OF_CLI(inP);
rls.BlockSize = SIZEOF_RELOC_NOTALIGNED;
rls.TypeOffset = TYPE_OFFSET(0x3,0x2);
rls.Padding = 0;
Исходный код программы pegen
287
memcpy(image+inP->SizeOfMetadata, inP->cilcode,
inP->SizeOfCilCode);
fwrite(image, 1, SIZEOF_TEXT(inP), file);
free(image);
}
// initialize .CLI section
void make_cli_section(FILE * file, PINPUT_PARAMETERS inP) {
struct CLI_SECTION_IMAGE cls;
char * image;
//JMP_STUB
cls.JMP_STUB.JmpInstruction = 0x25FF;
cls.JMP_STUB.JmpAddress = RVA_OF_CLI(inP) +
OFFSETOF(struct CLI_SECTION_IMAGE, IMPORT_TABLE.Hint) +
inP->ImageBase;
//CLI_HEADER
cls.CLI_HEADER.cb = SIZEOF_CLI_HEADER;
cls.CLI_HEADER.MajorRuntimeVersion = 2;
cls.CLI_HEADER.MinorRuntimeVersion = 0;
cls.CLI_HEADER.MetaData.RVA = RVA_OF_TEXT;
cls.CLI_HEADER.MetaData.Size = inP->SizeOfMetadata;
cls.CLI_HEADER.Flags = 1;
cls.CLI_HEADER.EntryPointToken = inP->EntryPointToken;
memset(cls.CLI_HEADER.NotUsed, 0,
6*sizeof(struct IMAGE_DATA_DIRECTORY));
//Import Table
cls.IMPORT_TABLE.ImportLookupTableRVA = RVA_OF_CLI(inP) +
OFFSETOF(struct CLI_SECTION_IMAGE,
IMPORT_TABLE.HintNameTableRVA1);
cls.IMPORT_TABLE.TimeDateStamp = 0;
cls.IMPORT_TABLE.ForwarderChain = 0;
cls.IMPORT_TABLE.NameRVA = RVA_OF_CLI(inP) +
OFFSETOF(struct CLI_SECTION_IMAGE, IMPORT_TABLE.DllName);
286
CIL и системное программирование в Microsoft .NET
286                           CIL и системное программирование в Microsoft .NET   Исходный код программы pegen                                           287


          memcpy(image+inP->SizeOfMetadata, inP->cilcode,                                   cls.IMPORT_TABLE.ImportAddressTableRVA = RVA_OF_CLI(inP) +
            inP->SizeOfCilCode);                                                              OFFSETOF(struct CLI_SECTION_IMAGE,
                                                                                              IMPORT_TABLE.HintNameTableRVA2);
          fwrite(image, 1, SIZEOF_TEXT(inP), file);
          free(image);                                                                      memset(cls.IMPORT_TABLE.zero, 0, 20);
      }
                                                                                            cls.IMPORT_TABLE.HintNameTableRVA1 = (RVA_OF_CLI(inP) +
      // initialize .CLI section                                                              OFFSETOF(struct CLI_SECTION_IMAGE, IMPORT_TABLE.Hint)) ;
      void make_cli_section(FILE * file, PINPUT_PARAMETERS inP) {
        struct CLI_SECTION_IMAGE cls;                                                       cls.IMPORT_TABLE.zero1 = 0;
        char * image;
                                                                                            cls.IMPORT_TABLE.HintNameTableRVA2 = (RVA_OF_CLI(inP) +
          //JMP_STUB                                                                          OFFSETOF(struct CLI_SECTION_IMAGE, IMPORT_TABLE.Hint));
          cls.JMP_STUB.JmpInstruction = 0x25FF;
                                                                                            cls.IMPORT_TABLE.zero2 = 0;
          cls.JMP_STUB.JmpAddress   = RVA_OF_CLI(inP) +
            OFFSETOF(struct CLI_SECTION_IMAGE, IMPORT_TABLE.Hint) +                         cls.IMPORT_TABLE.Hint = 0;
            inP->ImageBase;
                                                                                            if(inP->Type == EXE_TYPE)
          //CLI_HEADER                                                                        strcpy(cls.IMPORT_TABLE.Name, “_CorExeMain”);
          cls.CLI_HEADER.cb            = SIZEOF_CLI_HEADER;                                 else
          cls.CLI_HEADER.MajorRuntimeVersion    = 2;                                          strcpy(cls.IMPORT_TABLE.Name, “_CorDllMain”);
          cls.CLI_HEADER.MinorRuntimeVersion    = 0;
          cls.CLI_HEADER.MetaData.RVA       = RVA_OF_TEXT;                                  strcpy(cls.IMPORT_TABLE.DllName, “mscoree.dll”);
          cls.CLI_HEADER.MetaData.Size       = inP->SizeOfMetadata;
          cls.CLI_HEADER.Flags           = 1;                                               image = malloc(SIZEOF_CLI(inP));
          cls.CLI_HEADER.EntryPointToken      = inP->EntryPointToken;                       memset(image, 0, SIZEOF_CLI(inP));
                                                                                            memcpy(image, (char *) &cls, SIZEOF_CLI_NOTALIGNED);
          memset(cls.CLI_HEADER.NotUsed, 0,                                                 fwrite(image,1, SIZEOF_CLI(inP),file);
             6*sizeof(struct IMAGE_DATA_DIRECTORY));                                        free(image);
                                                                                       };
          //Import Table
          cls.IMPORT_TABLE.ImportLookupTableRVA     = RVA_OF_CLI(inP) +                // initialize .RELOC section
            OFFSETOF(struct CLI_SECTION_IMAGE,                                         void make_reloc_section(FILE* file, PINPUT_PARAMETERS inP) {
            IMPORT_TABLE.HintNameTableRVA1);                                             struct RELOC_SECTION rls;
                                                                                         char * image;
          cls.IMPORT_TABLE.TimeDateStamp    = 0;
          cls.IMPORT_TABLE.ForwarderChain    = 0;                                           rls.PageRVA   = RVA_OF_CLI(inP);
                                                                                            rls.BlockSize = SIZEOF_RELOC_NOTALIGNED;
          cls.IMPORT_TABLE.NameRVA      = RVA_OF_CLI(inP) +                                 rls.TypeOffset = TYPE_OFFSET(0x3,0x2);
            OFFSETOF(struct CLI_SECTION_IMAGE, IMPORT_TABLE.DllName);                       rls.Padding   = 0;