| Рабочим названием платформы .NET было |
Опубликован: 28.06.2006 | Уровень: специалист | Доступ: свободно | ВУЗ: Московский государственный технический университет им. Н.Э. Баумана
Дополнительный материал 1:
Приложение A
A.3. pe.c
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "pe.h"
#include "macros.h"
void make_headers (FILE* file, PINPUT_PARAMETERS inP);
void make_text_section (FILE* file, PINPUT_PARAMETERS inP);
void make_cli_section (FILE* file, PINPUT_PARAMETERS inP);
void make_reloc_section (FILE* file, PINPUT_PARAMETERS inP);
unsigned long align(unsigned long x, unsigned long alignment)
{
div_t t = div(x,alignment);
return t.rem == 0 ? x : (t.quot+1)*alignment;
};
void make_file (FILE* file, PINPUT_PARAMETERS inP)
{
make_headers(file, inP); // Stage 1
make_text_section(file, inP); // Stage 2
make_cli_section(file, inP); // Stage 3
make_reloc_section(file, inP); // Stage 4
}
unsigned char msdos_header[128] = {
0x4D, 0x5A, 0x90, 0x00, 0x03, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
0xB8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00,
0x0E, 0x1F, 0xBA, 0x0E, 0x00, 0xB4, 0x09, 0xCD,
0x21, 0xB8, 0x01, 0x4C, 0xCD, 0x21, 0x54, 0x68,
0x69, 0x73, 0x20, 0x70, 0x72, 0x6F, 0x67, 0x72,
0x61, 0x6D, 0x20, 0x63, 0x61, 0x6E, 0x6E, 0x6F,
0x74, 0x20, 0x62, 0x65, 0x20, 0x72, 0x75, 0x6E,
0x20, 0x69, 0x6E, 0x20, 0x44, 0x4F, 0x53, 0x20,
0x6D, 0x6F, 0x64, 0x65, 0x2E, 0x0D, 0x0D, 0x0A,
0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
// initialize constant fields in HEADERS structure
void make_headers_const(PHEADERS Hdr){
memcpy(Hdr->ms_dos_header, msdos_header, 128);
Hdr->signature = 0x00004550;
Hdr->PeHdr.Machine = IMAGE_FILE_MACHINE_I386;
Hdr->PeHdr.PointerToSymbolTable = 0;
Hdr->PeHdr.NumberOfSymbols = 0;
Hdr->PeHdr.OptionalHeaderSize = 0xe0;
// Optional Header
Hdr->OptHdr.Magic = 0x010B;
Hdr->OptHdr.LMajor = 6;
Hdr->OptHdr.LMinor = 0;
Hdr->OptHdr.SizeOfUninitializedData = 0;
Hdr->OptHdr.SectionAlignment = SECTION_ALIGNMENT;
Hdr->OptHdr.OSMajor = 4;
Hdr->OptHdr.OSMinor = 0;
Hdr->OptHdr.UserMajor = 0;
Hdr->OptHdr.UserMinor = 0;
Hdr->OptHdr.SubsysMajor = 4;
Hdr->OptHdr.SubsysMinor = 0;
Hdr->OptHdr.Reserved = 0;
Hdr->OptHdr.FileCheckSum = 0;
Hdr->OptHdr.DllFlags = 0x400;
Hdr->OptHdr.StackReserveSize = 0x100000;
Hdr->OptHdr.StackCommitSize = 0x1000;
Hdr->OptHdr.HeapReserveSize = 0x100000;
Hdr->OptHdr.HeapCommitSize = 0x1000;
Hdr->OptHdr.LoaderFlags = 0;
Hdr->OptHdr.NumberOfDataDirectories = 16;
// TEXT section
Hdr->TEXT_SECTION.PointerToRelocations = 0;
Hdr->TEXT_SECTION.PointerToLinenumbers = 0;
Hdr->TEXT_SECTION.NumberOfRelocations = 0;
Hdr->TEXT_SECTION.NumberOfLinenumbers = 0;
Hdr->TEXT_SECTION.Characteristics = 0x60000020;
// CLI section
Hdr->CLI_SECTION.PointerToRelocations = 0;
Hdr->CLI_SECTION.PointerToLinenumbers = 0;
Hdr->CLI_SECTION.NumberOfRelocations = 0;
Hdr->CLI_SECTION.NumberOfLinenumbers = 0;
Hdr->CLI_SECTION.Characteristics = 0x60000020;
// .RELOC section
Hdr->RELOC_SECTION.PointerToRelocations = 0;
Hdr->RELOC_SECTION.PointerToLinenumbers = 0;
Hdr->RELOC_SECTION.NumberOfRelocations = 0;
Hdr->RELOC_SECTION.NumberOfLinenumbers = 0;
Hdr->RELOC_SECTION.Characteristics = 0x42000040;
// initialize to 0
memset(&Hdr->STUB1.RVA, 0, SIZEOF_DATA_DIRECTORY);
memset(Hdr->STUB2, 0, 3 * SIZEOF_DATA_DIRECTORY);
memset(Hdr->STUB3, 0, 6 * SIZEOF_DATA_DIRECTORY);
memset(&Hdr->STUB4.RVA, 0, SIZEOF_DATA_DIRECTORY);
memset(&Hdr->STUB5.RVA, 0, SIZEOF_DATA_DIRECTORY);
};
// initialize HEADERS structure
void make_headers(FILE* file ,PINPUT_PARAMETERS inP){
struct HEADERS Hdr;
char * image;
make_headers_const(&Hdr);
Hdr.PeHdr.NumberOfSections = 3;
Hdr.PeHdr.TimeDateStamp = (long)time(NULL);
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);
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);
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);
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;
image = malloc(SIZEOF_RELOC(inP));
memset(image, 0, SIZEOF_RELOC(inP));
memcpy(image, (char *)&rls, SIZEOF_RELOC_NOTALIGNED);
fwrite(image,1, SIZEOF_RELOC(inP),file);
free(image);
};