Составители:
Рубрика:
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;
Страницы
- « первая
- ‹ предыдущая
- …
- 148
- 149
- 150
- 151
- 152
- …
- следующая ›
- последняя »