8 bool parse_resource_dir(BYTE* modulePtr,
const size_t moduleSize,
9 IMAGE_RESOURCE_DIRECTORY_ENTRY* root_dir,
10 const IMAGE_RESOURCE_DIRECTORY* upper_dir,
11 IMAGE_RESOURCE_DIRECTORY* curr_dir,
15 bool parse_resource_entry(BYTE* modulePtr,
const size_t moduleSize,
16 IMAGE_RESOURCE_DIRECTORY_ENTRY* root_dir,
17 const IMAGE_RESOURCE_DIRECTORY* upper_dir,
18 IMAGE_RESOURCE_DIRECTORY_ENTRY* entry,
22 if (!entry->DataIsDirectory) {
24 DWORD offset = entry->OffsetToData;
26 IMAGE_RESOURCE_DATA_ENTRY* data_entry = (IMAGE_RESOURCE_DATA_ENTRY*)(offset + (ULONGLONG)upper_dir);
27 if (!
peconv::validate_ptr(modulePtr, moduleSize, data_entry,
sizeof(IMAGE_RESOURCE_DATA_ENTRY))) {
30 LOG_DEBUG(
"Data Offset: %lu : %lu.", data_entry->OffsetToData, data_entry->Size);
31 BYTE* data_ptr = (BYTE*)((ULONGLONG)modulePtr + data_entry->OffsetToData);
35 on_entry(modulePtr, root_dir, data_entry);
40 DWORD offset = entry->OffsetToDirectory;
42 IMAGE_RESOURCE_DIRECTORY* next_dir = (IMAGE_RESOURCE_DIRECTORY*)(offset + (ULONGLONG)upper_dir);
46 return parse_resource_dir(modulePtr, moduleSize, root_dir, upper_dir, next_dir, on_entry, depth);
49 bool parse_resource_dir(BYTE* modulePtr,
const size_t moduleSize,
50 IMAGE_RESOURCE_DIRECTORY_ENTRY* root_dir,
51 const IMAGE_RESOURCE_DIRECTORY* upper_dir,
52 IMAGE_RESOURCE_DIRECTORY* curr_dir,
57 LOG_ERROR(
"Maximum depth exceeded: %lld", (
unsigned long long)depth);
60 size_t total_entries = curr_dir->NumberOfIdEntries + curr_dir->NumberOfNamedEntries;
61 IMAGE_RESOURCE_DIRECTORY_ENTRY* first_entry = (IMAGE_RESOURCE_DIRECTORY_ENTRY*)((ULONGLONG)&curr_dir->NumberOfIdEntries +
sizeof(WORD));
62 for (
size_t i = 0; i < total_entries; i++) {
63 IMAGE_RESOURCE_DIRECTORY_ENTRY* entry = &first_entry[i];
64 if (!
peconv::validate_ptr(modulePtr, moduleSize, entry,
sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY))) {
65 LOG_ERROR(
"Invalid resource entry pointer");
68 LOG_DEBUG(
"Entry: 0x%zx ; Id: %u ; dataOffset: %lu.", i, entry->Id, entry->OffsetToData);
72 parse_resource_entry(modulePtr, moduleSize, root_dir, upper_dir, entry, on_entry, depth + 1);
82 if (!dir || dir->VirtualAddress == 0 || dir->Size == 0) {
85 IMAGE_RESOURCE_DIRECTORY *res_dir = (IMAGE_RESOURCE_DIRECTORY*)(dir->VirtualAddress + (ULONGLONG)modulePtr);
89 return parse_resource_dir(modulePtr, module_size,
nullptr, res_dir, res_dir, on_entry);
#define LOG_DEBUG(fmt,...)
#define LOG_ERROR(fmt,...)
bool parse_resources(BYTE *modulePtr, t_on_res_entry_found on_entry)
bool(* t_on_res_entry_found)(BYTE *modulePtr, IMAGE_RESOURCE_DIRECTORY_ENTRY *root_dir, IMAGE_RESOURCE_DATA_ENTRY *curr_entry)
bool validate_ptr(IN const void *buffer_bgn, IN size_t buffer_size, IN const void *field_bgn, IN size_t field_size)
DWORD get_image_size(IN const BYTE *payload)
IMAGE_DATA_DIRECTORY * get_directory_entry(IN const BYTE *pe_buffer, IN DWORD dir_id, IN bool allow_empty=false)
Wrappers over various fields in the PE header. Read, write, parse PE headers.
Parsing PE's resource directory.