From 9e2275f12aea1d90c206ea597f42cdd82f9a38ae Mon Sep 17 00:00:00 2001 From: midipix Date: Fri, 30 May 2025 22:16:01 +0000 Subject: library api: _hexdump_ (header and section pretty printing) namespace overhaul. --- src/cmds/pe_cmd_perk.c | 14 +- src/hdrdump/pe_hdrdump_coff_image_hdr.c | 65 --------- src/hdrdump/pe_hdrdump_coff_object_hdr.c | 64 --------- src/hdrdump/pe_hdrdump_coff_opt_hdr.c | 211 --------------------------- src/hdrdump/pe_hdrdump_export_hdr.c | 68 --------- src/hdrdump/pe_hdrdump_image_dos_hdr.c | 76 ---------- src/hdrdump/pe_hdrdump_import_tbl.c | 109 -------------- src/hdrdump/pe_hdrdump_sec_tbl.c | 83 ----------- src/hexdump/pe_hexdump_coff_image_hdr.c | 65 +++++++++ src/hexdump/pe_hexdump_coff_object_hdr.c | 64 +++++++++ src/hexdump/pe_hexdump_coff_opt_hdr.c | 211 +++++++++++++++++++++++++++ src/hexdump/pe_hexdump_export_hdr.c | 68 +++++++++ src/hexdump/pe_hexdump_image_dos_hdr.c | 76 ++++++++++ src/hexdump/pe_hexdump_import_tbl.c | 109 ++++++++++++++ src/hexdump/pe_hexdump_sec_tbl.c | 83 +++++++++++ src/internal/perk_hdrdump_impl.c | 237 ------------------------------- src/internal/perk_hdrdump_impl.h | 63 -------- src/internal/perk_hexdump_impl.c | 237 +++++++++++++++++++++++++++++++ src/internal/perk_hexdump_impl.h | 63 ++++++++ 19 files changed, 983 insertions(+), 983 deletions(-) delete mode 100644 src/hdrdump/pe_hdrdump_coff_image_hdr.c delete mode 100644 src/hdrdump/pe_hdrdump_coff_object_hdr.c delete mode 100644 src/hdrdump/pe_hdrdump_coff_opt_hdr.c delete mode 100644 src/hdrdump/pe_hdrdump_export_hdr.c delete mode 100644 src/hdrdump/pe_hdrdump_image_dos_hdr.c delete mode 100644 src/hdrdump/pe_hdrdump_import_tbl.c delete mode 100644 src/hdrdump/pe_hdrdump_sec_tbl.c create mode 100644 src/hexdump/pe_hexdump_coff_image_hdr.c create mode 100644 src/hexdump/pe_hexdump_coff_object_hdr.c create mode 100644 src/hexdump/pe_hexdump_coff_opt_hdr.c create mode 100644 src/hexdump/pe_hexdump_export_hdr.c create mode 100644 src/hexdump/pe_hexdump_image_dos_hdr.c create mode 100644 src/hexdump/pe_hexdump_import_tbl.c create mode 100644 src/hexdump/pe_hexdump_sec_tbl.c delete mode 100644 src/internal/perk_hdrdump_impl.c delete mode 100644 src/internal/perk_hdrdump_impl.h create mode 100644 src/internal/perk_hexdump_impl.c create mode 100644 src/internal/perk_hexdump_impl.h (limited to 'src') diff --git a/src/cmds/pe_cmd_perk.c b/src/cmds/pe_cmd_perk.c index 0ae6656..5b6f371 100644 --- a/src/cmds/pe_cmd_perk.c +++ b/src/cmds/pe_cmd_perk.c @@ -16,25 +16,25 @@ static void pe_perform_hdrdump_actions( const struct pe_unit_ctx * uctx) { if (dctx->cctx->hdrdump & PERK_HDRDUMP_IMAGE_DOS_HEADER) - pe_hdrdump_image_dos_hdr(dctx,uctx->meta); + pe_hexdump_image_dos_hdr(dctx,uctx->meta); if (dctx->cctx->hdrdump & PERK_HDRDUMP_COFF_IMAGE_HEADER) - pe_hdrdump_coff_image_hdr(dctx,uctx->meta); + pe_hexdump_coff_image_hdr(dctx,uctx->meta); if (dctx->cctx->hdrdump & PERK_HDRDUMP_COFF_OBJECT_HEADER) - pe_hdrdump_coff_object_hdr(dctx,uctx->meta); + pe_hexdump_coff_object_hdr(dctx,uctx->meta); if (dctx->cctx->hdrdump & PERK_HDRDUMP_COFF_OPT_HEADER) - pe_hdrdump_coff_opt_hdr(dctx,uctx->meta); + pe_hexdump_coff_opt_hdr(dctx,uctx->meta); if (dctx->cctx->hdrdump & PERK_HDRDUMP_SECTION_TABLE) - pe_hdrdump_sec_tbl(dctx,uctx->meta); + pe_hexdump_sec_tbl(dctx,uctx->meta); if (dctx->cctx->hdrdump & PERK_HDRDUMP_EXPORT_HEADER) - pe_hdrdump_export_hdr(dctx,uctx->meta); + pe_hexdump_export_hdr(dctx,uctx->meta); if (dctx->cctx->hdrdump & PERK_HDRDUMP_IMPORT_TABLE) - pe_hdrdump_import_tbl(dctx,uctx->meta); + pe_hexdump_import_tbl(dctx,uctx->meta); } static void pe_perform_unit_actions( diff --git a/src/hdrdump/pe_hdrdump_coff_image_hdr.c b/src/hdrdump/pe_hdrdump_coff_image_hdr.c deleted file mode 100644 index 3ce0e2c..0000000 --- a/src/hdrdump/pe_hdrdump_coff_image_hdr.c +++ /dev/null @@ -1,65 +0,0 @@ -/***************************************************************/ -/* perk: PE Resource Kit */ -/* Copyright (C) 2015--2021 SysDeer Technologies, LLC */ -/* Released under GPLv2 and GPLv3; see COPYING.PERK. */ -/***************************************************************/ - -#include - -#include -#include -#include -#include -#include "perk_driver_impl.h" -#include "perk_hdrdump_impl.h" -#include "perk_dprintf_impl.h" -#include "perk_errinfo_impl.h" - -#define PE_ADDR meta->r_coff -#define PE_RAW_STRUCT coff_image_hdr -#define PE_OUTPUT(x) PE_OUTPUT_TABLE(x) - -int pe_hdrdump_coff_image_hdr( - const struct pe_driver_ctx * dctx, - const struct pe_image_meta * meta) -{ - int bits; - uint64_t faddr; - uint64_t vaddr; - char * ch; - char buf[8192]; - - if (!PE_ADDR) - return 0; - - if ((bits = pe_image_bits(meta)) < 0) - return PERK_CUSTOM_ERROR( - dctx,PERK_ERR_UNSUPPORTED_ABI); - - faddr = (char *)(PE_ADDR) - (char *)meta->r_image.map_addr; - vaddr = meta->m_opt.oh_mem.coh_image_base + faddr; - - ch = buf; - ch += pe_output_hex_header( - ch, - "struct pe_raw_coff_image_hdr", - faddr,vaddr,bits); - - ch += PE_OUTPUT(cfh_signature); - ch += PE_OUTPUT(cfh_machine); - 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_size_of_opt_hdr); - ch += PE_OUTPUT(cfh_characteristics); - - ch += pe_output_hex_footer(ch); - - *ch = 0; - - if (pe_dprintf(pe_driver_fdout(dctx),"%s",buf) < 0) - return PERK_FILE_ERROR(dctx); - - return 0; -} diff --git a/src/hdrdump/pe_hdrdump_coff_object_hdr.c b/src/hdrdump/pe_hdrdump_coff_object_hdr.c deleted file mode 100644 index 0011a34..0000000 --- a/src/hdrdump/pe_hdrdump_coff_object_hdr.c +++ /dev/null @@ -1,64 +0,0 @@ -/***************************************************************/ -/* perk: PE Resource Kit */ -/* Copyright (C) 2015--2021 SysDeer Technologies, LLC */ -/* Released under GPLv2 and GPLv3; see COPYING.PERK. */ -/***************************************************************/ - -#include - -#include -#include -#include -#include -#include "perk_driver_impl.h" -#include "perk_hdrdump_impl.h" -#include "perk_dprintf_impl.h" -#include "perk_errinfo_impl.h" - -#define PE_ADDR meta->r_obj -#define PE_RAW_STRUCT coff_object_hdr -#define PE_OUTPUT(x) PE_OUTPUT_TABLE(x) - -int pe_hdrdump_coff_object_hdr( - const struct pe_driver_ctx * dctx, - const struct pe_image_meta * meta) -{ - int bits; - uint64_t faddr; - uint64_t vaddr; - char * ch; - char buf[8192]; - - if (!PE_ADDR) - return 0; - - if ((bits = pe_image_bits(meta)) < 0) - return PERK_CUSTOM_ERROR( - dctx,PERK_ERR_UNSUPPORTED_ABI); - - faddr = (char *)(PE_ADDR) - (char *)meta->r_image.map_addr; - vaddr = meta->m_opt.oh_mem.coh_image_base + faddr; - - ch = buf; - ch += pe_output_hex_header( - ch, - "struct pe_raw_coff_object_hdr", - faddr,vaddr,bits); - - ch += PE_OUTPUT(cfh_machine); - 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_size_of_opt_hdr); - ch += PE_OUTPUT(cfh_characteristics); - - ch += pe_output_hex_footer(ch); - - *ch = 0; - - if (pe_dprintf(pe_driver_fdout(dctx),"%s",buf) < 0) - return PERK_FILE_ERROR(dctx); - - return 0; -} diff --git a/src/hdrdump/pe_hdrdump_coff_opt_hdr.c b/src/hdrdump/pe_hdrdump_coff_opt_hdr.c deleted file mode 100644 index fbec549..0000000 --- a/src/hdrdump/pe_hdrdump_coff_opt_hdr.c +++ /dev/null @@ -1,211 +0,0 @@ -/***************************************************************/ -/* perk: PE Resource Kit */ -/* Copyright (C) 2015--2021 SysDeer Technologies, LLC */ -/* Released under GPLv2 and GPLv3; see COPYING.PERK. */ -/***************************************************************/ - -#include - -#include -#include -#include -#include -#include "perk_driver_impl.h" -#include "perk_hdrdump_impl.h" -#include "perk_dprintf_impl.h" -#include "perk_errinfo_impl.h" - -#define PE_ADDR &meta->r_opt->opt_hdr_32 -#define PE_RAW_STRUCT opt_hdr_32 -#define PE_OUTPUT(x) PE_OUTPUT_TABLE(x) - -static int pe_hdrdump_opt_hdr_32( - const struct pe_driver_ctx * dctx, - const struct pe_image_meta * meta) -{ - void * uaddr; - const char * haddr; - const char * maddr; - uintptr_t faddr; - uintptr_t vaddr; - char * ch; - char buf[8192]; - - uaddr = &meta->r_opt->opt_hdr_32; - maddr = meta->r_image.map_addr; - - haddr = uaddr; - faddr = haddr - maddr; - vaddr = meta->m_opt.oh_mem.coh_image_base + faddr; - - ch = buf; - ch += pe_output_hex_header( - ch, - "struct pe_raw_opt_hdr_32", - faddr,vaddr,32); - - ch += PE_OUTPUT(coh_magic); - ch += PE_OUTPUT(coh_major_linker_ver); - ch += PE_OUTPUT(coh_minor_linker_ver); - ch += PE_OUTPUT(coh_size_of_code); - ch += PE_OUTPUT(coh_size_of_inited_data); - ch += PE_OUTPUT(coh_size_of_uninited_data); - ch += PE_OUTPUT(coh_entry_point); - ch += PE_OUTPUT(coh_base_of_code); - ch += PE_OUTPUT(coh_base_of_data); - ch += PE_OUTPUT(coh_image_base); - ch += PE_OUTPUT(coh_section_align); - ch += PE_OUTPUT(coh_file_align); - ch += PE_OUTPUT(coh_major_os_ver); - ch += PE_OUTPUT(coh_minor_os_ver); - ch += PE_OUTPUT(coh_major_image_ver); - ch += PE_OUTPUT(coh_minor_image_ver); - ch += PE_OUTPUT(coh_major_subsys_ver); - ch += PE_OUTPUT(coh_minor_subsys_ver); - ch += PE_OUTPUT(coh_win32_ver); - ch += PE_OUTPUT(coh_size_of_image); - ch += PE_OUTPUT(coh_size_of_headers); - ch += PE_OUTPUT(coh_checksum); - ch += PE_OUTPUT(coh_subsystem); - ch += PE_OUTPUT(coh_dll_characteristics); - ch += PE_OUTPUT(coh_size_of_stack_reserve); - ch += PE_OUTPUT(coh_size_of_stack_commit); - ch += PE_OUTPUT(coh_size_of_heap_reserve); - ch += PE_OUTPUT(coh_size_of_heap_commit); - ch += PE_OUTPUT(coh_loader_flags); - ch += PE_OUTPUT(coh_rva_and_sizes); - ch += PE_OUTPUT(coh_export_tbl); - ch += PE_OUTPUT(coh_import_tbl); - ch += PE_OUTPUT(coh_resource_tbl); - ch += PE_OUTPUT(coh_exception_tbl); - ch += PE_OUTPUT(coh_certificate_tbl); - ch += PE_OUTPUT(coh_base_reloc_tbl); - ch += PE_OUTPUT(coh_debug); - ch += PE_OUTPUT(coh_arch); - ch += PE_OUTPUT(coh_global_ptr); - ch += PE_OUTPUT(coh_tls_tbl); - ch += PE_OUTPUT(coh_load_config_tbl); - ch += PE_OUTPUT(coh_bound_import); - ch += PE_OUTPUT(coh_iat); - ch += PE_OUTPUT(coh_delay_import_descriptor); - ch += PE_OUTPUT(coh_clr_runtime_hdr); - ch += PE_OUTPUT(coh_reserved); - - ch += pe_output_hex_footer(ch); - - *ch = 0; - - if (pe_dprintf(pe_driver_fdout(dctx),"%s",buf) < 0) - return PERK_FILE_ERROR(dctx); - - return 0; -} - -#undef PE_ADDR -#undef PE_RAW_STRUCT -#undef PE_OUTPUT - -#define PE_ADDR &meta->r_opt->opt_hdr_64 -#define PE_RAW_STRUCT opt_hdr_64 -#define PE_OUTPUT(x) PE_OUTPUT_TABLE(x) - -static int pe_hdrdump_opt_hdr_64( - const struct pe_driver_ctx * dctx, - const struct pe_image_meta * meta) -{ - void * uaddr; - const char * haddr; - const char * maddr; - uintptr_t faddr; - uintptr_t vaddr; - char * ch; - char buf[8192]; - - uaddr = PE_ADDR; - maddr = meta->r_image.map_addr; - - haddr = uaddr; - faddr = haddr - maddr; - vaddr = meta->m_opt.oh_mem.coh_image_base + faddr; - - ch = buf; - ch += pe_output_hex_header( - ch, - "struct pe_raw_opt_hdr_64", - faddr,vaddr,64); - - ch += PE_OUTPUT(coh_magic); - ch += PE_OUTPUT(coh_major_linker_ver); - ch += PE_OUTPUT(coh_minor_linker_ver); - ch += PE_OUTPUT(coh_size_of_code); - ch += PE_OUTPUT(coh_size_of_inited_data); - ch += PE_OUTPUT(coh_size_of_uninited_data); - ch += PE_OUTPUT(coh_entry_point); - ch += PE_OUTPUT(coh_base_of_code); - ch += PE_OUTPUT(coh_image_base); - ch += PE_OUTPUT(coh_section_align); - ch += PE_OUTPUT(coh_file_align); - ch += PE_OUTPUT(coh_major_os_ver); - ch += PE_OUTPUT(coh_minor_os_ver); - ch += PE_OUTPUT(coh_major_image_ver); - ch += PE_OUTPUT(coh_minor_image_ver); - ch += PE_OUTPUT(coh_major_subsys_ver); - ch += PE_OUTPUT(coh_minor_subsys_ver); - ch += PE_OUTPUT(coh_win32_ver); - ch += PE_OUTPUT(coh_size_of_image); - ch += PE_OUTPUT(coh_size_of_headers); - ch += PE_OUTPUT(coh_checksum); - ch += PE_OUTPUT(coh_subsystem); - ch += PE_OUTPUT(coh_dll_characteristics); - ch += PE_OUTPUT(coh_size_of_stack_reserve); - ch += PE_OUTPUT(coh_size_of_stack_commit); - ch += PE_OUTPUT(coh_size_of_heap_reserve); - ch += PE_OUTPUT(coh_size_of_heap_commit); - ch += PE_OUTPUT(coh_loader_flags); - ch += PE_OUTPUT(coh_rva_and_sizes); - ch += PE_OUTPUT(coh_export_tbl); - ch += PE_OUTPUT(coh_import_tbl); - ch += PE_OUTPUT(coh_resource_tbl); - ch += PE_OUTPUT(coh_exception_tbl); - ch += PE_OUTPUT(coh_certificate_tbl); - ch += PE_OUTPUT(coh_base_reloc_tbl); - ch += PE_OUTPUT(coh_debug); - ch += PE_OUTPUT(coh_arch); - ch += PE_OUTPUT(coh_global_ptr); - ch += PE_OUTPUT(coh_tls_tbl); - ch += PE_OUTPUT(coh_load_config_tbl); - ch += PE_OUTPUT(coh_bound_import); - ch += PE_OUTPUT(coh_iat); - ch += PE_OUTPUT(coh_delay_import_descriptor); - ch += PE_OUTPUT(coh_clr_runtime_hdr); - ch += PE_OUTPUT(coh_reserved); - - ch += pe_output_hex_footer(ch); - - *ch = 0; - - if (pe_dprintf(pe_driver_fdout(dctx),"%s",buf) < 0) - return PERK_FILE_ERROR(dctx); - - return 0; -} - -int pe_hdrdump_coff_opt_hdr( - const struct pe_driver_ctx * dctx, - const struct pe_image_meta * meta) -{ - if (!meta->r_opt) - return 0; - - switch (pe_image_bits(meta)) { - case 32: - return pe_hdrdump_opt_hdr_32(dctx,meta); - - case 64: - return pe_hdrdump_opt_hdr_64(dctx,meta); - - default: - return PERK_CUSTOM_ERROR( - dctx,PERK_ERR_UNSUPPORTED_ABI); - } -} diff --git a/src/hdrdump/pe_hdrdump_export_hdr.c b/src/hdrdump/pe_hdrdump_export_hdr.c deleted file mode 100644 index a413097..0000000 --- a/src/hdrdump/pe_hdrdump_export_hdr.c +++ /dev/null @@ -1,68 +0,0 @@ -/***************************************************************/ -/* perk: PE Resource Kit */ -/* Copyright (C) 2015--2021 SysDeer Technologies, LLC */ -/* Released under GPLv2 and GPLv3; see COPYING.PERK. */ -/***************************************************************/ - -#include - -#include -#include -#include -#include -#include "perk_driver_impl.h" -#include "perk_hdrdump_impl.h" -#include "perk_dprintf_impl.h" -#include "perk_errinfo_impl.h" - -#define PE_ADDR meta->r_edata -#define PE_RAW_STRUCT export_hdr -#define PE_OUTPUT(x) PE_OUTPUT_TABLE(x) - -int pe_hdrdump_export_hdr( - const struct pe_driver_ctx * dctx, - const struct pe_image_meta * meta) -{ - int bits; - uint64_t faddr; - uint64_t vaddr; - char * ch; - char buf[8192]; - - if (!PE_ADDR) - return 0; - - if ((bits = pe_image_bits(meta)) < 0) - return PERK_CUSTOM_ERROR( - dctx,PERK_ERR_UNSUPPORTED_ABI); - - faddr = (char *)(PE_ADDR) - (char *)meta->r_image.map_addr; - vaddr = meta->m_opt.oh_mem.coh_image_base + meta->m_edata.eh_virtual_addr; - - ch = buf; - ch += pe_output_hex_header( - ch, - "struct pe_raw_export_hdr", - faddr,vaddr,bits); - - ch += PE_OUTPUT(eh_export_flags); - ch += PE_OUTPUT(eh_time_date_stamp); - ch += PE_OUTPUT(eh_major_ver); - ch += PE_OUTPUT(eh_minor_ver); - ch += PE_OUTPUT(eh_name_rva); - ch += PE_OUTPUT(eh_ordinal_base); - ch += PE_OUTPUT(eh_addr_tbl_entries); - ch += PE_OUTPUT(eh_num_of_name_ptrs); - ch += PE_OUTPUT(eh_export_addr_tbl_rva); - ch += PE_OUTPUT(eh_name_ptr_rva); - ch += PE_OUTPUT(eh_ordinal_tbl_rva); - - ch += pe_output_hex_footer(ch); - - *ch = 0; - - if (pe_dprintf(pe_driver_fdout(dctx),"%s",buf) < 0) - return PERK_FILE_ERROR(dctx); - - return 0; -} diff --git a/src/hdrdump/pe_hdrdump_image_dos_hdr.c b/src/hdrdump/pe_hdrdump_image_dos_hdr.c deleted file mode 100644 index c290079..0000000 --- a/src/hdrdump/pe_hdrdump_image_dos_hdr.c +++ /dev/null @@ -1,76 +0,0 @@ -/***************************************************************/ -/* perk: PE Resource Kit */ -/* Copyright (C) 2015--2021 SysDeer Technologies, LLC */ -/* Released under GPLv2 and GPLv3; see COPYING.PERK. */ -/***************************************************************/ - -#include - -#include -#include -#include -#include -#include "perk_driver_impl.h" -#include "perk_hdrdump_impl.h" -#include "perk_dprintf_impl.h" -#include "perk_errinfo_impl.h" - -#define PE_ADDR meta->r_dos -#define PE_RAW_STRUCT image_dos_hdr -#define PE_OUTPUT(x) PE_OUTPUT_TABLE(x) - -int pe_hdrdump_image_dos_hdr( - const struct pe_driver_ctx * dctx, - const struct pe_image_meta * meta) -{ - int bits; - uint64_t faddr; - uint64_t vaddr; - char * ch; - char buf[8192]; - - if (!PE_ADDR) - return 0; - - if ((bits = pe_image_bits(meta)) < 0) - return PERK_CUSTOM_ERROR( - dctx,PERK_ERR_UNSUPPORTED_ABI); - - faddr = 0; - vaddr = meta->m_opt.oh_mem.coh_image_base; - - ch = buf; - ch += pe_output_hex_header( - ch, - "struct pe_raw_image_dos_hdr", - faddr,vaddr,bits); - - ch += PE_OUTPUT(dos_magic); - ch += PE_OUTPUT(dos_cblp); - ch += PE_OUTPUT(dos_cp); - ch += PE_OUTPUT(dos_crlc); - ch += PE_OUTPUT(dos_cparhdr); - ch += PE_OUTPUT(dos_minalloc); - ch += PE_OUTPUT(dos_maxalloc); - ch += PE_OUTPUT(dos_ss); - ch += PE_OUTPUT(dos_sp); - ch += PE_OUTPUT(dos_csum); - ch += PE_OUTPUT(dos_ip); - ch += PE_OUTPUT(dos_cs); - ch += PE_OUTPUT(dos_lfarlc); - ch += PE_OUTPUT(dos_ovno); - ch += PE_OUTPUT(dos_res); - ch += PE_OUTPUT(dos_oemid); - ch += PE_OUTPUT(dos_oeminfo); - ch += PE_OUTPUT(dos_res2); - ch += PE_OUTPUT(dos_lfanew); - - ch += pe_output_hex_footer(ch); - - *ch = 0; - - if (pe_dprintf(pe_driver_fdout(dctx),"%s",buf) < 0) - return PERK_FILE_ERROR(dctx); - - return 0; -} diff --git a/src/hdrdump/pe_hdrdump_import_tbl.c b/src/hdrdump/pe_hdrdump_import_tbl.c deleted file mode 100644 index f7cdb24..0000000 --- a/src/hdrdump/pe_hdrdump_import_tbl.c +++ /dev/null @@ -1,109 +0,0 @@ -/***************************************************************/ -/* perk: PE Resource Kit */ -/* Copyright (C) 2015--2021 SysDeer Technologies, LLC */ -/* Released under GPLv2 and GPLv3; see COPYING.PERK. */ -/***************************************************************/ - -#include - -#include -#include -#include -#include -#include "perk_driver_impl.h" -#include "perk_hdrdump_impl.h" -#include "perk_dprintf_impl.h" -#include "perk_errinfo_impl.h" - -#define PE_ADDR &meta->r_idata[idx] -#define PE_RAW_STRUCT import_hdr -#define PE_OUTPUT(x) PE_OUTPUT_TABLE(x) - -static int pe_hdrdump_import_hdr_impl( - const struct pe_driver_ctx * dctx, - const struct pe_image_meta * meta, - int32_t idx) -{ - int bits; - uint64_t faddr; - uint64_t vaddr; - char * ch; - char hdr[64]; - char buf[8192]; - - if ((bits = pe_image_bits(meta)) < 0) - return PERK_CUSTOM_ERROR( - dctx,PERK_ERR_UNSUPPORTED_ABI); - - /* import header */ - sprintf( - hdr, - "struct pe_raw_import_hdr [%d]", - idx); - - faddr = (char *)(PE_ADDR) - (char *)meta->r_image.map_addr; - vaddr = meta->m_opt.oh_mem.coh_image_base + meta->m_idata[idx].ih_virtual_addr; - - ch = buf; - ch += pe_output_hex_header( - ch,hdr, - faddr,vaddr,bits); - - ch += PE_OUTPUT(ih_import_lookup_tbl_rva); - ch += PE_OUTPUT(ih_time_date_stamp); - ch += PE_OUTPUT(ih_forwarder_chain); - ch += PE_OUTPUT(ih_name_rva); - ch += PE_OUTPUT(ih_import_addr_tbl_rva); - - ch += pe_output_hex_footer(ch); - - /* import name for all but the null header */ - if (idx == meta->m_stats.t_nimplibs) { - (void)0; - - } else if (meta->m_idata[idx].ih_name_rva) { - sprintf( - hdr, - "struct pe_raw_import_name [%d]", - idx); - - faddr = meta->m_idata[idx].ih_name - (char *)meta->r_image.map_addr; - vaddr = meta->m_idata[idx].ih_name_rva; - - ch += pe_output_hex_header( - ch,hdr, - faddr,vaddr,bits); - - ch += pe_output_raw_element( - ch, - meta->m_idata[idx].ih_name, - "ih_name",0, - strlen(meta->m_idata[idx].ih_name) + 1); - - ch += pe_output_hex_footer(ch); - } - - *ch = 0; - - /* fdout */ - if (pe_dprintf(pe_driver_fdout(dctx),"%s",buf) < 0) - return PERK_FILE_ERROR(dctx); - - return 0; -} - -int pe_hdrdump_import_tbl( - const struct pe_driver_ctx * dctx, - const struct pe_image_meta * meta) -{ - int idx; - - if (meta->m_stats.t_nimplibs == 0) - return 0; - - for (idx=0; idx<=meta->m_stats.t_nimplibs; idx++) - if (pe_hdrdump_import_hdr_impl(dctx,meta,idx) < 0) - return PERK_NESTED_ERROR(dctx); - - return 0; -} diff --git a/src/hdrdump/pe_hdrdump_sec_tbl.c b/src/hdrdump/pe_hdrdump_sec_tbl.c deleted file mode 100644 index 8379d6d..0000000 --- a/src/hdrdump/pe_hdrdump_sec_tbl.c +++ /dev/null @@ -1,83 +0,0 @@ -/***************************************************************/ -/* perk: PE Resource Kit */ -/* Copyright (C) 2015--2021 SysDeer Technologies, LLC */ -/* Released under GPLv2 and GPLv3; see COPYING.PERK. */ -/***************************************************************/ - -#include - -#include -#include -#include -#include -#include "perk_driver_impl.h" -#include "perk_hdrdump_impl.h" -#include "perk_dprintf_impl.h" -#include "perk_errinfo_impl.h" - -#define PE_ADDR &meta->r_sectbl[idx] -#define PE_RAW_STRUCT sec_hdr -#define PE_OUTPUT(x) PE_OUTPUT_TABLE(x) - -static int pe_hdrdump_sec_hdr_impl( - const struct pe_driver_ctx * dctx, - const struct pe_image_meta * meta, - uint32_t idx) -{ - int bits; - uint64_t faddr; - uint64_t vaddr; - char * ch; - char hdr[64]; - char buf[8192]; - - if ((bits = pe_image_bits(meta)) < 0) - return PERK_CUSTOM_ERROR( - dctx,PERK_ERR_UNSUPPORTED_ABI); - - sprintf( - hdr, - "struct pe_raw_sec_hdr [%d]", - idx); - - faddr = (char *)(PE_ADDR) - (char *)meta->r_image.map_addr; - vaddr = meta->m_opt.oh_mem.coh_image_base + faddr; - - ch = buf; - ch += pe_output_hex_header( - ch,hdr, - faddr,vaddr,bits); - - ch += PE_OUTPUT(sh_name); - ch += PE_OUTPUT(sh_virtual_size); - ch += PE_OUTPUT(sh_virtual_addr); - ch += PE_OUTPUT(sh_size_of_raw_data); - ch += PE_OUTPUT(sh_ptr_to_raw_data); - ch += PE_OUTPUT(sh_ptr_to_relocs); - ch += PE_OUTPUT(sh_ptr_to_line_nums); - ch += PE_OUTPUT(sh_num_of_relocs); - ch += PE_OUTPUT(sh_num_of_line_nums); - ch += PE_OUTPUT(sh_characteristics); - - ch += pe_output_hex_footer(ch); - - *ch = 0; - - if (pe_dprintf(pe_driver_fdout(dctx),"%s",buf) < 0) - return PERK_FILE_ERROR(dctx); - - return 0; -} - -int pe_hdrdump_sec_tbl( - const struct pe_driver_ctx * dctx, - const struct pe_image_meta * meta) -{ - uint32_t idx; - - for (idx=0; idxm_coff.cfh_num_of_sections; idx++) - if (pe_hdrdump_sec_hdr_impl(dctx,meta,idx) < 0) - return PERK_NESTED_ERROR(dctx); - - return 0; -} diff --git a/src/hexdump/pe_hexdump_coff_image_hdr.c b/src/hexdump/pe_hexdump_coff_image_hdr.c new file mode 100644 index 0000000..c52d8d7 --- /dev/null +++ b/src/hexdump/pe_hexdump_coff_image_hdr.c @@ -0,0 +1,65 @@ +/***************************************************************/ +/* perk: PE Resource Kit */ +/* Copyright (C) 2015--2021 SysDeer Technologies, LLC */ +/* Released under GPLv2 and GPLv3; see COPYING.PERK. */ +/***************************************************************/ + +#include + +#include +#include +#include +#include +#include "perk_driver_impl.h" +#include "perk_hexdump_impl.h" +#include "perk_dprintf_impl.h" +#include "perk_errinfo_impl.h" + +#define PE_ADDR meta->r_coff +#define PE_RAW_STRUCT coff_image_hdr +#define PE_OUTPUT(x) PE_OUTPUT_TABLE(x) + +int pe_hexdump_coff_image_hdr( + const struct pe_driver_ctx * dctx, + const struct pe_image_meta * meta) +{ + int bits; + uint64_t faddr; + uint64_t vaddr; + char * ch; + char buf[8192]; + + if (!PE_ADDR) + return 0; + + if ((bits = pe_image_bits(meta)) < 0) + return PERK_CUSTOM_ERROR( + dctx,PERK_ERR_UNSUPPORTED_ABI); + + faddr = (char *)(PE_ADDR) - (char *)meta->r_image.map_addr; + vaddr = meta->m_opt.oh_mem.coh_image_base + faddr; + + ch = buf; + ch += pe_output_hex_header( + ch, + "struct pe_raw_coff_image_hdr", + faddr,vaddr,bits); + + ch += PE_OUTPUT(cfh_signature); + ch += PE_OUTPUT(cfh_machine); + 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_size_of_opt_hdr); + ch += PE_OUTPUT(cfh_characteristics); + + ch += pe_output_hex_footer(ch); + + *ch = 0; + + if (pe_dprintf(pe_driver_fdout(dctx),"%s",buf) < 0) + return PERK_FILE_ERROR(dctx); + + return 0; +} diff --git a/src/hexdump/pe_hexdump_coff_object_hdr.c b/src/hexdump/pe_hexdump_coff_object_hdr.c new file mode 100644 index 0000000..083d85d --- /dev/null +++ b/src/hexdump/pe_hexdump_coff_object_hdr.c @@ -0,0 +1,64 @@ +/***************************************************************/ +/* perk: PE Resource Kit */ +/* Copyright (C) 2015--2021 SysDeer Technologies, LLC */ +/* Released under GPLv2 and GPLv3; see COPYING.PERK. */ +/***************************************************************/ + +#include + +#include +#include +#include +#include +#include "perk_driver_impl.h" +#include "perk_hexdump_impl.h" +#include "perk_dprintf_impl.h" +#include "perk_errinfo_impl.h" + +#define PE_ADDR meta->r_obj +#define PE_RAW_STRUCT coff_object_hdr +#define PE_OUTPUT(x) PE_OUTPUT_TABLE(x) + +int pe_hexdump_coff_object_hdr( + const struct pe_driver_ctx * dctx, + const struct pe_image_meta * meta) +{ + int bits; + uint64_t faddr; + uint64_t vaddr; + char * ch; + char buf[8192]; + + if (!PE_ADDR) + return 0; + + if ((bits = pe_image_bits(meta)) < 0) + return PERK_CUSTOM_ERROR( + dctx,PERK_ERR_UNSUPPORTED_ABI); + + faddr = (char *)(PE_ADDR) - (char *)meta->r_image.map_addr; + vaddr = meta->m_opt.oh_mem.coh_image_base + faddr; + + ch = buf; + ch += pe_output_hex_header( + ch, + "struct pe_raw_coff_object_hdr", + faddr,vaddr,bits); + + ch += PE_OUTPUT(cfh_machine); + 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_size_of_opt_hdr); + ch += PE_OUTPUT(cfh_characteristics); + + ch += pe_output_hex_footer(ch); + + *ch = 0; + + if (pe_dprintf(pe_driver_fdout(dctx),"%s",buf) < 0) + return PERK_FILE_ERROR(dctx); + + return 0; +} diff --git a/src/hexdump/pe_hexdump_coff_opt_hdr.c b/src/hexdump/pe_hexdump_coff_opt_hdr.c new file mode 100644 index 0000000..e6a1e5f --- /dev/null +++ b/src/hexdump/pe_hexdump_coff_opt_hdr.c @@ -0,0 +1,211 @@ +/***************************************************************/ +/* perk: PE Resource Kit */ +/* Copyright (C) 2015--2021 SysDeer Technologies, LLC */ +/* Released under GPLv2 and GPLv3; see COPYING.PERK. */ +/***************************************************************/ + +#include + +#include +#include +#include +#include +#include "perk_driver_impl.h" +#include "perk_hexdump_impl.h" +#include "perk_dprintf_impl.h" +#include "perk_errinfo_impl.h" + +#define PE_ADDR &meta->r_opt->opt_hdr_32 +#define PE_RAW_STRUCT opt_hdr_32 +#define PE_OUTPUT(x) PE_OUTPUT_TABLE(x) + +static int pe_hexdump_opt_hdr_32( + const struct pe_driver_ctx * dctx, + const struct pe_image_meta * meta) +{ + void * uaddr; + const char * haddr; + const char * maddr; + uintptr_t faddr; + uintptr_t vaddr; + char * ch; + char buf[8192]; + + uaddr = &meta->r_opt->opt_hdr_32; + maddr = meta->r_image.map_addr; + + haddr = uaddr; + faddr = haddr - maddr; + vaddr = meta->m_opt.oh_mem.coh_image_base + faddr; + + ch = buf; + ch += pe_output_hex_header( + ch, + "struct pe_raw_opt_hdr_32", + faddr,vaddr,32); + + ch += PE_OUTPUT(coh_magic); + ch += PE_OUTPUT(coh_major_linker_ver); + ch += PE_OUTPUT(coh_minor_linker_ver); + ch += PE_OUTPUT(coh_size_of_code); + ch += PE_OUTPUT(coh_size_of_inited_data); + ch += PE_OUTPUT(coh_size_of_uninited_data); + ch += PE_OUTPUT(coh_entry_point); + ch += PE_OUTPUT(coh_base_of_code); + ch += PE_OUTPUT(coh_base_of_data); + ch += PE_OUTPUT(coh_image_base); + ch += PE_OUTPUT(coh_section_align); + ch += PE_OUTPUT(coh_file_align); + ch += PE_OUTPUT(coh_major_os_ver); + ch += PE_OUTPUT(coh_minor_os_ver); + ch += PE_OUTPUT(coh_major_image_ver); + ch += PE_OUTPUT(coh_minor_image_ver); + ch += PE_OUTPUT(coh_major_subsys_ver); + ch += PE_OUTPUT(coh_minor_subsys_ver); + ch += PE_OUTPUT(coh_win32_ver); + ch += PE_OUTPUT(coh_size_of_image); + ch += PE_OUTPUT(coh_size_of_headers); + ch += PE_OUTPUT(coh_checksum); + ch += PE_OUTPUT(coh_subsystem); + ch += PE_OUTPUT(coh_dll_characteristics); + ch += PE_OUTPUT(coh_size_of_stack_reserve); + ch += PE_OUTPUT(coh_size_of_stack_commit); + ch += PE_OUTPUT(coh_size_of_heap_reserve); + ch += PE_OUTPUT(coh_size_of_heap_commit); + ch += PE_OUTPUT(coh_loader_flags); + ch += PE_OUTPUT(coh_rva_and_sizes); + ch += PE_OUTPUT(coh_export_tbl); + ch += PE_OUTPUT(coh_import_tbl); + ch += PE_OUTPUT(coh_resource_tbl); + ch += PE_OUTPUT(coh_exception_tbl); + ch += PE_OUTPUT(coh_certificate_tbl); + ch += PE_OUTPUT(coh_base_reloc_tbl); + ch += PE_OUTPUT(coh_debug); + ch += PE_OUTPUT(coh_arch); + ch += PE_OUTPUT(coh_global_ptr); + ch += PE_OUTPUT(coh_tls_tbl); + ch += PE_OUTPUT(coh_load_config_tbl); + ch += PE_OUTPUT(coh_bound_import); + ch += PE_OUTPUT(coh_iat); + ch += PE_OUTPUT(coh_delay_import_descriptor); + ch += PE_OUTPUT(coh_clr_runtime_hdr); + ch += PE_OUTPUT(coh_reserved); + + ch += pe_output_hex_footer(ch); + + *ch = 0; + + if (pe_dprintf(pe_driver_fdout(dctx),"%s",buf) < 0) + return PERK_FILE_ERROR(dctx); + + return 0; +} + +#undef PE_ADDR +#undef PE_RAW_STRUCT +#undef PE_OUTPUT + +#define PE_ADDR &meta->r_opt->opt_hdr_64 +#define PE_RAW_STRUCT opt_hdr_64 +#define PE_OUTPUT(x) PE_OUTPUT_TABLE(x) + +static int pe_hexdump_opt_hdr_64( + const struct pe_driver_ctx * dctx, + const struct pe_image_meta * meta) +{ + void * uaddr; + const char * haddr; + const char * maddr; + uintptr_t faddr; + uintptr_t vaddr; + char * ch; + char buf[8192]; + + uaddr = PE_ADDR; + maddr = meta->r_image.map_addr; + + haddr = uaddr; + faddr = haddr - maddr; + vaddr = meta->m_opt.oh_mem.coh_image_base + faddr; + + ch = buf; + ch += pe_output_hex_header( + ch, + "struct pe_raw_opt_hdr_64", + faddr,vaddr,64); + + ch += PE_OUTPUT(coh_magic); + ch += PE_OUTPUT(coh_major_linker_ver); + ch += PE_OUTPUT(coh_minor_linker_ver); + ch += PE_OUTPUT(coh_size_of_code); + ch += PE_OUTPUT(coh_size_of_inited_data); + ch += PE_OUTPUT(coh_size_of_uninited_data); + ch += PE_OUTPUT(coh_entry_point); + ch += PE_OUTPUT(coh_base_of_code); + ch += PE_OUTPUT(coh_image_base); + ch += PE_OUTPUT(coh_section_align); + ch += PE_OUTPUT(coh_file_align); + ch += PE_OUTPUT(coh_major_os_ver); + ch += PE_OUTPUT(coh_minor_os_ver); + ch += PE_OUTPUT(coh_major_image_ver); + ch += PE_OUTPUT(coh_minor_image_ver); + ch += PE_OUTPUT(coh_major_subsys_ver); + ch += PE_OUTPUT(coh_minor_subsys_ver); + ch += PE_OUTPUT(coh_win32_ver); + ch += PE_OUTPUT(coh_size_of_image); + ch += PE_OUTPUT(coh_size_of_headers); + ch += PE_OUTPUT(coh_checksum); + ch += PE_OUTPUT(coh_subsystem); + ch += PE_OUTPUT(coh_dll_characteristics); + ch += PE_OUTPUT(coh_size_of_stack_reserve); + ch += PE_OUTPUT(coh_size_of_stack_commit); + ch += PE_OUTPUT(coh_size_of_heap_reserve); + ch += PE_OUTPUT(coh_size_of_heap_commit); + ch += PE_OUTPUT(coh_loader_flags); + ch += PE_OUTPUT(coh_rva_and_sizes); + ch += PE_OUTPUT(coh_export_tbl); + ch += PE_OUTPUT(coh_import_tbl); + ch += PE_OUTPUT(coh_resource_tbl); + ch += PE_OUTPUT(coh_exception_tbl); + ch += PE_OUTPUT(coh_certificate_tbl); + ch += PE_OUTPUT(coh_base_reloc_tbl); + ch += PE_OUTPUT(coh_debug); + ch += PE_OUTPUT(coh_arch); + ch += PE_OUTPUT(coh_global_ptr); + ch += PE_OUTPUT(coh_tls_tbl); + ch += PE_OUTPUT(coh_load_config_tbl); + ch += PE_OUTPUT(coh_bound_import); + ch += PE_OUTPUT(coh_iat); + ch += PE_OUTPUT(coh_delay_import_descriptor); + ch += PE_OUTPUT(coh_clr_runtime_hdr); + ch += PE_OUTPUT(coh_reserved); + + ch += pe_output_hex_footer(ch); + + *ch = 0; + + if (pe_dprintf(pe_driver_fdout(dctx),"%s",buf) < 0) + return PERK_FILE_ERROR(dctx); + + return 0; +} + +int pe_hexdump_coff_opt_hdr( + const struct pe_driver_ctx * dctx, + const struct pe_image_meta * meta) +{ + if (!meta->r_opt) + return 0; + + switch (pe_image_bits(meta)) { + case 32: + return pe_hexdump_opt_hdr_32(dctx,meta); + + case 64: + return pe_hexdump_opt_hdr_64(dctx,meta); + + default: + return PERK_CUSTOM_ERROR( + dctx,PERK_ERR_UNSUPPORTED_ABI); + } +} diff --git a/src/hexdump/pe_hexdump_export_hdr.c b/src/hexdump/pe_hexdump_export_hdr.c new file mode 100644 index 0000000..d1e3a33 --- /dev/null +++ b/src/hexdump/pe_hexdump_export_hdr.c @@ -0,0 +1,68 @@ +/***************************************************************/ +/* perk: PE Resource Kit */ +/* Copyright (C) 2015--2021 SysDeer Technologies, LLC */ +/* Released under GPLv2 and GPLv3; see COPYING.PERK. */ +/***************************************************************/ + +#include + +#include +#include +#include +#include +#include "perk_driver_impl.h" +#include "perk_hexdump_impl.h" +#include "perk_dprintf_impl.h" +#include "perk_errinfo_impl.h" + +#define PE_ADDR meta->r_edata +#define PE_RAW_STRUCT export_hdr +#define PE_OUTPUT(x) PE_OUTPUT_TABLE(x) + +int pe_hexdump_export_hdr( + const struct pe_driver_ctx * dctx, + const struct pe_image_meta * meta) +{ + int bits; + uint64_t faddr; + uint64_t vaddr; + char * ch; + char buf[8192]; + + if (!PE_ADDR) + return 0; + + if ((bits = pe_image_bits(meta)) < 0) + return PERK_CUSTOM_ERROR( + dctx,PERK_ERR_UNSUPPORTED_ABI); + + faddr = (char *)(PE_ADDR) - (char *)meta->r_image.map_addr; + vaddr = meta->m_opt.oh_mem.coh_image_base + meta->m_edata.eh_virtual_addr; + + ch = buf; + ch += pe_output_hex_header( + ch, + "struct pe_raw_export_hdr", + faddr,vaddr,bits); + + ch += PE_OUTPUT(eh_export_flags); + ch += PE_OUTPUT(eh_time_date_stamp); + ch += PE_OUTPUT(eh_major_ver); + ch += PE_OUTPUT(eh_minor_ver); + ch += PE_OUTPUT(eh_name_rva); + ch += PE_OUTPUT(eh_ordinal_base); + ch += PE_OUTPUT(eh_addr_tbl_entries); + ch += PE_OUTPUT(eh_num_of_name_ptrs); + ch += PE_OUTPUT(eh_export_addr_tbl_rva); + ch += PE_OUTPUT(eh_name_ptr_rva); + ch += PE_OUTPUT(eh_ordinal_tbl_rva); + + ch += pe_output_hex_footer(ch); + + *ch = 0; + + if (pe_dprintf(pe_driver_fdout(dctx),"%s",buf) < 0) + return PERK_FILE_ERROR(dctx); + + return 0; +} diff --git a/src/hexdump/pe_hexdump_image_dos_hdr.c b/src/hexdump/pe_hexdump_image_dos_hdr.c new file mode 100644 index 0000000..9579279 --- /dev/null +++ b/src/hexdump/pe_hexdump_image_dos_hdr.c @@ -0,0 +1,76 @@ +/***************************************************************/ +/* perk: PE Resource Kit */ +/* Copyright (C) 2015--2021 SysDeer Technologies, LLC */ +/* Released under GPLv2 and GPLv3; see COPYING.PERK. */ +/***************************************************************/ + +#include + +#include +#include +#include +#include +#include "perk_driver_impl.h" +#include "perk_hexdump_impl.h" +#include "perk_dprintf_impl.h" +#include "perk_errinfo_impl.h" + +#define PE_ADDR meta->r_dos +#define PE_RAW_STRUCT image_dos_hdr +#define PE_OUTPUT(x) PE_OUTPUT_TABLE(x) + +int pe_hexdump_image_dos_hdr( + const struct pe_driver_ctx * dctx, + const struct pe_image_meta * meta) +{ + int bits; + uint64_t faddr; + uint64_t vaddr; + char * ch; + char buf[8192]; + + if (!PE_ADDR) + return 0; + + if ((bits = pe_image_bits(meta)) < 0) + return PERK_CUSTOM_ERROR( + dctx,PERK_ERR_UNSUPPORTED_ABI); + + faddr = 0; + vaddr = meta->m_opt.oh_mem.coh_image_base; + + ch = buf; + ch += pe_output_hex_header( + ch, + "struct pe_raw_image_dos_hdr", + faddr,vaddr,bits); + + ch += PE_OUTPUT(dos_magic); + ch += PE_OUTPUT(dos_cblp); + ch += PE_OUTPUT(dos_cp); + ch += PE_OUTPUT(dos_crlc); + ch += PE_OUTPUT(dos_cparhdr); + ch += PE_OUTPUT(dos_minalloc); + ch += PE_OUTPUT(dos_maxalloc); + ch += PE_OUTPUT(dos_ss); + ch += PE_OUTPUT(dos_sp); + ch += PE_OUTPUT(dos_csum); + ch += PE_OUTPUT(dos_ip); + ch += PE_OUTPUT(dos_cs); + ch += PE_OUTPUT(dos_lfarlc); + ch += PE_OUTPUT(dos_ovno); + ch += PE_OUTPUT(dos_res); + ch += PE_OUTPUT(dos_oemid); + ch += PE_OUTPUT(dos_oeminfo); + ch += PE_OUTPUT(dos_res2); + ch += PE_OUTPUT(dos_lfanew); + + ch += pe_output_hex_footer(ch); + + *ch = 0; + + if (pe_dprintf(pe_driver_fdout(dctx),"%s",buf) < 0) + return PERK_FILE_ERROR(dctx); + + return 0; +} diff --git a/src/hexdump/pe_hexdump_import_tbl.c b/src/hexdump/pe_hexdump_import_tbl.c new file mode 100644 index 0000000..41c7fe9 --- /dev/null +++ b/src/hexdump/pe_hexdump_import_tbl.c @@ -0,0 +1,109 @@ +/***************************************************************/ +/* perk: PE Resource Kit */ +/* Copyright (C) 2015--2021 SysDeer Technologies, LLC */ +/* Released under GPLv2 and GPLv3; see COPYING.PERK. */ +/***************************************************************/ + +#include + +#include +#include +#include +#include +#include "perk_driver_impl.h" +#include "perk_hexdump_impl.h" +#include "perk_dprintf_impl.h" +#include "perk_errinfo_impl.h" + +#define PE_ADDR &meta->r_idata[idx] +#define PE_RAW_STRUCT import_hdr +#define PE_OUTPUT(x) PE_OUTPUT_TABLE(x) + +static int pe_hexdump_import_hdr_impl( + const struct pe_driver_ctx * dctx, + const struct pe_image_meta * meta, + int32_t idx) +{ + int bits; + uint64_t faddr; + uint64_t vaddr; + char * ch; + char hdr[64]; + char buf[8192]; + + if ((bits = pe_image_bits(meta)) < 0) + return PERK_CUSTOM_ERROR( + dctx,PERK_ERR_UNSUPPORTED_ABI); + + /* import header */ + sprintf( + hdr, + "struct pe_raw_import_hdr [%d]", + idx); + + faddr = (char *)(PE_ADDR) - (char *)meta->r_image.map_addr; + vaddr = meta->m_opt.oh_mem.coh_image_base + meta->m_idata[idx].ih_virtual_addr; + + ch = buf; + ch += pe_output_hex_header( + ch,hdr, + faddr,vaddr,bits); + + ch += PE_OUTPUT(ih_import_lookup_tbl_rva); + ch += PE_OUTPUT(ih_time_date_stamp); + ch += PE_OUTPUT(ih_forwarder_chain); + ch += PE_OUTPUT(ih_name_rva); + ch += PE_OUTPUT(ih_import_addr_tbl_rva); + + ch += pe_output_hex_footer(ch); + + /* import name for all but the null header */ + if (idx == meta->m_stats.t_nimplibs) { + (void)0; + + } else if (meta->m_idata[idx].ih_name_rva) { + sprintf( + hdr, + "struct pe_raw_import_name [%d]", + idx); + + faddr = meta->m_idata[idx].ih_name - (char *)meta->r_image.map_addr; + vaddr = meta->m_idata[idx].ih_name_rva; + + ch += pe_output_hex_header( + ch,hdr, + faddr,vaddr,bits); + + ch += pe_output_raw_element( + ch, + meta->m_idata[idx].ih_name, + "ih_name",0, + strlen(meta->m_idata[idx].ih_name) + 1); + + ch += pe_output_hex_footer(ch); + } + + *ch = 0; + + /* fdout */ + if (pe_dprintf(pe_driver_fdout(dctx),"%s",buf) < 0) + return PERK_FILE_ERROR(dctx); + + return 0; +} + +int pe_hexdump_import_tbl( + const struct pe_driver_ctx * dctx, + const struct pe_image_meta * meta) +{ + int idx; + + if (meta->m_stats.t_nimplibs == 0) + return 0; + + for (idx=0; idx<=meta->m_stats.t_nimplibs; idx++) + if (pe_hexdump_import_hdr_impl(dctx,meta,idx) < 0) + return PERK_NESTED_ERROR(dctx); + + return 0; +} diff --git a/src/hexdump/pe_hexdump_sec_tbl.c b/src/hexdump/pe_hexdump_sec_tbl.c new file mode 100644 index 0000000..a9c74b0 --- /dev/null +++ b/src/hexdump/pe_hexdump_sec_tbl.c @@ -0,0 +1,83 @@ +/***************************************************************/ +/* perk: PE Resource Kit */ +/* Copyright (C) 2015--2021 SysDeer Technologies, LLC */ +/* Released under GPLv2 and GPLv3; see COPYING.PERK. */ +/***************************************************************/ + +#include + +#include +#include +#include +#include +#include "perk_driver_impl.h" +#include "perk_hexdump_impl.h" +#include "perk_dprintf_impl.h" +#include "perk_errinfo_impl.h" + +#define PE_ADDR &meta->r_sectbl[idx] +#define PE_RAW_STRUCT sec_hdr +#define PE_OUTPUT(x) PE_OUTPUT_TABLE(x) + +static int pe_hexdump_sec_hdr_impl( + const struct pe_driver_ctx * dctx, + const struct pe_image_meta * meta, + uint32_t idx) +{ + int bits; + uint64_t faddr; + uint64_t vaddr; + char * ch; + char hdr[64]; + char buf[8192]; + + if ((bits = pe_image_bits(meta)) < 0) + return PERK_CUSTOM_ERROR( + dctx,PERK_ERR_UNSUPPORTED_ABI); + + sprintf( + hdr, + "struct pe_raw_sec_hdr [%d]", + idx); + + faddr = (char *)(PE_ADDR) - (char *)meta->r_image.map_addr; + vaddr = meta->m_opt.oh_mem.coh_image_base + faddr; + + ch = buf; + ch += pe_output_hex_header( + ch,hdr, + faddr,vaddr,bits); + + ch += PE_OUTPUT(sh_name); + ch += PE_OUTPUT(sh_virtual_size); + ch += PE_OUTPUT(sh_virtual_addr); + ch += PE_OUTPUT(sh_size_of_raw_data); + ch += PE_OUTPUT(sh_ptr_to_raw_data); + ch += PE_OUTPUT(sh_ptr_to_relocs); + ch += PE_OUTPUT(sh_ptr_to_line_nums); + ch += PE_OUTPUT(sh_num_of_relocs); + ch += PE_OUTPUT(sh_num_of_line_nums); + ch += PE_OUTPUT(sh_characteristics); + + ch += pe_output_hex_footer(ch); + + *ch = 0; + + if (pe_dprintf(pe_driver_fdout(dctx),"%s",buf) < 0) + return PERK_FILE_ERROR(dctx); + + return 0; +} + +int pe_hexdump_sec_tbl( + const struct pe_driver_ctx * dctx, + const struct pe_image_meta * meta) +{ + uint32_t idx; + + for (idx=0; idxm_coff.cfh_num_of_sections; idx++) + if (pe_hexdump_sec_hdr_impl(dctx,meta,idx) < 0) + return PERK_NESTED_ERROR(dctx); + + return 0; +} diff --git a/src/internal/perk_hdrdump_impl.c b/src/internal/perk_hdrdump_impl.c deleted file mode 100644 index 314edef..0000000 --- a/src/internal/perk_hdrdump_impl.c +++ /dev/null @@ -1,237 +0,0 @@ -/***************************************************************/ -/* perk: PE Resource Kit */ -/* Copyright (C) 2015--2021 SysDeer Technologies, LLC */ -/* Released under GPLv2 and GPLv3; see COPYING.PERK. */ -/***************************************************************/ - -#include -#include - -#include -#include -#include -#include "perk_hdrdump_impl.h" -#include "perk_visibility_impl.h" - -#define PE_TABWIDTH 8 -#define PE_HDRSPACE 40 - -static const char pe_hex_header_hex[] = - " 0 1 2 3 4 5 6 7 8 9 a b c d e f 01234567 89abcdef\n"; - -static const char pe_hex_header_dot[] = - " .-------------------------------------------------. .-----------------.\n"; - -static const char pe_hex_footer[] = - "|---------------------------------------------------| |-----------------|\n\n"; - -perk_hidden size_t pe_output_hex_header( - char * buf, - const char * sname, - uint64_t faddr, - uint64_t vaddr, - int bits) -{ - char * ch; - size_t hlen; - size_t dlen; - size_t slen; - size_t nlen; - uint32_t high; - uint32_t low; - - ch = buf; - hlen = strlen(pe_hex_header_hex); - dlen = strlen(pe_hex_header_dot); - slen = strlen(sname); - - switch (bits) { - case 32: - low = faddr; - nlen = sprintf(ch,"faddr: 0x%08x\n",low); - break; - - case 64: - low = faddr; - high = faddr >> 32; - nlen = sprintf(ch,"faddr: 0x%08x%08x\n",high,low); - break; - - default: - return -1; - } - - ch += nlen; - - switch (bits) { - case 32: - low = vaddr; - nlen = sprintf(ch,"vaddr: 0x%08x",low); - break; - - default: - low = vaddr; - high = vaddr >> 32; - nlen = sprintf(ch,"vaddr: 0x%08x%08x",high,low); - break; - } - - ch += nlen; - memset(ch,' ',PE_HDRSPACE - nlen); - ch += PE_HDRSPACE - nlen; - - memcpy(ch,pe_hex_header_hex,hlen); - ch += hlen; - - memcpy(ch,sname,slen); - - ch += slen; - memset(ch,' ',PE_HDRSPACE - slen); - ch += PE_HDRSPACE - slen; - - memcpy(ch,pe_hex_header_dot,dlen); - ch += dlen; - - return ch - buf; -} - -perk_hidden size_t pe_output_hex_footer(char * buf) -{ - size_t nlen; - - memset(buf,' ',PE_HDRSPACE); - buf += PE_HDRSPACE; - - nlen = strlen(pe_hex_footer); - memcpy(buf,pe_hex_footer,nlen); - - return PE_HDRSPACE + nlen; -} - -perk_hidden size_t pe_output_raw_element( - char * ch, - const void * rdata, - const char * mname, - uint32_t moffset, - uint32_t msize) -{ - size_t nlen; - char * base; - uintptr_t addr; - const unsigned char * src; - const unsigned char * cap; - const unsigned char * mark; - size_t pos; - size_t xpos; - const char xch[] = "0123456789abcdef"; - - /* init */ - base = ch; - - /* pos */ - addr = (uintptr_t)rdata; - addr += moffset; - pos = addr % 0x10; - xpos = pos; - - /* struct member name */ - memset(ch,' ',PE_TABWIDTH); - ch += PE_TABWIDTH; - - *ch++ = '.'; - nlen = strlen(mname); - memcpy(ch,mname,nlen); - - ch += nlen; - *ch++ = ':'; - - /* hex dump column */ - nlen = PE_HDRSPACE - PE_TABWIDTH - nlen - 2; - memset(ch,' ',nlen); - ch += nlen; - - *ch++ = '|'; - *ch++ = ' '; - - nlen = 3 * pos; - memset(ch,' ',nlen); - ch += nlen; - - if (pos >= 8) { - *ch++ = ' '; - *ch++ = ' '; - } - - /* hex dump */ - src = rdata; - src += moffset; - - mark = src; - cap = src + msize; - - for (; src= 7); - memset(ch,' ',nlen); - ch += nlen; - - /* binary dump */ - for (; mark= 0x20) && (*mark < 0x7f) - ? *mark : '.'; - - /* pretty columns */ - if ((++mark < src) && (++xpos == 8)) { - *ch++ = ' '; - xpos = 0; - } - } - - nlen = 0xf - pos; - nlen += (pos <= 7); - - memset(ch,' ',nlen); - ch += nlen; - - *ch++ = '|'; - *ch++ = '\n'; - } - - /* does member hex dump span across more than one line? */ - if ((src < cap) && (++pos == 0x10)) { - memset(ch,' ',PE_HDRSPACE); - ch += PE_HDRSPACE; - *ch++ = '|'; - *ch++ = ' '; - - mark = src; - pos = 0; - xpos = 0; - } - } - - return ch - base; -} diff --git a/src/internal/perk_hdrdump_impl.h b/src/internal/perk_hdrdump_impl.h deleted file mode 100644 index 379d427..0000000 --- a/src/internal/perk_hdrdump_impl.h +++ /dev/null @@ -1,63 +0,0 @@ -/***************************************************************/ -/* perk: PE Resource Kit */ -/* Copyright (C) 2015--2021 SysDeer Technologies, LLC */ -/* Released under GPLv2 and GPLv3; see COPYING.PERK. */ -/***************************************************************/ - -#ifndef PERK_HDRDUMP_IMPL_H -#define PERK_HDRDUMP_IMPL_H - -#include - -#define PE_QUOTE(s) #s -#define PE_STRING(s) PE_QUOTE(s) -#define PE_TYPE(t) struct pe_raw_ ## t -#define PE_OFFSET(t,x) offsetof(PE_TYPE(t),x) -#define PE_SIZE(p,x) sizeof((p)->x) - -#define PE_OUTPUT_RAW_ELEMENT_TABLE(ch,p,t,x) \ - pe_output_raw_element( \ - ch,p, \ - PE_STRING(x), \ - PE_OFFSET(t,x), \ - PE_SIZE(p,x)) - -#define PE_OUTPUT_TABLE(x) \ - PE_OUTPUT_RAW_ELEMENT_TABLE( \ - ch, \ - PE_ADDR, \ - PE_RAW_STRUCT, \ - x) - -size_t pe_output_hex_header( - char * buf, - const char * sname, - uint64_t faddr, - uint64_t vaddr, - int bits); - -size_t pe_output_hex_footer( - char * buf); - -size_t pe_output_raw_element( - char * ch, - const void * rdata, - const char * mname, - uint32_t moffset, - uint32_t msize); - -static inline int pe_image_bits(const struct pe_image_meta * m) -{ - switch (m->m_abi) { - case PE_ABI_PE32: - return 32; - - case PE_ABI_PE64: - return 64; - - default: - return -1; - } -} - -#endif diff --git a/src/internal/perk_hexdump_impl.c b/src/internal/perk_hexdump_impl.c new file mode 100644 index 0000000..01effe0 --- /dev/null +++ b/src/internal/perk_hexdump_impl.c @@ -0,0 +1,237 @@ +/***************************************************************/ +/* perk: PE Resource Kit */ +/* Copyright (C) 2015--2021 SysDeer Technologies, LLC */ +/* Released under GPLv2 and GPLv3; see COPYING.PERK. */ +/***************************************************************/ + +#include +#include + +#include +#include +#include +#include "perk_hexdump_impl.h" +#include "perk_visibility_impl.h" + +#define PE_TABWIDTH 8 +#define PE_HDRSPACE 40 + +static const char pe_hex_header_hex[] = + " 0 1 2 3 4 5 6 7 8 9 a b c d e f 01234567 89abcdef\n"; + +static const char pe_hex_header_dot[] = + " .-------------------------------------------------. .-----------------.\n"; + +static const char pe_hex_footer[] = + "|---------------------------------------------------| |-----------------|\n\n"; + +perk_hidden size_t pe_output_hex_header( + char * buf, + const char * sname, + uint64_t faddr, + uint64_t vaddr, + int bits) +{ + char * ch; + size_t hlen; + size_t dlen; + size_t slen; + size_t nlen; + uint32_t high; + uint32_t low; + + ch = buf; + hlen = strlen(pe_hex_header_hex); + dlen = strlen(pe_hex_header_dot); + slen = strlen(sname); + + switch (bits) { + case 32: + low = faddr; + nlen = sprintf(ch,"faddr: 0x%08x\n",low); + break; + + case 64: + low = faddr; + high = faddr >> 32; + nlen = sprintf(ch,"faddr: 0x%08x%08x\n",high,low); + break; + + default: + return -1; + } + + ch += nlen; + + switch (bits) { + case 32: + low = vaddr; + nlen = sprintf(ch,"vaddr: 0x%08x",low); + break; + + default: + low = vaddr; + high = vaddr >> 32; + nlen = sprintf(ch,"vaddr: 0x%08x%08x",high,low); + break; + } + + ch += nlen; + memset(ch,' ',PE_HDRSPACE - nlen); + ch += PE_HDRSPACE - nlen; + + memcpy(ch,pe_hex_header_hex,hlen); + ch += hlen; + + memcpy(ch,sname,slen); + + ch += slen; + memset(ch,' ',PE_HDRSPACE - slen); + ch += PE_HDRSPACE - slen; + + memcpy(ch,pe_hex_header_dot,dlen); + ch += dlen; + + return ch - buf; +} + +perk_hidden size_t pe_output_hex_footer(char * buf) +{ + size_t nlen; + + memset(buf,' ',PE_HDRSPACE); + buf += PE_HDRSPACE; + + nlen = strlen(pe_hex_footer); + memcpy(buf,pe_hex_footer,nlen); + + return PE_HDRSPACE + nlen; +} + +perk_hidden size_t pe_output_raw_element( + char * ch, + const void * rdata, + const char * mname, + uint32_t moffset, + uint32_t msize) +{ + size_t nlen; + char * base; + uintptr_t addr; + const unsigned char * src; + const unsigned char * cap; + const unsigned char * mark; + size_t pos; + size_t xpos; + const char xch[] = "0123456789abcdef"; + + /* init */ + base = ch; + + /* pos */ + addr = (uintptr_t)rdata; + addr += moffset; + pos = addr % 0x10; + xpos = pos; + + /* struct member name */ + memset(ch,' ',PE_TABWIDTH); + ch += PE_TABWIDTH; + + *ch++ = '.'; + nlen = strlen(mname); + memcpy(ch,mname,nlen); + + ch += nlen; + *ch++ = ':'; + + /* hex dump column */ + nlen = PE_HDRSPACE - PE_TABWIDTH - nlen - 2; + memset(ch,' ',nlen); + ch += nlen; + + *ch++ = '|'; + *ch++ = ' '; + + nlen = 3 * pos; + memset(ch,' ',nlen); + ch += nlen; + + if (pos >= 8) { + *ch++ = ' '; + *ch++ = ' '; + } + + /* hex dump */ + src = rdata; + src += moffset; + + mark = src; + cap = src + msize; + + for (; src= 7); + memset(ch,' ',nlen); + ch += nlen; + + /* binary dump */ + for (; mark= 0x20) && (*mark < 0x7f) + ? *mark : '.'; + + /* pretty columns */ + if ((++mark < src) && (++xpos == 8)) { + *ch++ = ' '; + xpos = 0; + } + } + + nlen = 0xf - pos; + nlen += (pos <= 7); + + memset(ch,' ',nlen); + ch += nlen; + + *ch++ = '|'; + *ch++ = '\n'; + } + + /* does member hex dump span across more than one line? */ + if ((src < cap) && (++pos == 0x10)) { + memset(ch,' ',PE_HDRSPACE); + ch += PE_HDRSPACE; + *ch++ = '|'; + *ch++ = ' '; + + mark = src; + pos = 0; + xpos = 0; + } + } + + return ch - base; +} diff --git a/src/internal/perk_hexdump_impl.h b/src/internal/perk_hexdump_impl.h new file mode 100644 index 0000000..379d427 --- /dev/null +++ b/src/internal/perk_hexdump_impl.h @@ -0,0 +1,63 @@ +/***************************************************************/ +/* perk: PE Resource Kit */ +/* Copyright (C) 2015--2021 SysDeer Technologies, LLC */ +/* Released under GPLv2 and GPLv3; see COPYING.PERK. */ +/***************************************************************/ + +#ifndef PERK_HDRDUMP_IMPL_H +#define PERK_HDRDUMP_IMPL_H + +#include + +#define PE_QUOTE(s) #s +#define PE_STRING(s) PE_QUOTE(s) +#define PE_TYPE(t) struct pe_raw_ ## t +#define PE_OFFSET(t,x) offsetof(PE_TYPE(t),x) +#define PE_SIZE(p,x) sizeof((p)->x) + +#define PE_OUTPUT_RAW_ELEMENT_TABLE(ch,p,t,x) \ + pe_output_raw_element( \ + ch,p, \ + PE_STRING(x), \ + PE_OFFSET(t,x), \ + PE_SIZE(p,x)) + +#define PE_OUTPUT_TABLE(x) \ + PE_OUTPUT_RAW_ELEMENT_TABLE( \ + ch, \ + PE_ADDR, \ + PE_RAW_STRUCT, \ + x) + +size_t pe_output_hex_header( + char * buf, + const char * sname, + uint64_t faddr, + uint64_t vaddr, + int bits); + +size_t pe_output_hex_footer( + char * buf); + +size_t pe_output_raw_element( + char * ch, + const void * rdata, + const char * mname, + uint32_t moffset, + uint32_t msize); + +static inline int pe_image_bits(const struct pe_image_meta * m) +{ + switch (m->m_abi) { + case PE_ABI_PE32: + return 32; + + case PE_ABI_PE64: + return 64; + + default: + return -1; + } +} + +#endif -- cgit v1.2.3