summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authormidipix <writeonce@midipix.org>2025-06-08 06:49:09 +0000
committermidipix <writeonce@midipix.org>2025-06-08 06:49:09 +0000
commitfd0e2d9dbcaad47b817adbc369d6220b43e5f162 (patch)
tree8ebc4794c9c85d816dfe005912b69927fabe3fca
parent6a53014f4a7ba21f359341dae959d0693d887ba7 (diff)
downloadperk-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.h3
-rw-r--r--src/logic/pe_image_meta_data.c25
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));