diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/cmds/pe_cmd_perk.c | 8 | ||||
-rw-r--r-- | src/logic/pe_image_meta_data.c | 9 | ||||
-rw-r--r-- | src/output/pe_output_pecoff_category.c (renamed from src/output/pe_output_image_category.c) | 2 | ||||
-rw-r--r-- | src/output/pe_output_pecoff_sections.c (renamed from src/output/pe_output_image_sections.c) | 76 | ||||
-rw-r--r-- | src/output/pe_output_pecoff_strings.c (renamed from src/output/pe_output_image_strings.c) | 2 | ||||
-rw-r--r-- | src/output/pe_output_pecoff_symbols.c (renamed from src/output/pe_output_image_symbols.c) | 6 |
6 files changed, 86 insertions, 17 deletions
diff --git a/src/cmds/pe_cmd_perk.c b/src/cmds/pe_cmd_perk.c index 6fe6112..bdb6364 100644 --- a/src/cmds/pe_cmd_perk.c +++ b/src/cmds/pe_cmd_perk.c @@ -44,16 +44,16 @@ static void pe_perform_unit_actions_impl( uint64_t flags = dctx->cctx->fmtflags; if (flags & PERK_OUTPUT_IMAGE_CATEGORY) - pe_output_image_category(dctx,meta); + pe_output_pecoff_category(dctx,meta); if (flags & PERK_OUTPUT_IMAGE_SECTIONS) - pe_output_image_sections(dctx,meta); + pe_output_pecoff_sections(dctx,meta); if (flags & PERK_OUTPUT_IMAGE_SYMBOLS) - pe_output_image_symbols(dctx,meta); + pe_output_pecoff_symbols(dctx,meta); if (flags & PERK_OUTPUT_IMAGE_STRINGS) - pe_output_image_strings(dctx,meta); + pe_output_pecoff_strings(dctx,meta); if (flags & PERK_OUTPUT_EXPORT_SYMS) pe_output_export_symbols(dctx,meta); diff --git a/src/logic/pe_image_meta_data.c b/src/logic/pe_image_meta_data.c index b2255d7..b789100 100644 --- a/src/logic/pe_image_meta_data.c +++ b/src/logic/pe_image_meta_data.c @@ -28,6 +28,7 @@ static int pe_free_image_meta_impl(struct pe_image_meta * meta, int ret) free(meta->m_symvec_crc32); free(meta->m_symvec_crc64); + free(meta->m_symvec_symidx); free(meta->m_idata); free(meta->m_symtbl); @@ -404,11 +405,17 @@ int pe_meta_get_image_meta( } - if ((nrecs = m->m_coff.cfh_size_of_sym_tbl/sizeof(struct pe_raw_coff_symbol))) + 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); + if (!(m->m_symvec_symidx = calloc(nrecs,sizeof(struct pe_meta_coff_symbol *)))) + return PERK_SYSTEM_ERROR(dctx); + } + for (i=0,symrec=m->m_symtbl; i<nrecs; i++,symrec++) { + m->m_symvec_symidx[i] = symrec; + pe_read_coff_symbol( &m->r_symtbl[i],symrec, &m->m_coff,base); diff --git a/src/output/pe_output_image_category.c b/src/output/pe_output_pecoff_category.c index bd80687..3d4e5d4 100644 --- a/src/output/pe_output_image_category.c +++ b/src/output/pe_output_pecoff_category.c @@ -12,7 +12,7 @@ #include "perk_dprintf_impl.h" #include "perk_errinfo_impl.h" -int pe_output_image_category( +int pe_output_pecoff_category( const struct pe_driver_ctx * dctx, const struct pe_image_meta * meta) { diff --git a/src/output/pe_output_image_sections.c b/src/output/pe_output_pecoff_sections.c index 9233fef..3ee6fc0 100644 --- a/src/output/pe_output_image_sections.c +++ b/src/output/pe_output_pecoff_sections.c @@ -8,11 +8,46 @@ #include <perk/perk.h> #include <perk/perk_output.h> +#include <perk/perk_consts.h> #include <perk/perk_structs.h> #include "perk_driver_impl.h" #include "perk_dprintf_impl.h" #include "perk_errinfo_impl.h" +static const char * pe_i386_reloc_type_desc[0x16] = { + [PE_IMAGE_REL_I386_ABSOLUTE] = "PE_IMAGE_REL_I386_ABSOLUTE", + [PE_IMAGE_REL_I386_DIR16] = "PE_IMAGE_REL_I386_DIR16", + [PE_IMAGE_REL_I386_REL16] = "PE_IMAGE_REL_I386_REL16", + [PE_IMAGE_REL_I386_DIR32] = "PE_IMAGE_REL_I386_DIR32", + [PE_IMAGE_REL_I386_DIR32NB] = "PE_IMAGE_REL_I386_DIR32NB", + [PE_IMAGE_REL_I386_SEG12] = "PE_IMAGE_REL_I386_SEG12", + [PE_IMAGE_REL_I386_SECTION] = "PE_IMAGE_REL_I386_SECTION", + [PE_IMAGE_REL_I386_SECREL] = "PE_IMAGE_REL_I386_SECREL", + [PE_IMAGE_REL_I386_TOKEN] = "PE_IMAGE_REL_I386_TOKEN", + [PE_IMAGE_REL_I386_SECREL7] = "PE_IMAGE_REL_I386_SECREL7", + [PE_IMAGE_REL_I386_REL32] = "PE_IMAGE_REL_I386_REL32", +}; + +static const char * pe_amd64_reloc_type_desc[0x12] = { + [PE_IMAGE_REL_AMD64_ABSOLUTE] = "PE_IMAGE_REL_AMD64_ABSOLUTE", + [PE_IMAGE_REL_AMD64_ADDR64] = "PE_IMAGE_REL_AMD64_ADDR64", + [PE_IMAGE_REL_AMD64_ADDR32] = "PE_IMAGE_REL_AMD64_ADDR32", + [PE_IMAGE_REL_AMD64_ADDR32NB] = "PE_IMAGE_REL_AMD64_ADDR32NB", + [PE_IMAGE_REL_AMD64_REL32] = "PE_IMAGE_REL_AMD64_REL32", + [PE_IMAGE_REL_AMD64_REL32_1] = "PE_IMAGE_REL_AMD64_REL32_1", + [PE_IMAGE_REL_AMD64_REL32_2] = "PE_IMAGE_REL_AMD64_REL32_2", + [PE_IMAGE_REL_AMD64_REL32_3] = "PE_IMAGE_REL_AMD64_REL32_3", + [PE_IMAGE_REL_AMD64_REL32_4] = "PE_IMAGE_REL_AMD64_REL32_4", + [PE_IMAGE_REL_AMD64_REL32_5] = "PE_IMAGE_REL_AMD64_REL32_5", + [PE_IMAGE_REL_AMD64_SECTION] = "PE_IMAGE_REL_AMD64_SECTION", + [PE_IMAGE_REL_AMD64_SECREL] = "PE_IMAGE_REL_AMD64_SECREL", + [PE_IMAGE_REL_AMD64_SECREL7] = "PE_IMAGE_REL_AMD64_SECREL7", + [PE_IMAGE_REL_AMD64_TOKEN] = "PE_IMAGE_REL_AMD64_TOKEN", + [PE_IMAGE_REL_AMD64_SREL32] = "PE_IMAGE_REL_AMD64_SREL32", + [PE_IMAGE_REL_AMD64_PAIR] = "PE_IMAGE_REL_AMD64_PAIR", + [PE_IMAGE_REL_AMD64_SSPAN32] = "PE_IMAGE_REL_AMD64_SSPAN32", +}; + static int pe_output_section_names( const struct pe_driver_ctx * dctx, const struct pe_image_meta * meta, @@ -47,12 +82,14 @@ static int pe_output_section_names_yaml( static int pe_output_section_record_yaml( int fdout, const struct pe_driver_ctx * dctx, + const struct pe_image_meta * meta, const struct pe_meta_sec_hdr * s, const unsigned char * base) { int i; const struct pe_raw_coff_reloc * r; struct pe_meta_coff_reloc m; + char reltypedesc[64]; if (pe_dprintf(fdout, " - section:\n" @@ -89,17 +126,42 @@ static int pe_output_section_record_yaml( for (i=0; i<s->sh_num_of_relocs; i++) { pe_read_coff_reloc(&r[i],&m); + memset(reltypedesc,0,sizeof(reltypedesc)); + + switch (meta->m_abi) { + case PE_ABI_PE32: + if (m.rel_type <= PE_IMAGE_REL_I386_REL32) + snprintf(reltypedesc,sizeof(reltypedesc), + "0x%04x (%s)", + m.rel_type, + pe_i386_reloc_type_desc[m.rel_type]); + break; + + case PE_ABI_PE64: + if (m.rel_type <= PE_IMAGE_REL_AMD64_SSPAN32) + snprintf(reltypedesc,sizeof(reltypedesc), + "0x%04x (%s)", + m.rel_type, + pe_amd64_reloc_type_desc[m.rel_type]); + break; + + default: + snprintf(reltypedesc,sizeof(reltypedesc), + "0x%04x", + m.rel_type); + } if (pe_dprintf( fdout, " - reloction-record:\n" " - [ rva: 0x%08x ]\n" - " - [ sym: 0x%08x ]\n" - " - [ type: %d ]\n" + " - [ sym: 0x%08x (%s) ]\n" + " - [ type: %s ]\n" "\n", m.rel_rva, m.rel_sym, - m.rel_type) < 0) + meta->m_symvec_symidx[m.rel_sym]->cs_name, + reltypedesc) < 0) return PERK_FILE_ERROR(dctx); } @@ -118,7 +180,7 @@ static int pe_output_section_records_yaml( for (i=0; i<meta->m_coff.cfh_num_of_sections; i++) if (pe_output_section_record_yaml( - fdout,dctx, + fdout,dctx,meta, &meta->m_sectbl[i], meta->r_image.map_addr) < 0) return PERK_NESTED_ERROR(dctx); @@ -126,7 +188,7 @@ static int pe_output_section_records_yaml( return 0; } -static int pe_output_image_sections_yaml( +static int pe_output_pecoff_sections_yaml( const struct pe_driver_ctx * dctx, const struct pe_image_meta * meta, int fdout) @@ -142,14 +204,14 @@ static int pe_output_image_sections_yaml( return 0; } -int pe_output_image_sections( +int pe_output_pecoff_sections( const struct pe_driver_ctx * dctx, const struct pe_image_meta * meta) { int fdout = pe_driver_fdout(dctx); if (dctx->cctx->fmtflags & PERK_PRETTY_YAML) { - if (pe_output_image_sections_yaml(dctx,meta,fdout) < 0) + if (pe_output_pecoff_sections_yaml(dctx,meta,fdout) < 0) return PERK_NESTED_ERROR(dctx); } else { diff --git a/src/output/pe_output_image_strings.c b/src/output/pe_output_pecoff_strings.c index a0ca849..917f655 100644 --- a/src/output/pe_output_image_strings.c +++ b/src/output/pe_output_pecoff_strings.c @@ -14,7 +14,7 @@ #include "perk_dprintf_impl.h" #include "perk_errinfo_impl.h" -int pe_output_image_strings( +int pe_output_pecoff_strings( const struct pe_driver_ctx * dctx, const struct pe_image_meta * meta) { diff --git a/src/output/pe_output_image_symbols.c b/src/output/pe_output_pecoff_symbols.c index 7e5e640..0c2eaa1 100644 --- a/src/output/pe_output_image_symbols.c +++ b/src/output/pe_output_pecoff_symbols.c @@ -261,7 +261,7 @@ static int pe_output_symbol_records_yaml( return 0; } -static int pe_output_image_symbols_yaml( +static int pe_output_pecoff_symbols_yaml( const struct pe_driver_ctx * dctx, const struct pe_image_meta * meta, int fdout) @@ -277,7 +277,7 @@ static int pe_output_image_symbols_yaml( return 0; } -int pe_output_image_symbols( +int pe_output_pecoff_symbols( const struct pe_driver_ctx * dctx, const struct pe_image_meta * meta) { @@ -287,7 +287,7 @@ int pe_output_image_symbols( return 0; if (dctx->cctx->fmtflags & PERK_PRETTY_YAML) { - if (pe_output_image_symbols_yaml(dctx,meta,fdout) < 0) + if (pe_output_pecoff_symbols_yaml(dctx,meta,fdout) < 0) return PERK_NESTED_ERROR(dctx); } else { |