From c55c60549ed4ecb9c9053bfa4047df465f063a96 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 12 May 2025 15:59:42 -0700 Subject: [PATCH] export virtual ranges for data directories --- src/pe/pe.c | 18 ++++++++++++++++++ src/pe/pe.h | 1 + 2 files changed, 19 insertions(+) diff --git a/src/pe/pe.c b/src/pe/pe.c index 417fdc1c..50214f2c 100644 --- a/src/pe/pe.c +++ b/src/pe/pe.c @@ -495,6 +495,7 @@ pe_bin_info_from_data(Arena *arena, String8 data) U64 file_section_align = 0; Rng1U64 data_dir_range = {0}; Rng1U64 *data_dir_franges = 0; + Rng1U64 *data_dir_vranges = 0; if(valid && optional_size > 0) { // rjf: read magic number @@ -566,6 +567,22 @@ pe_bin_info_from_data(Arena *arena, String8 data) } } + // export virtual directory ranges + data_dir_vranges = push_array(arena, Rng1U64, data_dir_count); + for(U32 dir_idx = 0; dir_idx < data_dir_count; dir_idx += 1) + { + U64 dir_offset = optional_range.min + reported_data_dir_offset + sizeof(PE_DataDirectory)*dir_idx; + PE_DataDirectory dir = {0}; + if(str8_deserial_read_struct(data, dir_offset, &dir) == sizeof(dir)) + { + data_dir_vranges[dir_idx] = r1u64(dir.virt_off, dir.virt_off+dir.virt_size); + } + else + { + Assert(!"unable to read data directory"); + } + } + // export directory range data_dir_range = rng_1u64(optional_range.min + reported_data_dir_offset, optional_range.min + reported_data_dir_offset + data_dir_count * sizeof(PE_DataDirectory)); } @@ -625,6 +642,7 @@ pe_bin_info_from_data(Arena *arena, String8 data) info.string_table_range = rng_1u64(string_table_off, data.size); info.data_dir_range = data_dir_range; info.data_dir_franges = data_dir_franges; + info.data_dir_vranges = data_dir_vranges; info.data_dir_count = data_dir_count; info.tls_header = tls_header; } diff --git a/src/pe/pe.h b/src/pe/pe.h index 3cb49bb9..088b8775 100644 --- a/src/pe/pe.h +++ b/src/pe/pe.h @@ -1008,6 +1008,7 @@ struct PE_BinInfo Rng1U64 string_table_range; Rng1U64 data_dir_range; Rng1U64 *data_dir_franges; + Rng1U64 *data_dir_vranges; U32 data_dir_count; PE_TLSHeader64 tls_header; };