better error checking

This commit is contained in:
mrexodia 2016-01-10 16:28:32 +01:00
parent e152448267
commit a508dc2796
3 changed files with 22 additions and 7 deletions

View File

@ -71,16 +71,18 @@ namespace GleeBug
mDosNtOverlap = true; mDosNtOverlap = true;
mOffset = newOffset; mOffset = newOffset;
mAfterDosData = readRegion<uint8>(0);
} }
else else
{ {
//read & verify the data between the DOS header and the NT headers //read & verify the data between the DOS header and the NT headers
auto afterDosCount = newOffset - mOffset; auto afterDosCount = newOffset - mOffset;
mAfterDosData = readRegion<uint8>(afterDosCount); mAfterDosData = readRegion<uint8>(afterDosCount);
if (!mAfterDosData)
return ErrorAfterDosHeaderData;
} }
if (!mAfterDosData)
return ErrorAfterDosHeaderData;
//read & verify the signature //read & verify the signature
auto signature = readRegion<DWORD>(); auto signature = readRegion<DWORD>();
if (!signature) if (!signature)
@ -156,8 +158,13 @@ namespace GleeBug
return ErrorNtFileHeaderSizeOfOptionalHeaderOverlap; return ErrorNtFileHeaderSizeOfOptionalHeaderOverlap;
//read data after the optional header (TODO: check if this is even possible) //read data after the optional header (TODO: check if this is even possible)
uint32 afterOptionalCount = sizeOfIoh > realSizeOfIoh ? sizeOfIoh - realSizeOfIoh : 0; uint32 afterOptionalSize = realSizeOfIoh < sizeOfIoh ? sizeOfIoh - realSizeOfIoh : 0;
mAfterOptionalData = readRegion<uint8>(afterOptionalCount); mAfterOptionalData = readRegion<uint8>(afterOptionalSize);
if (!mAfterOptionalData)
{
printf("realSizeOfIoh: %u, sizeOfIoh: %u, afterOptionalSize: %u\n", realSizeOfIoh, sizeOfIoh, afterOptionalSize);
return ErrorAfterOptionalHeaderDataRead;
}
//read the section headers //read the section headers
mSectionHeaders = readRegion<IMAGE_SECTION_HEADER>(numberOfSections); mSectionHeaders = readRegion<IMAGE_SECTION_HEADER>(numberOfSections);
@ -201,8 +208,10 @@ namespace GleeBug
//get after section headers data //get after section headers data
auto firstRawAddress = sortedHeaders[0].header.PointerToRawData; auto firstRawAddress = sortedHeaders[0].header.PointerToRawData;
if (mOffset < firstRawAddress) auto afterDataSize = mOffset < firstRawAddress ? firstRawAddress - mOffset : 0;
mAfterSectionHeadersData = readRegion<uint8>(firstRawAddress - mOffset); mAfterSectionHeadersData = readRegion<uint8>(afterDataSize);
if (!mAfterSectionHeadersData)
return ErrorAfterSectionHeadersDataRead;
//read the actual section data. //read the actual section data.
for (auto & section : sortedHeaders) for (auto & section : sortedHeaders)
@ -236,6 +245,8 @@ namespace GleeBug
uint32 Pe::readData(uint32 size) uint32 Pe::readData(uint32 size)
{ {
if (!size)
return mOffset;
std::vector<uint8> temp(size); std::vector<uint8> temp(size);
if (!mFile.Read(mOffset, temp.data(), size)) if (!mFile.Read(mOffset, temp.data(), size))
@ -264,8 +275,10 @@ namespace GleeBug
mErrorMap.insert({ ErrorNtFileHeaderUnsupportedMachineNtHeadersRegionSize, "ErrorNtFileHeaderUnsupportedMachineNtHeadersRegionSize" }); mErrorMap.insert({ ErrorNtFileHeaderUnsupportedMachineNtHeadersRegionSize, "ErrorNtFileHeaderUnsupportedMachineNtHeadersRegionSize" });
mErrorMap.insert({ ErrorNtOptionalHeaderRead, "ErrorNtOptionalHeaderRead" }); mErrorMap.insert({ ErrorNtOptionalHeaderRead, "ErrorNtOptionalHeaderRead" });
mErrorMap.insert({ ErrorNtOptionalHeaderMagic, "ErrorNtOptionalHeaderMagic" }); mErrorMap.insert({ ErrorNtOptionalHeaderMagic, "ErrorNtOptionalHeaderMagic" });
mErrorMap.insert({ ErrorAfterOptionalHeaderDataRead, "ErrorAfterOptionalHeaderDataRead" });
mErrorMap.insert({ ErrorNtHeadersRegionSize, "ErrorNtHeadersRegionSize" }); mErrorMap.insert({ ErrorNtHeadersRegionSize, "ErrorNtHeadersRegionSize" });
mErrorMap.insert({ ErrorSectionHeadersRead, "ErrorSectionHeadersRead" }); mErrorMap.insert({ ErrorSectionHeadersRead, "ErrorSectionHeadersRead" });
mErrorMap.insert({ ErrorAfterSectionHeadersDataRead, "ErrorAfterSectionHeadersDataRead" });
mErrorMap.insert({ ErrorBeforeSectionDataRead, "ErrorBeforeSectionDataRead" }); mErrorMap.insert({ ErrorBeforeSectionDataRead, "ErrorBeforeSectionDataRead" });
mErrorMap.insert({ ErrorSectionDataRead, "ErrorSectionDataRead" }); mErrorMap.insert({ ErrorSectionDataRead, "ErrorSectionDataRead" });
} }

View File

@ -27,8 +27,10 @@ namespace GleeBug
ErrorNtFileHeaderUnsupportedMachineNtHeadersRegionSize, ErrorNtFileHeaderUnsupportedMachineNtHeadersRegionSize,
ErrorNtOptionalHeaderRead, ErrorNtOptionalHeaderRead,
ErrorNtOptionalHeaderMagic, ErrorNtOptionalHeaderMagic,
ErrorAfterOptionalHeaderDataRead,
ErrorNtHeadersRegionSize, ErrorNtHeadersRegionSize,
ErrorSectionHeadersRead, ErrorSectionHeadersRead,
ErrorAfterSectionHeadersDataRead,
ErrorBeforeSectionDataRead, ErrorBeforeSectionDataRead,
ErrorSectionDataRead ErrorSectionDataRead
}; };

View File

@ -149,7 +149,7 @@ static void testCorkami()
int main() int main()
{ {
testPeFile(L"C:\\test64.exe"); //testPeFile(L"C:\\test64.exe");
testCorkami(); testCorkami();
puts(""); puts("");
system("pause"); system("pause");