From 2b1ceecd7c7440937ea975c379ddf1ca5d3b86a3 Mon Sep 17 00:00:00 2001 From: midipix Date: Mon, 16 Jun 2025 03:59:09 +0000 Subject: struct pe_image_meta: added and integrated the .r_reltbl vector member. --- src/logic/pe_image_meta_data.c | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) (limited to 'src/logic/pe_image_meta_data.c') diff --git a/src/logic/pe_image_meta_data.c b/src/logic/pe_image_meta_data.c index b735f44..4850c0a 100644 --- a/src/logic/pe_image_meta_data.c +++ b/src/logic/pe_image_meta_data.c @@ -34,6 +34,9 @@ static int pe_free_image_meta_impl(struct pe_image_meta * meta, int ret) free(meta->m_idata); free(meta->m_symtbl); free(meta->m_sectbl); + + free(meta->r_reltbl); + free(meta); } @@ -404,6 +407,7 @@ int pe_meta_get_image_meta( void * addr; char * sptr; unsigned char * base; + const unsigned char * rtbl; const unsigned char * mark; const unsigned char * cap; uint64_t vaddr; @@ -579,18 +583,23 @@ int pe_meta_get_image_meta( if (s >= 0) { - mark = image->map_addr; - mark += m->m_sectbl[s].sh_ptr_to_raw_data; - mark += m->m_opt.oh_dirs.coh_base_reloc_tbl.dh_rva; - mark -= m->m_sectbl[s].sh_virtual_addr; + rtbl = image->map_addr; + rtbl += m->m_sectbl[s].sh_ptr_to_raw_data; + rtbl += m->m_opt.oh_dirs.coh_base_reloc_tbl.dh_rva; + rtbl -= m->m_sectbl[s].sh_virtual_addr; + + mark = rtbl; cap = &mark[m->m_sectbl[s].sh_virtual_size]; } else if (i >= 0) { - mark = image->map_addr; - mark += m->m_sectbl[i].sh_ptr_to_raw_data; + rtbl = image->map_addr; + rtbl += m->m_sectbl[i].sh_ptr_to_raw_data; + + mark = rtbl; cap = &mark[m->m_sectbl[s].sh_virtual_size]; } else { + rtbl = 0; mark = 0; cap = 0; } @@ -616,6 +625,18 @@ int pe_meta_get_image_meta( } + if (m->m_stats.t_nrelblks) + if (!(m->r_reltbl = calloc( + m->m_stats.t_nrelblks + 1, + sizeof(m->r_reltbl[0])))) + return PERK_SYSTEM_ERROR(dctx); + + for (i=0,mark=rtbl; im_stats.t_nrelblks; i++) { + m->r_reltbl[i] = (struct pe_raw_base_reloc_blk *)mark; + mark += pe_read_long(m->r_reltbl[i]->blk_size); + } + + /* .edata */ i = pe_get_named_section_index(m,".edata"); s = pe_get_block_section_index(m,&m->m_opt.oh_dirs.coh_export_tbl); -- cgit v1.2.3