diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/crc/pe_crc32.c | 32 | ||||
-rw-r--r-- | src/crc/pe_crc64.c | 32 | ||||
-rw-r--r-- | src/hexdump/pe_hexdump_coff_image_hdr.c | 2 | ||||
-rw-r--r-- | src/hexdump/pe_hexdump_coff_object_hdr.c | 2 | ||||
-rw-r--r-- | src/logic/pe_image_meta_data.c | 4 | ||||
-rw-r--r-- | src/output/pe_output_image_symbols.c | 6 | ||||
-rw-r--r-- | src/reader/pe_read_coff_header.c | 8 | ||||
-rw-r--r-- | src/reader/pe_read_coff_symbol.c | 8 |
8 files changed, 82 insertions, 12 deletions
diff --git a/src/crc/pe_crc32.c b/src/crc/pe_crc32.c new file mode 100644 index 0000000..a2cfdd5 --- /dev/null +++ b/src/crc/pe_crc32.c @@ -0,0 +1,32 @@ +/***************************************************************/ +/* perk: PE Resource Kit */ +/* Copyright (C) 2015--2025 SysDeer Technologies, LLC */ +/* Released under GPLv2 and GPLv3; see COPYING.PERK. */ +/***************************************************************/ + +#include <stdint.h> +#include <unistd.h> + +#include <perk/perk.h> +#include <perk/perk_crc32.h> + +static const uint32_t crc32_table[256] = PERK_CRC32_TABLE; + +uint32_t pe_hash_mbstr_crc32(const unsigned char * str, size_t * symlen) +{ + const unsigned char * ch; + uint32_t crc32; + + crc32 = 0 ^ 0xFFFFFFFF; + ch = str; + + while (*ch) { + crc32 = (crc32 >> 8) ^ crc32_table[(crc32 ^ *ch) & 0xFF]; + ch++; + } + + if (symlen) + *symlen = ch - str; + + return (crc32 ^ 0xFFFFFFFF); +} diff --git a/src/crc/pe_crc64.c b/src/crc/pe_crc64.c new file mode 100644 index 0000000..8296432 --- /dev/null +++ b/src/crc/pe_crc64.c @@ -0,0 +1,32 @@ +/***************************************************************/ +/* perk: PE Resource Kit */ +/* Copyright (C) 2015--2025 SysDeer Technologies, LLC */ +/* Released under GPLv2 and GPLv3; see COPYING.PERK. */ +/***************************************************************/ + +#include <stdint.h> +#include <unistd.h> + +#include <perk/perk.h> +#include <perk/perk_crc64.h> + +static const uint64_t crc64_table[256] = PERK_CRC64_TABLE; + +uint64_t pe_hash_mbstr_crc64(const unsigned char * str, size_t * symlen) +{ + const unsigned char * ch; + uint64_t crc64; + + crc64 = 0 ^ 0xFFFFFFFFFFFFFFFF; + ch = str; + + while (*ch) { + crc64 = (crc64 >> 8) ^ crc64_table[(crc64 ^ *ch) & 0xFF]; + ch++; + } + + if (symlen) + *symlen = ch - str; + + return (crc64 ^ 0xFFFFFFFFFFFFFFFF); +} diff --git a/src/hexdump/pe_hexdump_coff_image_hdr.c b/src/hexdump/pe_hexdump_coff_image_hdr.c index c52d8d7..606ae38 100644 --- a/src/hexdump/pe_hexdump_coff_image_hdr.c +++ b/src/hexdump/pe_hexdump_coff_image_hdr.c @@ -50,7 +50,7 @@ int pe_hexdump_coff_image_hdr( ch += PE_OUTPUT(cfh_num_of_sections); ch += PE_OUTPUT(cfh_time_date_stamp); ch += PE_OUTPUT(cfh_ptr_to_sym_tbl); - ch += PE_OUTPUT(cfh_num_of_syms); + ch += PE_OUTPUT(cfh_num_of_sym_recs); ch += PE_OUTPUT(cfh_size_of_opt_hdr); ch += PE_OUTPUT(cfh_characteristics); diff --git a/src/hexdump/pe_hexdump_coff_object_hdr.c b/src/hexdump/pe_hexdump_coff_object_hdr.c index 083d85d..fa7fea3 100644 --- a/src/hexdump/pe_hexdump_coff_object_hdr.c +++ b/src/hexdump/pe_hexdump_coff_object_hdr.c @@ -49,7 +49,7 @@ int pe_hexdump_coff_object_hdr( ch += PE_OUTPUT(cfh_num_of_sections); ch += PE_OUTPUT(cfh_time_date_stamp); ch += PE_OUTPUT(cfh_ptr_to_sym_tbl); - ch += PE_OUTPUT(cfh_num_of_syms); + ch += PE_OUTPUT(cfh_num_of_sym_recs); ch += PE_OUTPUT(cfh_size_of_opt_hdr); ch += PE_OUTPUT(cfh_characteristics); diff --git a/src/logic/pe_image_meta_data.c b/src/logic/pe_image_meta_data.c index 9753487..ad2098e 100644 --- a/src/logic/pe_image_meta_data.c +++ b/src/logic/pe_image_meta_data.c @@ -366,11 +366,11 @@ int pe_meta_get_image_meta( } mark = (const unsigned char *)base + m->m_coff.cfh_ptr_to_sym_tbl; - mark += m->m_coff.cfh_num_of_syms * sizeof(struct pe_raw_coff_symbol); + mark += m->m_coff.cfh_size_of_sym_tbl; if (m->m_coff.cfh_ptr_to_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_num_of_syms * sizeof(struct pe_raw_coff_symbol); + 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); } diff --git a/src/output/pe_output_image_symbols.c b/src/output/pe_output_image_symbols.c index 8305b1c..ca4445c 100644 --- a/src/output/pe_output_image_symbols.c +++ b/src/output/pe_output_image_symbols.c @@ -20,6 +20,7 @@ int pe_output_image_symbols( const struct pe_image_meta * meta) { unsigned i; + unsigned nrecs; int fdout; char * mark; struct pe_raw_coff_symbol * symtbl; @@ -27,6 +28,7 @@ int pe_output_image_symbols( const char * dash = ""; fdout = pe_driver_fdout(dctx); + nrecs = meta->m_coff.cfh_size_of_sym_tbl / sizeof(struct pe_raw_coff_symbol); if (dctx->cctx->fmtflags & PERK_PRETTY_YAML) { if (pe_dprintf(fdout,"symbols:\n") < 0) @@ -38,7 +40,7 @@ int pe_output_image_symbols( mark = (char *)meta->r_image.map_addr; symtbl = (struct pe_raw_coff_symbol *)(mark + meta->m_coff.cfh_ptr_to_sym_tbl); - for (i=0; i<meta->m_coff.cfh_num_of_syms; i++) { + for (i=0; i<nrecs; i++) { pe_read_coff_symbol( &symtbl[i],&symrec, &meta->m_coff,meta->r_image.map_addr); @@ -46,7 +48,7 @@ int pe_output_image_symbols( if (pe_dprintf(fdout,"%s%s\n",dash,symrec.cs_name) < 0) return PERK_FILE_ERROR(dctx); - i += symtbl[i].cs_num_of_aux_symbols[0]; + i += symtbl[i].cs_num_of_aux_recs[0]; } return 0; diff --git a/src/reader/pe_read_coff_header.c b/src/reader/pe_read_coff_header.c index 493d622..032a995 100644 --- a/src/reader/pe_read_coff_header.c +++ b/src/reader/pe_read_coff_header.c @@ -28,7 +28,9 @@ int pe_read_coff_header(const struct pe_raw_coff_image_hdr * p, struct pe_meta_c m->cfh_time_date_stamp = pe_read_long(p->cfh_time_date_stamp); m->cfh_ptr_to_sym_tbl = pe_read_long(p->cfh_ptr_to_sym_tbl); - m->cfh_num_of_syms = pe_read_long(p->cfh_num_of_syms); + + m->cfh_size_of_sym_tbl = pe_read_long(p->cfh_num_of_sym_recs); + m->cfh_size_of_sym_tbl *= sizeof(struct pe_raw_coff_symbol); m->cfh_size_of_opt_hdr = pe_read_short(p->cfh_size_of_opt_hdr); m->cfh_characteristics = pe_read_short(p->cfh_characteristics); @@ -99,7 +101,9 @@ int pe_read_object_header(const struct pe_raw_coff_object_hdr * p, struct pe_met m->cfh_time_date_stamp = pe_read_long(p->cfh_time_date_stamp); m->cfh_ptr_to_sym_tbl = pe_read_long(p->cfh_ptr_to_sym_tbl); - m->cfh_num_of_syms = pe_read_long(p->cfh_num_of_syms); + + m->cfh_size_of_sym_tbl = pe_read_long(p->cfh_num_of_sym_recs); + m->cfh_size_of_sym_tbl *= sizeof(struct pe_raw_coff_symbol); m->cfh_size_of_opt_hdr = pe_read_short(p->cfh_size_of_opt_hdr); m->cfh_characteristics = pe_read_short(p->cfh_characteristics); diff --git a/src/reader/pe_read_coff_symbol.c b/src/reader/pe_read_coff_symbol.c index 41dc071..9e2dc89 100644 --- a/src/reader/pe_read_coff_symbol.c +++ b/src/reader/pe_read_coff_symbol.c @@ -27,23 +27,23 @@ int pe_read_coff_symbol( m->cs_section_number = pe_read_short(p->cs_section_number); m->cs_type = pe_read_short(p->cs_type); m->cs_storage_class = p->cs_storage_class[0]; - m->cs_num_of_aux_symbols = p->cs_num_of_aux_symbols[0]; + m->cs_num_of_aux_recs = p->cs_num_of_aux_recs[0]; m->cs_aux_recs = 0; memset(m->cs_name_buf,0,sizeof(m->cs_name_buf)); - if (m->cs_num_of_aux_symbols) + if (m->cs_num_of_aux_recs) m->cs_aux_recs = &p[1].cs_name[0]; if (p->cs_storage_class[0] == PE_IMAGE_SYM_CLASS_FILE) - if (p->cs_num_of_aux_symbols[0]) + if (p->cs_num_of_aux_recs[0]) if (!p[1].cs_value[0]) bias = 1; p += bias; if (!bias && (p->cs_storage_class[0] == PE_IMAGE_SYM_CLASS_FILE) - && p->cs_num_of_aux_symbols[0]) { + && p->cs_num_of_aux_recs[0]) { memcpy(m->cs_name_buf,p[1].cs_name,sizeof(*p)); } else if (p->cs_name[0]) { |