bool readPEInfo(char *fp2, MZHeader *outMZ, PE_Header *outPE, PE_ExtHeader *outpeXH, SectionHeader **outSecHdr) { //fseek(fp, 0, SEEK_END); long fileSize =strlen(fp2); //fseek(fp, 0, SEEK_SET); FILE *fp=NULL; char Temp[128000]; wsprintf(Temp,"%s",fp2); if(fileSize < sizeof(MZHeader)) { printf("File size too small\n"); return false; } // read MZ Header MZHeader mzH; //fread(&mzH, sizeof(MZHeader), 1, fp); memcpy(&mzH,fp2,sizeof(MZHeader)); if(mzH.signature != 0x5a4d) // MZ { printf("File does not have MZ header\n"); return false; } //printf("Offset to PE Header = %X\n", mzH.offsetToPE); if((unsigned long)fileSize < mzH.offsetToPE + sizeof(PE_Header)) { printf("File size too small\n"); return false; } // read PE Header //fseek(fp, mzH.offsetToPE, SEEK_SET); PE_Header peH; //fread(&peH, sizeof(PE_Header), 1, fp); memcpy(&peH,(void *)Temp[mzH.offsetToPE], sizeof(PE_Header)); //printf("Size of option header = %d\n", peH.sizeOfOptionHeader); //printf("Number of sections = %d\n", peH.numSections); if(peH.sizeOfOptionHeader != sizeof(PE_ExtHeader)) { printf("Unexpected option header size.\n"); return false; } // read PE Ext Header PE_ExtHeader peXH; //fread(&peXH, sizeof(PE_ExtHeader), 1, fp); memcpy(&peXH,(void *)Temp[mzH.offsetToPE], sizeof(PE_ExtHeader)); //printf("Import table address = %X\n", peXH.importTableAddress); //printf("Import table size = %X\n", peXH.importTableSize); //printf("Import address table address = %X\n", peXH.importAddressTableAddress); //printf("Import address table size = %X\n", peXH.importAddressTableSize); // read the sections SectionHeader *secHdr = new SectionHeader[peH.numSections]; //fread(secHdr, sizeof(SectionHeader) * peH.numSections, 1, fp); memcpy(secHdr,(void *)Temp[mzH.offsetToPE], sizeof(SectionHeader) * peH.numSections); *outMZ = mzH; *outPE = peH; *outpeXH = peXH; *outSecHdr = secHdr; return true; }