mirror of
https://github.com/avast/retdec.git
synced 2025-03-09 00:41:24 +00:00
Fixed resource issue
This commit is contained in:
parent
4b1915f8c8
commit
5df3bd2d6e
@ -40,7 +40,8 @@ namespace PeLib
|
|||||||
ERROR_ENTRY_NOT_FOUND = -7,
|
ERROR_ENTRY_NOT_FOUND = -7,
|
||||||
ERROR_DUPLICATE_ENTRY = -8,
|
ERROR_DUPLICATE_ENTRY = -8,
|
||||||
ERROR_DIRECTORY_DOES_NOT_EXIST = -9,
|
ERROR_DIRECTORY_DOES_NOT_EXIST = -9,
|
||||||
ERROR_COFF_SYMBOL_TABLE_DOES_NOT_EXIST = -10
|
ERROR_COFF_SYMBOL_TABLE_DOES_NOT_EXIST = -10,
|
||||||
|
ERROR_SKIP_RESOURCE = -11
|
||||||
};
|
};
|
||||||
|
|
||||||
enum LoaderError
|
enum LoaderError
|
||||||
|
@ -636,6 +636,10 @@ namespace PeLib
|
|||||||
std::uint32_t sizeOfImage,
|
std::uint32_t sizeOfImage,
|
||||||
ResourceDirectory* resDir)
|
ResourceDirectory* resDir)
|
||||||
{
|
{
|
||||||
|
//
|
||||||
|
// Any error handling here must be in syn with YARA (Module: pe.c, Function: _pe_iterate_resources)
|
||||||
|
//
|
||||||
|
|
||||||
// Enough space to be a valid node?
|
// Enough space to be a valid node?
|
||||||
std::uint32_t uiRva = uiRsrcRva + uiOffset;
|
std::uint32_t uiRva = uiRsrcRva + uiOffset;
|
||||||
if(uiRva > sizeOfImage)
|
if(uiRva > sizeOfImage)
|
||||||
@ -645,15 +649,19 @@ namespace PeLib
|
|||||||
if(imageLoader.readImage(&header, uiRva, PELIB_IMAGE_RESOURCE_DIRECTORY::size()) != PELIB_IMAGE_RESOURCE_DIRECTORY::size())
|
if(imageLoader.readImage(&header, uiRva, PELIB_IMAGE_RESOURCE_DIRECTORY::size()) != PELIB_IMAGE_RESOURCE_DIRECTORY::size())
|
||||||
return ERROR_INVALID_FILE;
|
return ERROR_INVALID_FILE;
|
||||||
|
|
||||||
// FE015EB24B7EEA2907698A6D7142198644A757066DA4EB8D3A4B63900008CF5E: Invalid root resource directory
|
// FE015EB24B7EEA2907698A6D7142198644A757066DA4EB8D3A4B63900008CF5E
|
||||||
// We artificially limit the allowed number of resource entries
|
// * Invalid root resource directory
|
||||||
if((header.NumberOfNamedEntries > PELIB_MAX_RESOURCE_ENTRIES) || (header.NumberOfIdEntries > PELIB_MAX_RESOURCE_ENTRIES))
|
// 7dfc75ade04a0deb55dfbf87baff2306e625c5280748856f69f2f43599615249
|
||||||
return ERROR_INVALID_FILE;
|
// * IMAGE_RESOURCE_DIRECTORY::Characteristics != 0
|
||||||
|
// * IMAGE_RESOURCE_DIRECTORY::NumberOfIdEntries == 0x8000
|
||||||
// More checks for number of entries
|
// We artificially limit the allowed number of resource entries.
|
||||||
|
// If exceeded, we don't stop resource parsing, but rather ignore the resource and move on
|
||||||
|
// in order to be in sync with YARA
|
||||||
unsigned int uiNumberOfEntries = header.NumberOfNamedEntries + header.NumberOfIdEntries;
|
unsigned int uiNumberOfEntries = header.NumberOfNamedEntries + header.NumberOfIdEntries;
|
||||||
if(uiNumberOfEntries > PELIB_MAX_RESOURCE_ENTRIES)
|
if((header.NumberOfNamedEntries > PELIB_MAX_RESOURCE_ENTRIES) ||
|
||||||
return ERROR_INVALID_FILE;
|
(header.NumberOfIdEntries > PELIB_MAX_RESOURCE_ENTRIES) ||
|
||||||
|
(uiNumberOfEntries > PELIB_MAX_RESOURCE_ENTRIES))
|
||||||
|
return ERROR_SKIP_RESOURCE;
|
||||||
|
|
||||||
// Add the total number of entries to the occupied range
|
// Add the total number of entries to the occupied range
|
||||||
resDir->addOccupiedAddressRange(uiRva, uiRva + PELIB_IMAGE_RESOURCE_DIRECTORY::size() - 1);
|
resDir->addOccupiedAddressRange(uiRva, uiRva + PELIB_IMAGE_RESOURCE_DIRECTORY::size() - 1);
|
||||||
@ -756,12 +764,18 @@ namespace PeLib
|
|||||||
|
|
||||||
// Read the child node
|
// Read the child node
|
||||||
childError = rc.child->read(imageLoader, uiRsrcRva, rc.entry.irde.OffsetToData & PELIB_IMAGE_RESOURCE_RVA_MASK, sizeOfImage, resDir);
|
childError = rc.child->read(imageLoader, uiRsrcRva, rc.entry.irde.OffsetToData & PELIB_IMAGE_RESOURCE_RVA_MASK, sizeOfImage, resDir);
|
||||||
if (childError != ERROR_NONE)
|
switch(childError)
|
||||||
{
|
{
|
||||||
return childError;
|
case ERROR_NONE: // If the resource was found to be OK, insert it to the list of children
|
||||||
}
|
children.push_back(rc);
|
||||||
|
break;
|
||||||
|
|
||||||
children.push_back(rc);
|
case ERROR_SKIP_RESOURCE: // Do not insert invalid resources; do not stop processing either
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return childError;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return ERROR_NONE;
|
return ERROR_NONE;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user