diff options
author | midipix <writeonce@midipix.org> | 2025-06-08 06:49:09 +0000 |
---|---|---|
committer | midipix <writeonce@midipix.org> | 2025-06-08 06:49:09 +0000 |
commit | fd0e2d9dbcaad47b817adbc369d6220b43e5f162 (patch) | |
tree | 8ebc4794c9c85d816dfe005912b69927fabe3fca | |
parent | 6a53014f4a7ba21f359341dae959d0693d887ba7 (diff) | |
download | perk-fd0e2d9dbcaad47b817adbc369d6220b43e5f162.tar.bz2 perk-fd0e2d9dbcaad47b817adbc369d6220b43e5f162.tar.xz |
struct pe_image_meta: added and integrated .r_symtbl and .m_symtbl.
-rw-r--r-- | include/perk/perk.h | 3 | ||||
-rw-r--r-- | src/logic/pe_image_meta_data.c | 25 |
2 files changed, 25 insertions, 3 deletions
diff --git a/include/perk/perk.h b/include/perk/perk.h index 1839282..29030ef 100644 --- a/include/perk/perk.h +++ b/include/perk/perk.h @@ -155,6 +155,7 @@ struct pe_meta_stats { int32_t t_nimplibs; int32_t t_ndsolibs; int32_t t_ndsosyms; + int32_t t_nsymbols; int32_t t_nrelocs; }; @@ -165,6 +166,7 @@ struct pe_image_meta { struct pe_raw_coff_object_hdr * r_obj; union pe_raw_opt_hdr * r_opt; struct pe_raw_sec_hdr * r_sectbl; + struct pe_raw_coff_symbol * r_symtbl; struct pe_raw_export_hdr * r_edata; struct pe_raw_import_hdr * r_idata; @@ -179,6 +181,7 @@ struct pe_image_meta { struct pe_meta_coff_file_hdr m_coff; struct pe_meta_opt_hdr m_opt; struct pe_meta_sec_hdr * m_sectbl; + struct pe_meta_coff_symbol * m_symtbl; struct pe_meta_export_hdr m_edata; struct pe_meta_import_hdr * m_idata; diff --git a/src/logic/pe_image_meta_data.c b/src/logic/pe_image_meta_data.c index 1bbef76..d686a67 100644 --- a/src/logic/pe_image_meta_data.c +++ b/src/logic/pe_image_meta_data.c @@ -343,6 +343,9 @@ int pe_meta_get_image_meta( char * base; uint64_t vaddr; + struct pe_meta_coff_symbol * symrec; + int nrecs; + base = image->map_addr; if (!(m = calloc(1,sizeof(*m)))) @@ -365,15 +368,31 @@ int pe_meta_get_image_meta( m,PERK_CUSTOM_ERROR(dctx,ret)); } - mark = (const unsigned char *)base + m->m_coff.cfh_ptr_to_sym_tbl; - mark += m->m_coff.cfh_size_of_sym_tbl; - if (m->m_coff.cfh_ptr_to_sym_tbl) { + mark = (const unsigned char *)base+ + m->m_coff.cfh_ptr_to_sym_tbl; + m->r_symtbl = (struct pe_raw_coff_symbol *)mark; + mark += m->m_coff.cfh_size_of_sym_tbl; + m->m_coff.cfh_ptr_to_str_tbl = m->m_coff.cfh_ptr_to_sym_tbl; m->m_coff.cfh_ptr_to_str_tbl += m->m_coff.cfh_size_of_sym_tbl; m->m_coff.cfh_size_of_str_tbl = pe_read_long(mark); + } + if ((nrecs = m->m_coff.cfh_size_of_sym_tbl/sizeof(struct pe_raw_coff_symbol))) + if (!(m->m_symtbl = calloc(nrecs+1,sizeof(struct pe_meta_coff_symbol)))) + return PERK_SYSTEM_ERROR(dctx); + + for (i=0,symrec=m->m_symtbl; i<nrecs; i++,symrec++) { + pe_read_coff_symbol( + &m->r_symtbl[i],symrec, + &m->m_coff,base); + + i += m->r_symtbl[i].cs_num_of_aux_recs[0]; + } + + m->m_stats.t_nsymbols = symrec - m->m_symtbl; + if (m->r_dos) { mark = &m->r_coff->cfh_signature[0]; m->r_opt = (union pe_raw_opt_hdr *)(mark + sizeof(*m->r_coff)); |