13 #ifndef RETDEC_PELIB_IMAGE_LOADER_H
14 #define RETDEC_PELIB_IMAGE_LOADER_H
125 memcpy(
buffer.data() + offset, data, length);
144 int Load(std::istream & fs, std::streamoff fileOffset = 0,
bool loadHeadersOnly =
false);
145 int Load(
const char * fileName,
bool loadHeadersOnly =
false);
147 int Save(std::ostream & fs, std::streamoff fileOffset = 0,
bool saveHeadersOnly =
false);
148 int Save(
const char * fileName,
bool saveHeadersOnly =
false);
152 std::uint32_t
readImage(
void * buffer, std::uint32_t rva, std::uint32_t bytesToRead);
153 std::uint32_t
writeImage(
void * buffer, std::uint32_t rva, std::uint32_t bytesToRead);
155 std::uint32_t
readString(std::string & str, std::uint32_t rva, std::uint32_t maxLength = 65535);
156 std::uint32_t
readStringRc(std::string & str, std::uint32_t rva);
160 std::size_t maxLength = 65535,
161 bool mustBePrintable =
false,
162 bool mustNotBeTooLong =
false);
163 std::uint32_t
stringLength(std::uint32_t rva, std::uint32_t maxLength = 65535)
const;
165 std::uint32_t
readPointer(std::uint32_t rva, std::uint64_t & pointerValue);
168 std::uint32_t
dumpImage(
const char * fileName);
172 std::uint32_t
vaToRva(std::uint64_t VirtualAddress)
const;
197 return (sectionIndex <
sections.size()) ? &
sections[sectionIndex] :
nullptr;
202 return (sectionIndex <
sections.size()) ? &
sections[sectionIndex] :
nullptr;
332 virtualAddress = virtualAddress & 0xFFFFFFFF;
333 return virtualAddress;
340 void setSizeOfCode(std::uint32_t sizeOfCode, std::uint32_t baseOfCode = UINT32_MAX);
341 void setDataDirectory(std::uint32_t entryIndex, std::uint32_t VirtualAddress, std::uint32_t Size = UINT32_MAX);
345 void setSectionName(std::size_t sectionIndex,
const char * newName);
346 void setSectionVirtualRange(std::size_t sectionIndex, std::uint32_t VirtualAddress, std::uint32_t VirtualSize = UINT32_MAX);
347 void setSectionRawDataRange(std::size_t sectionIndex, std::uint32_t PointerToRawData, std::uint32_t SizeOfRawData = UINT32_MAX);
349 int splitSection(std::size_t sectionIndex,
const std::string & prevSectName,
const std::string & nextSectName, std::uint32_t splitOffset);
358 std::size_t
getMismatchOffset(
void * buffer1,
void * buffer2, std::uint32_t rva, std::size_t length);
367 std::uint32_t
readWriteImage(
void * buffer, std::uint32_t rva, std::uint32_t bytesToRead,
READWRITE ReadWrite);
368 std::uint32_t
readWriteImageFile(
void * buffer, std::uint32_t rva, std::uint32_t bytesToRead,
bool bReadOperation);
376 int saveDosHeader(std::ostream & fs, std::streamoff fileOffset);
378 int saveNtHeaders(std::ostream & fs, std::streamoff fileOffset);
392 std::uint32_t virtualAddress,
393 std::uint32_t virtualSize,
394 std::uint32_t pointerToRawData,
395 std::uint32_t sizeOfRawData,
396 std::uint32_t characteristics,
397 bool isImageHeader =
false);
413 template <
typename LOAD_CONFIG>
423 static std::uint32_t
AlignToSize(std::uint32_t ByteSize, std::uint32_t AlignSize)
425 return ((ByteSize + (AlignSize - 1)) & ~(AlignSize - 1));
435 return (std::uint64_t)(std::int64_t)(std::int32_t)value32;
442 return ((EOF <= ch) && (ch <= 255)) ? isprint(ch) :
false;
Definition: ImageLoader.h:138
const PELIB_SECTION_HEADER * getSectionHeader(std::size_t sectionIndex) const
Definition: ImageLoader.h:195
int captureSectionName(ByteBuffer &fileData, std::string §ionName, const std::uint8_t *name)
Definition: ImageLoader.cpp:1820
static std::uint64_t signExtend32To64(std::uint32_t value32)
Definition: ImageLoader.h:433
std::uint32_t readPointer(std::uint32_t rva, std::uint64_t &pointerValue)
Definition: ImageLoader.cpp:291
std::uint32_t getSizeOfImageAligned() const
Definition: ImageLoader.h:285
bool isZeroPage(std::uint32_t rva)
Definition: ImageLoader.cpp:2465
bool checkForBadArchitectureSpecific()
Definition: ImageLoader.cpp:2670
void setCharacteristics(std::uint32_t characteristics)
Definition: ImageLoader.cpp:597
std::uint32_t getRealPointerToRawData(std::size_t sectionIndex) const
Definition: ImageLoader.cpp:546
bool ntHeadersSizeCheck
Definition: ImageLoader.h:463
int Load(ByteBuffer &fileData, bool loadHeadersOnly=false)
Definition: ImageLoader.cpp:868
bool loadItaniumImages
Definition: ImageLoader.h:469
bool checkForValid32BitMachine()
Definition: ImageLoader.cpp:2516
std::size_t getSectionIndexByRva(std::uint32_t Rva) const
Definition: ImageLoader.cpp:575
ImageLoader(std::uint32_t loaderFlags=0)
Definition: ImageLoader.cpp:50
bool isLegacyImageArchitecture(std::uint16_t Machine)
Definition: ImageLoader.cpp:2498
std::uint32_t ssiImageAlignment32
Definition: ImageLoader.h:461
bool checkForBadLoadConfigXX(std::uint32_t loadConfigRva, std::uint32_t loadConfigSize)
void(* READWRITE)(PeLib::PELIB_FILE_PAGE &page, void *buffer, std::size_t offsetInPage, std::size_t bytesInPage)
Definition: ImageLoader.h:363
bool processImageRelocations(std::uint64_t oldImageBase, std::uint64_t getImageBase, std::uint32_t VirtualAddress, std::uint32_t Size)
Definition: ImageLoader.cpp:1358
std::uint32_t readStringRc(std::string &str, std::uint32_t rva)
Definition: ImageLoader.cpp:327
static std::uint32_t AlignToSize(std::uint32_t ByteSize, std::uint32_t AlignSize)
Definition: ImageLoader.h:423
int saveSectionHeaders(std::ostream &fs, std::streamoff fileOffset)
Definition: ImageLoader.cpp:2031
std::vector< PELIB_SECTION_HEADER > sections
Definition: ImageLoader.h:447
bool checkNonLegacyDllCharacteristics
Definition: ImageLoader.h:472
LoaderError loaderError() const
Definition: ImageLoader.cpp:860
int saveNtHeaders(std::ostream &fs, std::streamoff fileOffset)
Definition: ImageLoader.cpp:1709
std::uint64_t getVirtualAddressMasked(std::uint32_t rva)
Definition: ImageLoader.h:327
bool isValidMachineForCodeIntegrifyCheck(std::uint32_t Bits)
Definition: ImageLoader.cpp:2523
std::uint32_t getNtSignature() const
Definition: ImageLoader.h:225
PELIB_IMAGE_FILE_HEADER fileHeader
Definition: ImageLoader.h:450
bool headerSizeCheck
Definition: ImageLoader.h:466
std::uint32_t getChecksumFileOffset() const
Definition: ImageLoader.h:300
std::uint32_t stringLength(std::uint32_t rva, std::uint32_t maxLength=65535) const
Definition: ImageLoader.cpp:202
std::uint32_t getSecurityDirFileOffset() const
Definition: ImageLoader.h:310
bool relocateImage(std::uint64_t newImageBase)
Definition: ImageLoader.cpp:125
bool checkImagePostMapping
Definition: ImageLoader.h:473
std::uint32_t getDataDirSize(std::size_t dataDirIndex) const
Definition: ImageLoader.h:321
int saveDosHeader(std::ostream &fs, std::streamoff fileOffset)
Definition: ImageLoader.cpp:1565
bool checkForBadCodeIntegrityImages(ByteBuffer &fileData)
Definition: ImageLoader.cpp:2557
bool processImageRelocation_IA64_IMM64(std::uint32_t fixupAddress, std::uint64_t difference)
Definition: ImageLoader.cpp:1261
bool isPrintableChar(int ch)
Definition: ImageLoader.h:440
std::uint32_t getDataDirRva(std::size_t dataDirIndex) const
Definition: ImageLoader.h:315
std::size_t getMismatchOffset(void *buffer1, void *buffer2, std::uint32_t rva, std::size_t length)
Definition: ImageLoader.cpp:2843
std::uint32_t realNumberOfRvaAndSizes
Definition: ImageLoader.h:458
bool isImageLoadable() const
Definition: ImageLoader.cpp:2814
std::uint32_t readString(std::string &str, std::uint32_t rva, std::uint32_t maxLength=65535)
Definition: ImageLoader.cpp:275
bool loadArmImages
Definition: ImageLoader.h:467
bool checkForSectionTablesWithinHeader(std::uint32_t e_lfanew)
Definition: ImageLoader.cpp:2797
std::uint32_t writeImage(void *buffer, std::uint32_t rva, std::uint32_t bytesToRead)
Definition: ImageLoader.cpp:188
void setSectionVirtualRange(std::size_t sectionIndex, std::uint32_t VirtualAddress, std::uint32_t VirtualSize=UINT32_MAX)
Definition: ImageLoader.cpp:692
void setPeHeaderOffset(std::uint32_t new_e_lfanew)
Definition: ImageLoader.h:220
ByteBuffer rawFileData
Definition: ImageLoader.h:452
void setSectionRawDataRange(std::size_t sectionIndex, std::uint32_t PointerToRawData, std::uint32_t SizeOfRawData=UINT32_MAX)
Definition: ImageLoader.cpp:703
LoaderError ldrError
Definition: ImageLoader.h:453
std::uint32_t getMachine() const
Definition: ImageLoader.h:230
std::uint32_t readWriteImage(void *buffer, std::uint32_t rva, std::uint32_t bytesToRead, READWRITE ReadWrite)
Definition: ImageLoader.cpp:1099
int Save(std::ostream &fs, std::streamoff fileOffset=0, bool saveHeadersOnly=false)
Definition: ImageLoader.cpp:1004
PELIB_IMAGE_OPTIONAL_HEADER optionalHeader
Definition: ImageLoader.h:451
void enlargeLastSection(std::uint32_t sectionSize)
Definition: ImageLoader.cpp:768
const PELIB_IMAGE_OPTIONAL_HEADER & getOptionalHeader() const
Definition: ImageLoader.h:190
std::uint32_t getAddressOfEntryPoint() const
Definition: ImageLoader.h:270
std::uint64_t getOrdinalMask() const
Definition: ImageLoader.h:210
std::uint32_t getFileOffsetFromRva(std::uint32_t rva) const
Definition: ImageLoader.cpp:449
void makeValid()
Definition: ImageLoader.cpp:800
bool isImageMappedOk() const
Definition: ImageLoader.cpp:2819
void setSectionName(std::size_t sectionIndex, const char *newName)
Definition: ImageLoader.cpp:682
int captureOptionalHeader32(std::uint8_t *fileData, std::uint8_t *filePtr, std::uint8_t *fileEnd)
Definition: ImageLoader.cpp:2251
std::uint64_t getSizeOfFile() const
Definition: ImageLoader.h:205
std::uint32_t getImageBitability() const
Definition: ImageLoader.cpp:432
std::uint32_t getPeHeaderOffset() const
Definition: ImageLoader.h:215
void setSizeOfCode(std::uint32_t sizeOfCode, std::uint32_t baseOfCode=UINT32_MAX)
Definition: ImageLoader.cpp:607
std::uint32_t dumpImage(const char *fileName)
Definition: ImageLoader.cpp:408
static void writeToPage(PELIB_FILE_PAGE &page, void *buffer, size_t offsetInPage, size_t bytesInPage)
Definition: ImageLoader.cpp:1089
std::uint64_t getImageBase() const
Definition: ImageLoader.h:265
int captureImageSections(ByteBuffer &fileData)
Definition: ImageLoader.cpp:2057
std::uint32_t getLoadedNumberOfSections() const
Definition: ImageLoader.h:245
const PELIB_IMAGE_DOS_HEADER & getDosHeader() const
Definition: ImageLoader.h:180
std::uint32_t getRealNumberOfDataDirectories() const
Definition: ImageLoader.h:305
bool is64BitWindows
Definition: ImageLoader.h:462
PELIB_IMAGE_SECTION_HEADER * addSection(const char *name, std::uint32_t size)
Definition: ImageLoader.cpp:635
int setLoaderError(LoaderError ldrErr)
Definition: ImageLoader.cpp:850
bool checkForValid64BitMachine()
Definition: ImageLoader.cpp:2507
bool loadArm64Images
Definition: ImageLoader.h:468
PELIB_SECTION_HEADER * getSectionHeader(std::size_t sectionIndex)
Definition: ImageLoader.h:200
std::uint32_t readImage(void *buffer, std::uint32_t rva, std::uint32_t bytesToRead)
Definition: ImageLoader.cpp:171
std::uint32_t getImageProtection(std::uint32_t characteristics) const
Definition: ImageLoader.cpp:556
std::vector< PELIB_FILE_PAGE > pages
Definition: ImageLoader.h:448
bool isValidImageBlock(std::uint32_t Rva, std::uint32_t Size) const
Definition: ImageLoader.cpp:2829
const PELIB_IMAGE_FILE_HEADER & getFileHeader() const
Definition: ImageLoader.h:185
std::uint32_t getSizeOfHeaders() const
Definition: ImageLoader.h:275
bool forceIntegrityCheckEnabled
Definition: ImageLoader.h:470
std::uint32_t checkSumFileOffset
Definition: ImageLoader.h:459
std::uint32_t readStringRaw(ByteBuffer &fileData, std::string &str, std::size_t offset, std::size_t maxLength=65535, bool mustBePrintable=false, bool mustNotBeTooLong=false)
Definition: ImageLoader.cpp:355
bool isGoodPagePointer(PFN_VERIFY_ADDRESS PfnVerifyAddress, void *pagePtr)
Definition: ImageLoader.cpp:2431
std::uint32_t getFileAlignment() const
Definition: ImageLoader.h:295
int captureDosHeader(ByteBuffer &fileData)
Definition: ImageLoader.cpp:1551
std::uint32_t maxSectionCount
Definition: ImageLoader.h:457
std::uint32_t securityDirFileOffset
Definition: ImageLoader.h:460
std::uint32_t getMagic() const
Definition: ImageLoader.h:260
std::uint32_t getNumberOfSections() const
Definition: ImageLoader.h:255
std::uint32_t getSizeOfImage() const
Definition: ImageLoader.h:280
bool architectureSpecificChecks
Definition: ImageLoader.h:465
int captureOptionalHeader64(std::uint8_t *fileData, std::uint8_t *filePtr, std::uint8_t *fileEnd)
Definition: ImageLoader.cpp:2180
PELIB_IMAGE_DOS_HEADER dosHeader
Definition: ImageLoader.h:449
void processSectionHeader(PELIB_IMAGE_SECTION_HEADER *pSectionHeader)
Definition: ImageLoader.cpp:1194
std::uint32_t ntSignature
Definition: ImageLoader.h:456
bool forceIntegrityCheckCertificate
Definition: ImageLoader.h:471
std::uint32_t windowsBuildNumber
Definition: ImageLoader.h:455
void setSectionCharacteristics(std::size_t sectionIndex, std::uint32_t Characteristics)
Definition: ImageLoader.cpp:714
std::uint32_t captureImageSection(ByteBuffer &fileData, std::uint32_t virtualAddress, std::uint32_t virtualSize, std::uint32_t pointerToRawData, std::uint32_t sizeOfRawData, std::uint32_t characteristics, bool isImageHeader=false)
Definition: ImageLoader.cpp:2323
void compareWithWindowsMappedImage(PELIB_IMAGE_COMPARE &ImageCompare, void *imageData, std::uint32_t imageSize)
Definition: ImageLoader.cpp:2877
void setDataDirectory(std::uint32_t entryIndex, std::uint32_t VirtualAddress, std::uint32_t Size=UINT32_MAX)
Definition: ImageLoader.cpp:617
bool isSectionHeaderPointerToRawData(uint32_t rva)
Definition: ImageLoader.cpp:2472
int captureSectionHeaders(ByteBuffer &fileData)
Definition: ImageLoader.cpp:1857
void setPointerToSymbolTable(std::uint32_t pointerToSymbolTable)
Definition: ImageLoader.cpp:592
void calcNewSectionAddresses(std::uint32_t &Rva, std::uint32_t &RawOffset)
Definition: ImageLoader.cpp:663
bool checkForImageAfterMapping()
Definition: ImageLoader.cpp:2734
int verifyDosHeader(PELIB_IMAGE_DOS_HEADER &hdr, std::size_t fileSize)
Definition: ImageLoader.cpp:2135
std::uint64_t savedFileSize
Definition: ImageLoader.h:454
int loadImageAsIs(ByteBuffer &fileData)
Definition: ImageLoader.cpp:2174
static void readFromPage(PELIB_FILE_PAGE &page, void *buffer, size_t offsetInPage, size_t bytesInPage)
Definition: ImageLoader.cpp:1072
std::uint32_t getPointerToSymbolTable() const
Definition: ImageLoader.h:235
int captureNtHeaders(ByteBuffer &fileData)
Definition: ImageLoader.cpp:1577
std::uint32_t readWriteImageFile(void *buffer, std::uint32_t rva, std::uint32_t bytesToRead, bool bReadOperation)
Definition: ImageLoader.cpp:1146
void setAddressOfEntryPoint(std::uint32_t addressOfEntryPoint)
Definition: ImageLoader.cpp:602
std::uint32_t getFieldOffset(PELIB_MEMBER_TYPE field) const
Definition: ImageLoader.cpp:486
static uint8_t ImageProtectionArray[16]
Definition: ImageLoader.h:445
std::uint32_t getCharacteristics() const
Definition: ImageLoader.h:250
std::uint32_t getPointerSize() const
Definition: ImageLoader.cpp:322
static std::uint32_t BytesToPages(std::uint32_t ByteSize)
Definition: ImageLoader.h:428
bool sizeofImageMustMatch
Definition: ImageLoader.h:464
int removeSection(std::size_t sizeIncrement)
Definition: ImageLoader.cpp:779
void writeNewImageBase(std::uint64_t newImageBase)
Definition: ImageLoader.cpp:1524
int splitSection(std::size_t sectionIndex, const std::string &prevSectName, const std::string &nextSectName, std::uint32_t splitOffset)
Definition: ImageLoader.cpp:724
std::uint32_t vaToRva(std::uint64_t VirtualAddress) const
Definition: ImageLoader.cpp:441
std::uint32_t getSectionAlignment() const
Definition: ImageLoader.h:290
bool isGoodMappedPage(std::uint32_t rva)
Definition: ImageLoader.cpp:2458
std::uint32_t getNumberOfSymbols() const
Definition: ImageLoader.h:240
Definition: BoundImportDirectory.h:21
PELIB_MEMBER_TYPE
Definition: ImageLoader.h:27
@ OPTHDR_DataDirectory_TLS_Rva
@ OPTHDR_DataDirectory_EXPORT_Rva
@ OPTHDR_NumberOfRvaAndSizes
@ OPTHDR_DataDirectory_CONFIG_Rva
@ OPTHDR_DataDirectory_RSRC_Rva
LoaderError
Definition: PeLibAux.h:47
const std::uint32_t BuildNumberVista
Definition: ImageLoader.h:57
std::vector< std::uint8_t > ByteBuffer
Definition: PeLibAux.h:126
bool(* PFN_VERIFY_ADDRESS)(void *ptr, size_t length)
Definition: ImageLoader.h:67
const std::uint32_t BuildNumber7
Definition: ImageLoader.h:58
const std::uint32_t BuildNumber10
Definition: ImageLoader.h:60
const std::uint32_t BuildNumber8
Definition: ImageLoader.h:59
bool(* PFN_COMPARE_CALLBACK)(struct PELIB_IMAGE_COMPARE *pImgCompare, size_t BytesCompared, size_t BytesTotal)
Definition: ImageLoader.h:68
const std::uint32_t PELIB_PAGE_SIZE
Definition: PeLibAux.h:139
std::uint64_t fileSize(const std::string &filename)
Definition: PeLibAux.cpp:138
const std::uint32_t PELIB_PAGE_SIZE_SHIFT
Definition: PeLibAux.h:141
PELIB_COMPARE_RESULT
Definition: ImageLoader.h:42
@ ImagesInvalidPageInImage
@ ImagesDifferentPageAccess
@ ImagesDifferentPageValue
@ ImagesWindowsLoadedWeDidnt
@ ImagesWindowsDidntLoadWeDid
const std::uint32_t BuildNumberXP
Definition: ImageLoader.h:56
const std::uint32_t BuildNumber64Bit
Definition: ImageLoader.h:62
const std::uint32_t BuildNumberMask
Definition: ImageLoader.h:61
Definition: ImageLoader.h:85
bool setValidPage(const void *data, size_t length)
Definition: ImageLoader.h:93
void writeToPage(const void *data, size_t offset, size_t length)
Definition: ImageLoader.h:114
PELIB_FILE_PAGE()
Definition: ImageLoader.h:86
bool isInvalidPage
Definition: ImageLoader.h:130
void setZeroPage()
Definition: ImageLoader.h:107
ByteBuffer buffer
Definition: ImageLoader.h:129
bool isZeroPage
Definition: ImageLoader.h:131
Definition: ImageLoader.h:71
std::uint32_t startTickCount
Definition: ImageLoader.h:78
PELIB_COMPARE_RESULT compareResult
Definition: ImageLoader.h:74
const char * dumpIfNotEqual
Definition: ImageLoader.h:76
PFN_COMPARE_CALLBACK PfnCompareCallback
Definition: ImageLoader.h:73
std::uint32_t differenceOffset
Definition: ImageLoader.h:77
const char * szFileName
Definition: ImageLoader.h:75
PFN_VERIFY_ADDRESS PfnVerifyAddress
Definition: ImageLoader.h:72
std::uint32_t Size
Definition: PeLibAux.h:616
std::uint32_t VirtualAddress
Definition: PeLibAux.h:615