diff options
author | midipix <writeonce@midipix.org> | 2025-06-16 03:59:09 +0000 |
---|---|---|
committer | midipix <writeonce@midipix.org> | 2025-06-16 03:59:09 +0000 |
commit | 2b1ceecd7c7440937ea975c379ddf1ca5d3b86a3 (patch) | |
tree | f67db9f4f18be660f2422dd956dbfbaaa2128126 /src/logic/pe_image_meta_data.c | |
parent | 385f4beb4321037ed294a0927c39d3c10faf4700 (diff) | |
download | perk-2b1ceecd7c7440937ea975c379ddf1ca5d3b86a3.tar.bz2 perk-2b1ceecd7c7440937ea975c379ddf1ca5d3b86a3.tar.xz |
Diffstat (limited to 'src/logic/pe_image_meta_data.c')
-rw-r--r-- | src/logic/pe_image_meta_data.c | 33 |
1 files changed, 27 insertions, 6 deletions
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; i<m->m_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); |