mirror of
https://github.com/radareorg/radare2.git
synced 2025-02-03 12:12:06 +00:00
Fix PE exports parsing (adapted inisider patch) and some code cleanup
This commit is contained in:
parent
565ba636b3
commit
3e5eb05eda
@ -1116,37 +1116,34 @@ R_API int r_bin_is_big_endian (RBin *bin) {
|
||||
|
||||
R_API int r_bin_is_stripped (RBin *bin) {
|
||||
RBinObject *o = r_bin_cur_object (bin);
|
||||
if (o) return R_BIN_DBG_STRIPPED (o->info->dbg_info);
|
||||
if (o) return R_BIN_DBG_STRIPPED & o->info->dbg_info;
|
||||
return 1;
|
||||
}
|
||||
|
||||
R_API int r_bin_is_static (RBin *bin) {
|
||||
RBinObject *o = r_bin_cur_object (bin);
|
||||
if (o && r_list_length (o->libs)>0)
|
||||
return R_BIN_DBG_STATIC (o->info->dbg_info);
|
||||
return R_BIN_DBG_STATIC & o->info->dbg_info;
|
||||
return R_FALSE;
|
||||
}
|
||||
|
||||
// TODO: Integrate with r_bin_dbg */
|
||||
R_API int r_bin_has_dbg_linenums (RBin *bin) {
|
||||
RBinObject *o = r_bin_cur_object (bin);
|
||||
if (o)
|
||||
return R_BIN_DBG_LINENUMS (o->info->dbg_info);
|
||||
if (o) return R_BIN_DBG_LINENUMS & o->info->dbg_info;
|
||||
return R_FALSE;
|
||||
}
|
||||
|
||||
R_API int r_bin_has_dbg_syms (RBin *bin) {
|
||||
RBinObject *o = r_bin_cur_object (bin);
|
||||
if (o)
|
||||
return R_BIN_DBG_SYMS (o->info->dbg_info);
|
||||
if (o) return R_BIN_DBG_SYMS & o->info->dbg_info;
|
||||
return R_FALSE;
|
||||
}
|
||||
|
||||
R_API int r_bin_has_dbg_relocs (RBin *bin) {
|
||||
RBinObject *o = r_bin_cur_object (bin);
|
||||
if (o)
|
||||
return R_BIN_DBG_RELOCS (o->info->dbg_info);
|
||||
return R_FALSE;
|
||||
if (!o) return R_FALSE;
|
||||
return R_BIN_DBG_RELOCS & o->info->dbg_info;
|
||||
}
|
||||
|
||||
R_API RBin* r_bin_new() {
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* radare - LGPL - Copyright 2008-2014 nibble, pancake */
|
||||
/* radare - LGPL - Copyright 2008-2014 nibble, pancake, inisider */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
@ -10,19 +10,21 @@
|
||||
ut64 PE_(r_bin_pe_get_main_vaddr)(struct PE_(r_bin_pe_obj_t) *bin) {
|
||||
struct r_bin_pe_addr_t *entry = PE_(r_bin_pe_get_entrypoint) (bin);
|
||||
ut64 addr = 0;
|
||||
ut8 buf[512];
|
||||
ut8 b[512];
|
||||
|
||||
if (!bin || !bin->b) {
|
||||
free (entry);
|
||||
return 0LL;
|
||||
}
|
||||
// option2: /x 8bff558bec83ec20
|
||||
buf[367] = 0;
|
||||
if (r_buf_read_at (bin->b, entry->paddr, buf, sizeof (buf)) == -1) {
|
||||
eprintf ("Error: Cannot read entry at 0x%08"PFMT64x"\n", entry->paddr);
|
||||
b[367] = 0;
|
||||
if (r_buf_read_at (bin->b, entry->paddr, b, sizeof (b)) == -1) {
|
||||
eprintf ("Error: Cannot read entry at 0x%08"PFMT64x"\n",
|
||||
entry->paddr);
|
||||
} else {
|
||||
if (buf[367] == 0xe8) {
|
||||
int delta = (buf[368] | buf[369]<<8 | buf[370]<<16 | buf[371]<<24);
|
||||
if (b[367] == 0xe8) {
|
||||
int delta = b[368] | (b[369]<<8) | \
|
||||
(b[370]<<16) | (b[371]<<24);
|
||||
addr = entry->vaddr + 367 + 5 + delta;
|
||||
}
|
||||
}
|
||||
@ -30,7 +32,8 @@ ut64 PE_(r_bin_pe_get_main_vaddr)(struct PE_(r_bin_pe_obj_t) *bin) {
|
||||
return addr;
|
||||
}
|
||||
|
||||
static PE_DWord PE_(r_bin_pe_vaddr_to_paddr)(struct PE_(r_bin_pe_obj_t)* bin, PE_DWord vaddr) {
|
||||
#define RBinPEObj struct PE_(r_bin_pe_obj_t)
|
||||
static PE_DWord PE_(r_bin_pe_vaddr_to_paddr)(RBinPEObj* bin, PE_DWord vaddr) {
|
||||
PE_DWord section_base;
|
||||
int i, section_size;
|
||||
|
||||
@ -38,7 +41,8 @@ static PE_DWord PE_(r_bin_pe_vaddr_to_paddr)(struct PE_(r_bin_pe_obj_t)* bin, PE
|
||||
section_base = bin->section_header[i].VirtualAddress;
|
||||
section_size = bin->section_header[i].Misc.VirtualSize;
|
||||
if (vaddr >= section_base && vaddr < section_base + section_size)
|
||||
return bin->section_header[i].PointerToRawData + (vaddr - section_base);
|
||||
return bin->section_header[i].PointerToRawData \
|
||||
+ (vaddr - section_base);
|
||||
}
|
||||
return vaddr;
|
||||
}
|
||||
@ -75,7 +79,8 @@ static int PE_(r_bin_pe_get_delay_import_dirs_count)(struct PE_(r_bin_pe_obj_t)
|
||||
data_dir_delay_import = \
|
||||
&bin->nt_headers->optional_header.DataDirectory[\
|
||||
PE_IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT];
|
||||
return (int)(data_dir_delay_import->Size / sizeof(PE_(image_delay_import_directory)) - 1);
|
||||
return (int)(data_dir_delay_import->Size / \
|
||||
sizeof(PE_(image_delay_import_directory)) - 1);
|
||||
}
|
||||
|
||||
static int PE_(r_bin_pe_parse_imports)(struct PE_(r_bin_pe_obj_t)* bin, struct r_bin_pe_import_t** importp, int* nimp, char* dll_name, PE_DWord OriginalFirstThunk, PE_DWord FirstThunk) {
|
||||
@ -187,16 +192,15 @@ static struct r_bin_pe_export_t* parse_symbol_table(struct PE_(r_bin_pe_obj_t)*
|
||||
char *buf;
|
||||
|
||||
if (!bin || !bin->nt_headers)
|
||||
return 0;
|
||||
return NULL;
|
||||
off = bin->nt_headers->file_header.PointerToSymbolTable;
|
||||
num = bin->nt_headers->file_header.NumberOfSymbols;
|
||||
shsz = bufsz = num * srsz;
|
||||
if (bufsz<1 || bufsz>bin->size) {
|
||||
return 0;
|
||||
}
|
||||
if (bufsz<1 || bufsz>bin->size)
|
||||
return NULL;
|
||||
buf = malloc (bufsz);
|
||||
if (!buf)
|
||||
return 0;
|
||||
return NULL;
|
||||
exports_sz = sizeof (struct r_bin_pe_export_t)*num;
|
||||
if (exports) {
|
||||
int osz = sz;
|
||||
@ -205,7 +209,7 @@ static struct r_bin_pe_export_t* parse_symbol_table(struct PE_(r_bin_pe_obj_t)*
|
||||
exports = realloc (exports, sz);
|
||||
if (!exports) {
|
||||
free (buf);
|
||||
return 0;
|
||||
return NULL;
|
||||
}
|
||||
exp = (struct r_bin_pe_export_t*) (((const ut8*)exports) + osz);
|
||||
} else {
|
||||
@ -617,7 +621,7 @@ struct r_bin_pe_addr_t* PE_(r_bin_pe_get_entrypoint)(struct PE_(r_bin_pe_obj_t)*
|
||||
}
|
||||
|
||||
struct r_bin_pe_export_t* PE_(r_bin_pe_get_exports)(struct PE_(r_bin_pe_obj_t)* bin) {
|
||||
struct r_bin_pe_export_t *exports = NULL;
|
||||
struct r_bin_pe_export_t *exp, *exports = NULL;
|
||||
PE_Word function_ordinal;
|
||||
PE_VWord functions_paddr, names_paddr, ordinals_paddr, function_vaddr, name_vaddr, name_paddr;
|
||||
char function_name[PE_NAME_LENGTH + 1], forwarder_name[PE_NAME_LENGTH + 1];
|
||||
@ -630,49 +634,59 @@ struct r_bin_pe_export_t* PE_(r_bin_pe_get_exports)(struct PE_(r_bin_pe_obj_t)*
|
||||
if (!bin || !bin->nt_headers)
|
||||
return NULL;
|
||||
data_dir_export = \
|
||||
&bin->nt_headers->optional_header.DataDirectory[PE_IMAGE_DIRECTORY_ENTRY_EXPORT];
|
||||
export_dir_vaddr = data_dir_export->VirtualAddress;
|
||||
&bin->nt_headers->optional_header.\
|
||||
DataDirectory[PE_IMAGE_DIRECTORY_ENTRY_EXPORT];
|
||||
export_dir_vaddr = data_dir_export->VirtualAddress;
|
||||
export_dir_size = data_dir_export->Size;
|
||||
|
||||
if (bin->export_directory) {
|
||||
exports_sz = (bin->export_directory->NumberOfNames + 1) * sizeof(struct r_bin_pe_export_t);
|
||||
exports_sz = (bin->export_directory->NumberOfNames + 1) \
|
||||
* sizeof(struct r_bin_pe_export_t);
|
||||
if (!(exports = malloc (exports_sz)))
|
||||
return NULL;
|
||||
if (r_buf_read_at (bin->b, PE_(r_bin_pe_vaddr_to_paddr)(bin, bin->export_directory->Name),
|
||||
if (r_buf_read_at (bin->b, PE_(r_bin_pe_vaddr_to_paddr)(
|
||||
bin, bin->export_directory->Name),
|
||||
(ut8*)dll_name, PE_NAME_LENGTH) == -1) {
|
||||
eprintf ("Error: read (dll name)\n");
|
||||
return NULL;
|
||||
}
|
||||
functions_paddr = PE_(r_bin_pe_vaddr_to_paddr)(bin, bin->export_directory->AddressOfFunctions);
|
||||
names_paddr = PE_(r_bin_pe_vaddr_to_paddr)(bin, bin->export_directory->AddressOfNames);
|
||||
ordinals_paddr = PE_(r_bin_pe_vaddr_to_paddr)(bin, bin->export_directory->AddressOfOrdinals);
|
||||
functions_paddr = PE_(r_bin_pe_vaddr_to_paddr)(bin,
|
||||
bin->export_directory->AddressOfFunctions);
|
||||
names_paddr = PE_(r_bin_pe_vaddr_to_paddr)(bin,
|
||||
bin->export_directory->AddressOfNames);
|
||||
ordinals_paddr = PE_(r_bin_pe_vaddr_to_paddr)(bin,
|
||||
bin->export_directory->AddressOfOrdinals);
|
||||
for (i = 0; i < bin->export_directory->NumberOfNames; i++) {
|
||||
if (r_buf_read_at (bin->b, names_paddr + i * sizeof (PE_VWord), (ut8*)&name_vaddr,
|
||||
if (r_buf_read_at (bin->b, names_paddr + i *
|
||||
sizeof (PE_VWord), (ut8*)&name_vaddr,
|
||||
sizeof (PE_VWord)) == -1) {
|
||||
eprintf ("Error: read (name vaddr)\n");
|
||||
free (exports);
|
||||
return NULL;
|
||||
}
|
||||
if (r_buf_read_at (bin->b, ordinals_paddr + i * sizeof(PE_Word), (ut8*)&function_ordinal,
|
||||
if (r_buf_read_at (bin->b, ordinals_paddr + i *
|
||||
sizeof(PE_Word), (ut8*)&function_ordinal,
|
||||
sizeof (PE_Word)) == -1) {
|
||||
eprintf ("Error: read (function ordinal)\n");
|
||||
return NULL;
|
||||
}
|
||||
if (r_buf_read_at (bin->b, functions_paddr + function_ordinal * sizeof(PE_VWord),
|
||||
(ut8*)&function_vaddr, sizeof(PE_VWord)) == -1) {
|
||||
if (-1 == r_buf_read_at (bin->b, functions_paddr +
|
||||
function_ordinal * sizeof(PE_VWord),
|
||||
(ut8*)&function_vaddr, sizeof(PE_VWord))) {
|
||||
eprintf ("Error: read (function vaddr)\n");
|
||||
return NULL;
|
||||
}
|
||||
name_paddr = PE_(r_bin_pe_vaddr_to_paddr)(bin, name_vaddr);
|
||||
if (name_paddr) {
|
||||
if (r_buf_read_at(bin->b, name_paddr, (ut8*)function_name, PE_NAME_LENGTH) == -1) {
|
||||
if (-1 == r_buf_read_at(bin->b, name_paddr,
|
||||
(ut8*)function_name, PE_NAME_LENGTH)) {
|
||||
eprintf("Error: read (function name)\n");
|
||||
return NULL;
|
||||
}
|
||||
} else {
|
||||
snprintf (function_name, PE_NAME_LENGTH, "Ordinal_%i", function_ordinal);
|
||||
}
|
||||
snprintf(export_name, PE_NAME_LENGTH, "%s_%s", dll_name, function_name);
|
||||
snprintf (export_name, PE_NAME_LENGTH, "%s_%s", dll_name, function_name);
|
||||
if (function_vaddr >= export_dir_vaddr && function_vaddr < (export_dir_vaddr + export_dir_size)) {
|
||||
if (r_buf_read_at (bin->b, PE_(r_bin_pe_vaddr_to_paddr)(bin, function_vaddr),
|
||||
(ut8*)forwarder_name, PE_NAME_LENGTH) == -1) {
|
||||
@ -694,9 +708,9 @@ export_dir_vaddr = data_dir_export->VirtualAddress;
|
||||
exports[i].last = 1;
|
||||
}
|
||||
|
||||
if (parse_symbol_table (bin, exports, exports_sz - 1) == 0) {
|
||||
eprintf("Warning: bad symbol table\n");
|
||||
}
|
||||
exp = parse_symbol_table (bin, exports, exports_sz - 1);
|
||||
if (exp) exports = exp;
|
||||
//else eprintf ("Warning: bad symbol table\n");
|
||||
|
||||
return exports;
|
||||
}
|
||||
@ -846,99 +860,69 @@ int PE_(r_bin_pe_get_image_size)(struct PE_(r_bin_pe_obj_t)* bin) {
|
||||
|
||||
// TODO: make it const! like in elf
|
||||
char* PE_(r_bin_pe_get_machine)(struct PE_(r_bin_pe_obj_t)* bin) {
|
||||
char *machine;
|
||||
char *machine = NULL;
|
||||
|
||||
if (!bin || !bin->nt_headers)
|
||||
return NULL;
|
||||
if (bin && bin->nt_headers)
|
||||
switch (bin->nt_headers->file_header.Machine) {
|
||||
case PE_IMAGE_FILE_MACHINE_ALPHA:
|
||||
machine = strdup("Alpha");
|
||||
break;
|
||||
machine = "Alpha"; break;
|
||||
case PE_IMAGE_FILE_MACHINE_ALPHA64:
|
||||
machine = strdup("Alpha 64");
|
||||
break;
|
||||
machine = "Alpha 64"; break;
|
||||
case PE_IMAGE_FILE_MACHINE_AM33:
|
||||
machine = strdup("AM33");
|
||||
break;
|
||||
machine = "AM33"; break;
|
||||
case PE_IMAGE_FILE_MACHINE_AMD64:
|
||||
machine = strdup("AMD 64");
|
||||
break;
|
||||
machine = "AMD 64"; break;
|
||||
case PE_IMAGE_FILE_MACHINE_ARM:
|
||||
machine = strdup("ARM");
|
||||
break;
|
||||
machine = "ARM"; break;
|
||||
case PE_IMAGE_FILE_MACHINE_CEE:
|
||||
machine = strdup("CEE");
|
||||
break;
|
||||
machine = "CEE"; break;
|
||||
case PE_IMAGE_FILE_MACHINE_CEF:
|
||||
machine = strdup("CEF");
|
||||
break;
|
||||
machine = "CEF"; break;
|
||||
case PE_IMAGE_FILE_MACHINE_EBC:
|
||||
machine = strdup("EBC");
|
||||
break;
|
||||
machine = "EBC"; break;
|
||||
case PE_IMAGE_FILE_MACHINE_I386:
|
||||
machine = strdup("i386");
|
||||
break;
|
||||
machine = "i386"; break;
|
||||
case PE_IMAGE_FILE_MACHINE_IA64:
|
||||
machine = strdup("ia64");
|
||||
break;
|
||||
machine = "ia64"; break;
|
||||
case PE_IMAGE_FILE_MACHINE_M32R:
|
||||
machine = strdup("M32R");
|
||||
break;
|
||||
machine = "M32R"; break;
|
||||
case PE_IMAGE_FILE_MACHINE_M68K:
|
||||
machine = strdup("M68K");
|
||||
break;
|
||||
machine = "M68K"; break;
|
||||
case PE_IMAGE_FILE_MACHINE_MIPS16:
|
||||
machine = strdup("Mips 16");
|
||||
break;
|
||||
machine = "Mips 16"; break;
|
||||
case PE_IMAGE_FILE_MACHINE_MIPSFPU:
|
||||
machine = strdup("Mips FPU");
|
||||
break;
|
||||
machine = "Mips FPU"; break;
|
||||
case PE_IMAGE_FILE_MACHINE_MIPSFPU16:
|
||||
machine = strdup("Mips FPU 16");
|
||||
break;
|
||||
machine = "Mips FPU 16"; break;
|
||||
case PE_IMAGE_FILE_MACHINE_POWERPC:
|
||||
machine = strdup("PowerPC");
|
||||
break;
|
||||
machine = "PowerPC"; break;
|
||||
case PE_IMAGE_FILE_MACHINE_POWERPCFP:
|
||||
machine = strdup("PowerPC FP");
|
||||
break;
|
||||
machine = "PowerPC FP"; break;
|
||||
case PE_IMAGE_FILE_MACHINE_R10000:
|
||||
machine = strdup("R10000");
|
||||
break;
|
||||
machine = "R10000"; break;
|
||||
case PE_IMAGE_FILE_MACHINE_R3000:
|
||||
machine = strdup("R3000");
|
||||
break;
|
||||
machine = "R3000"; break;
|
||||
case PE_IMAGE_FILE_MACHINE_R4000:
|
||||
machine = strdup("R4000");
|
||||
break;
|
||||
machine = "R4000"; break;
|
||||
case PE_IMAGE_FILE_MACHINE_SH3:
|
||||
machine = strdup("SH3");
|
||||
break;
|
||||
machine = "SH3"; break;
|
||||
case PE_IMAGE_FILE_MACHINE_SH3DSP:
|
||||
machine = strdup("SH3DSP");
|
||||
break;
|
||||
machine = "SH3DSP"; break;
|
||||
case PE_IMAGE_FILE_MACHINE_SH3E:
|
||||
machine = strdup("SH3E");
|
||||
break;
|
||||
machine = "SH3E"; break;
|
||||
case PE_IMAGE_FILE_MACHINE_SH4:
|
||||
machine = strdup("SH4");
|
||||
break;
|
||||
machine = "SH4"; break;
|
||||
case PE_IMAGE_FILE_MACHINE_SH5:
|
||||
machine = strdup("SH5");
|
||||
break;
|
||||
machine = "SH5"; break;
|
||||
case PE_IMAGE_FILE_MACHINE_THUMB:
|
||||
machine = strdup("Thumb");
|
||||
break;
|
||||
machine = "Thumb"; break;
|
||||
case PE_IMAGE_FILE_MACHINE_TRICORE:
|
||||
machine = strdup("Tricore");
|
||||
break;
|
||||
machine = "Tricore"; break;
|
||||
case PE_IMAGE_FILE_MACHINE_WCEMIPSV2:
|
||||
machine = strdup("WCE Mips V2");
|
||||
break;
|
||||
default:
|
||||
machine = strdup("unknown");
|
||||
machine = "WCE Mips V2"; break;
|
||||
default: machine = "unknown";
|
||||
}
|
||||
return machine;
|
||||
return machine? strdup (machine): NULL;
|
||||
}
|
||||
|
||||
// TODO: make it const! like in elf
|
||||
@ -1018,10 +1002,11 @@ struct r_bin_pe_section_t* PE_(r_bin_pe_get_sections)(struct PE_(r_bin_pe_obj_t)
|
||||
int i, sections_count;
|
||||
|
||||
if (!bin || !bin->nt_headers)
|
||||
return 0;
|
||||
shdr = bin->section_header;
|
||||
return NULL;
|
||||
shdr = bin->section_header;
|
||||
sections_count = bin->nt_headers->file_header.NumberOfSections;
|
||||
if (!(sections = malloc ((sections_count + 1) * sizeof (struct r_bin_pe_section_t)))) {
|
||||
if (!(sections = malloc ((sections_count + 1) \
|
||||
* sizeof (struct r_bin_pe_section_t)))) {
|
||||
r_sys_perror ("malloc (sections)");
|
||||
return NULL;
|
||||
}
|
||||
@ -1043,56 +1028,46 @@ shdr = bin->section_header;
|
||||
}
|
||||
|
||||
char* PE_(r_bin_pe_get_subsystem)(struct PE_(r_bin_pe_obj_t)* bin) {
|
||||
char *subsystem;
|
||||
if (!bin || !bin->nt_headers)
|
||||
return NULL;
|
||||
char *subsystem = NULL;
|
||||
if (bin && bin->nt_headers)
|
||||
switch (bin->nt_headers->optional_header.Subsystem) {
|
||||
case PE_IMAGE_SUBSYSTEM_NATIVE:
|
||||
subsystem = strdup("Native");
|
||||
break;
|
||||
subsystem = "Native"; break;
|
||||
case PE_IMAGE_SUBSYSTEM_WINDOWS_GUI:
|
||||
subsystem = strdup("Windows GUI");
|
||||
break;
|
||||
subsystem = "Windows GUI"; break;
|
||||
case PE_IMAGE_SUBSYSTEM_WINDOWS_CUI:
|
||||
subsystem = strdup("Windows CUI");
|
||||
break;
|
||||
subsystem = "Windows CUI"; break;
|
||||
case PE_IMAGE_SUBSYSTEM_POSIX_CUI:
|
||||
subsystem = strdup("POSIX CUI");
|
||||
break;
|
||||
subsystem = "POSIX CUI"; break;
|
||||
case PE_IMAGE_SUBSYSTEM_WINDOWS_CE_GUI:
|
||||
subsystem = strdup("Windows CE GUI");
|
||||
break;
|
||||
subsystem = "Windows CE GUI"; break;
|
||||
case PE_IMAGE_SUBSYSTEM_EFI_APPLICATION:
|
||||
subsystem = strdup("EFI Application");
|
||||
break;
|
||||
subsystem = "EFI Application"; break;
|
||||
case PE_IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER:
|
||||
subsystem = strdup("EFI Boot Service Driver");
|
||||
break;
|
||||
subsystem = "EFI Boot Service Driver"; break;
|
||||
case PE_IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER:
|
||||
subsystem = strdup("EFI Runtime Driver");
|
||||
break;
|
||||
subsystem = "EFI Runtime Driver"; break;
|
||||
case PE_IMAGE_SUBSYSTEM_EFI_ROM:
|
||||
subsystem = strdup("EFI ROM");
|
||||
break;
|
||||
subsystem = "EFI ROM"; break;
|
||||
case PE_IMAGE_SUBSYSTEM_XBOX:
|
||||
subsystem = strdup("XBOX");
|
||||
break;
|
||||
default:
|
||||
subsystem = strdup("Unknown");
|
||||
subsystem = "XBOX"; break;
|
||||
default: subsystem = "Unknown";
|
||||
}
|
||||
return subsystem;
|
||||
return subsystem? strdup (subsystem): NULL;
|
||||
}
|
||||
|
||||
#define HASCHR(x) bin->nt_headers->file_header.Characteristics
|
||||
|
||||
int PE_(r_bin_pe_is_dll)(struct PE_(r_bin_pe_obj_t)* bin) {
|
||||
if (!bin || !bin->nt_headers)
|
||||
return 0;
|
||||
return bin->nt_headers->file_header.Characteristics & PE_IMAGE_FILE_DLL;
|
||||
return R_FALSE;
|
||||
return HASCHR (PE_IMAGE_FILE_DLL);
|
||||
}
|
||||
|
||||
int PE_(r_bin_pe_is_pie)(struct PE_(r_bin_pe_obj_t)* bin) {
|
||||
if (!bin || !bin->nt_headers)
|
||||
return 0;
|
||||
return bin->nt_headers->optional_header.DllCharacteristics & IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE;
|
||||
return R_FALSE;
|
||||
return HASCHR (IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE);
|
||||
#if 0
|
||||
BOOL aslr = inh->OptionalHeader.DllCharacteristics & IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE;
|
||||
//TODO : implement dep?
|
||||
@ -1102,32 +1077,32 @@ int PE_(r_bin_pe_is_pie)(struct PE_(r_bin_pe_obj_t)* bin) {
|
||||
|
||||
int PE_(r_bin_pe_is_big_endian)(struct PE_(r_bin_pe_obj_t)* bin) {
|
||||
if (!bin || !bin->nt_headers)
|
||||
return 0;
|
||||
return bin->nt_headers->file_header.Characteristics & PE_IMAGE_FILE_BYTES_REVERSED_HI;
|
||||
return R_FALSE;
|
||||
return HASCHR (PE_IMAGE_FILE_BYTES_REVERSED_HI);
|
||||
}
|
||||
|
||||
int PE_(r_bin_pe_is_stripped_relocs)(struct PE_(r_bin_pe_obj_t)* bin) {
|
||||
if (!bin || !bin->nt_headers)
|
||||
return 0;
|
||||
return bin->nt_headers->file_header.Characteristics & PE_IMAGE_FILE_RELOCS_STRIPPED;
|
||||
return R_FALSE;
|
||||
return HASCHR (PE_IMAGE_FILE_RELOCS_STRIPPED);
|
||||
}
|
||||
|
||||
int PE_(r_bin_pe_is_stripped_line_nums)(struct PE_(r_bin_pe_obj_t)* bin) {
|
||||
if (!bin || !bin->nt_headers)
|
||||
return 0;
|
||||
return bin->nt_headers->file_header.Characteristics & PE_IMAGE_FILE_LINE_NUMS_STRIPPED;
|
||||
return R_FALSE;
|
||||
return HASCHR (PE_IMAGE_FILE_LINE_NUMS_STRIPPED);
|
||||
}
|
||||
|
||||
int PE_(r_bin_pe_is_stripped_local_syms)(struct PE_(r_bin_pe_obj_t)* bin) {
|
||||
if (!bin || !bin->nt_headers)
|
||||
return 0;
|
||||
return bin->nt_headers->file_header.Characteristics & PE_IMAGE_FILE_LOCAL_SYMS_STRIPPED;
|
||||
return R_FALSE;
|
||||
return HASCHR (PE_IMAGE_FILE_LOCAL_SYMS_STRIPPED);
|
||||
}
|
||||
|
||||
int PE_(r_bin_pe_is_stripped_debug)(struct PE_(r_bin_pe_obj_t)* bin) {
|
||||
if (!bin || !bin->nt_headers)
|
||||
return 0;
|
||||
return bin->nt_headers->file_header.Characteristics & PE_IMAGE_FILE_DEBUG_STRIPPED;
|
||||
return R_FALSE;
|
||||
return HASCHR (PE_IMAGE_FILE_DEBUG_STRIPPED);
|
||||
}
|
||||
|
||||
void* PE_(r_bin_pe_free)(struct PE_(r_bin_pe_obj_t)* bin) {
|
||||
|
@ -204,6 +204,7 @@ static RList* strings (RBinFile *arch) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
#if 0
|
||||
static inline ut32 getmethodoffset (struct r_bin_dex_obj_t *bin, int n, ut32 *size) {
|
||||
ut8 *buf, *map_end, *map;
|
||||
ut32 mapsz, off = 0L;
|
||||
@ -225,6 +226,7 @@ static inline ut32 getmethodoffset (struct r_bin_dex_obj_t *bin, int n, ut32 *si
|
||||
}
|
||||
return off;
|
||||
}
|
||||
#endif
|
||||
|
||||
static char *get_string (struct r_bin_dex_obj_t *bin, int idx) {
|
||||
const ut8 buf[128], *buf2;
|
||||
|
@ -20,7 +20,6 @@ static Sdb* get_sdb (RBinObject *o) {
|
||||
static void * load_bytes(const ut8 *buf, ut64 sz, ut64 loadaddr, Sdb *sdb){
|
||||
void *res = NULL;
|
||||
RBuffer *tbuf = NULL;
|
||||
|
||||
if (!buf || sz == 0 || sz == UT64_MAX) return NULL;
|
||||
tbuf = r_buf_new();
|
||||
r_buf_set_bytes (tbuf, buf, sz);
|
||||
@ -30,16 +29,13 @@ static void * load_bytes(const ut8 *buf, ut64 sz, ut64 loadaddr, Sdb *sdb){
|
||||
}
|
||||
|
||||
static int load(RBinFile *arch) {
|
||||
void *res;
|
||||
const ut8 *bytes = arch ? r_buf_buffer (arch->buf) : NULL;
|
||||
ut64 sz = arch ? r_buf_size (arch->buf): 0;
|
||||
|
||||
if (!arch || !arch->o) return R_FALSE;
|
||||
void *res = load_bytes (bytes, sz, arch->o->loadaddr, arch->sdb);
|
||||
|
||||
res = load_bytes (bytes, sz, arch->o->loadaddr, arch->sdb);
|
||||
arch->o->bin_obj = res;
|
||||
if(!res)
|
||||
return R_FALSE;
|
||||
return R_TRUE;
|
||||
return res? R_TRUE: R_FALSE;
|
||||
}
|
||||
|
||||
static int destroy(RBinFile *arch) {
|
||||
@ -263,7 +259,7 @@ static int has_canary(RBinFile *arch) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int has_dll_characteristics(const RBinFile* arch, ut16 dllCharacteristic) {
|
||||
static int haschr(const RBinFile* arch, ut16 dllCharacteristic) {
|
||||
const ut8 *buf;
|
||||
unsigned int idx;
|
||||
ut64 sz;
|
||||
@ -278,7 +274,6 @@ static int has_dll_characteristics(const RBinFile* arch, ut16 dllCharacteristic)
|
||||
dllCharacteristic);
|
||||
}
|
||||
|
||||
|
||||
static RBinInfo* info(RBinFile *arch) {
|
||||
char *str;
|
||||
RBinInfo *ret = R_NEW0 (RBinInfo);
|
||||
@ -316,32 +311,32 @@ static RBinInfo* info(RBinFile *arch) {
|
||||
ret->big_endian = PE_(r_bin_pe_is_big_endian) (arch->o->bin_obj);
|
||||
ret->dbg_info = 0;
|
||||
ret->has_canary = has_canary (arch);
|
||||
ret->has_nx = has_dll_characteristics (arch, IMAGE_DLL_CHARACTERISTICS_NX_COMPAT);
|
||||
ret->has_pi = has_dll_characteristics (arch, IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE);
|
||||
ret->has_nx = haschr (arch, IMAGE_DLL_CHARACTERISTICS_NX_COMPAT);
|
||||
ret->has_pi = haschr (arch, IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE);
|
||||
|
||||
sdb_bool_set (arch->sdb, "pe.canary", has_canary(arch), 0);
|
||||
sdb_bool_set (arch->sdb, "pe.highva", has_dll_characteristics(arch, IMAGE_DLLCHARACTERISTICS_HIGH_ENTROPY_VA), 0);
|
||||
sdb_bool_set (arch->sdb, "pe.aslr", has_dll_characteristics(arch, IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE), 0);
|
||||
sdb_bool_set (arch->sdb, "pe.forceintegrity", has_dll_characteristics(arch, IMAGE_DLL_CHARACTERISTICS_FORCE_INTEGRITY), 0);
|
||||
sdb_bool_set (arch->sdb, "pe.nx", has_dll_characteristics(arch, IMAGE_DLL_CHARACTERISTICS_NX_COMPAT), 0);
|
||||
sdb_bool_set (arch->sdb, "pe.isolation", !has_dll_characteristics(arch, IMAGE_DLL_CHARACTERISTICS_FORCE_INTEGRITY), 0);
|
||||
sdb_bool_set (arch->sdb, "pe.seh", !has_dll_characteristics(arch, IMAGE_DLLCHARACTERISTICS_NO_SEH), 0);
|
||||
sdb_bool_set (arch->sdb, "pe.bind", !has_dll_characteristics(arch, IMAGE_DLLCHARACTERISTICS_NO_BIND), 0);
|
||||
sdb_bool_set (arch->sdb, "pe.appcontainer", has_dll_characteristics(arch, IMAGE_DLLCHARACTERISTICS_APPCONTAINER), 0);
|
||||
sdb_bool_set (arch->sdb, "pe.wdmdriver", has_dll_characteristics(arch, IMAGE_DLLCHARACTERISTICS_WDM_DRIVER), 0);
|
||||
sdb_bool_set (arch->sdb, "pe.guardcf", has_dll_characteristics(arch, IMAGE_DLLCHARACTERISTICS_GUARD_CF), 0);
|
||||
sdb_bool_set (arch->sdb, "pe.terminalserveraware", has_dll_characteristics(arch, IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE), 0);
|
||||
sdb_bool_set (arch->sdb, "pe.highva", haschr(arch, IMAGE_DLLCHARACTERISTICS_HIGH_ENTROPY_VA), 0);
|
||||
sdb_bool_set (arch->sdb, "pe.aslr", haschr(arch, IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE), 0);
|
||||
sdb_bool_set (arch->sdb, "pe.forceintegrity", haschr(arch, IMAGE_DLL_CHARACTERISTICS_FORCE_INTEGRITY), 0);
|
||||
sdb_bool_set (arch->sdb, "pe.nx", haschr(arch, IMAGE_DLL_CHARACTERISTICS_NX_COMPAT), 0);
|
||||
sdb_bool_set (arch->sdb, "pe.isolation", !haschr(arch, IMAGE_DLL_CHARACTERISTICS_FORCE_INTEGRITY), 0);
|
||||
sdb_bool_set (arch->sdb, "pe.seh", !haschr(arch, IMAGE_DLLCHARACTERISTICS_NO_SEH), 0);
|
||||
sdb_bool_set (arch->sdb, "pe.bind", !haschr(arch, IMAGE_DLLCHARACTERISTICS_NO_BIND), 0);
|
||||
sdb_bool_set (arch->sdb, "pe.appcontainer", haschr(arch, IMAGE_DLLCHARACTERISTICS_APPCONTAINER), 0);
|
||||
sdb_bool_set (arch->sdb, "pe.wdmdriver", haschr(arch, IMAGE_DLLCHARACTERISTICS_WDM_DRIVER), 0);
|
||||
sdb_bool_set (arch->sdb, "pe.guardcf", haschr(arch, IMAGE_DLLCHARACTERISTICS_GUARD_CF), 0);
|
||||
sdb_bool_set (arch->sdb, "pe.terminalserveraware", haschr(arch, IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE), 0);
|
||||
sdb_num_set (arch->sdb, "pe.bits", ret->bits, 0);
|
||||
|
||||
ret->has_va = R_TRUE;
|
||||
if (!PE_(r_bin_pe_is_stripped_debug) (arch->o->bin_obj))
|
||||
ret->dbg_info |= 0x01;
|
||||
ret->dbg_info |= R_BIN_DBG_STRIPPED;
|
||||
if (PE_(r_bin_pe_is_stripped_line_nums) (arch->o->bin_obj))
|
||||
ret->dbg_info |= 0x04;
|
||||
ret->dbg_info |= R_BIN_DBG_LINENUMS;
|
||||
if (PE_(r_bin_pe_is_stripped_local_syms) (arch->o->bin_obj))
|
||||
ret->dbg_info |= 0x08;
|
||||
ret->dbg_info |= R_BIN_DBG_SYMS;
|
||||
if (PE_(r_bin_pe_is_stripped_relocs) (arch->o->bin_obj))
|
||||
ret->dbg_info |= 0x10;
|
||||
ret->dbg_info |= R_BIN_DBG_RELOCS;
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* radare - LGPL - Copyright 2009-2013 - nibble */
|
||||
/* radare - LGPL - Copyright 2009-2014 - nibble */
|
||||
|
||||
#define R_BIN_PE64 1
|
||||
#include "bin_pe.c"
|
||||
|
@ -236,12 +236,11 @@ static int bin_info (RCore *r, int mode) {
|
||||
r_str_bool (info->has_crypto),
|
||||
r_str_bool (info->has_va),
|
||||
info->bits,
|
||||
r_str_bool (R_BIN_DBG_STRIPPED (info->dbg_info)),
|
||||
r_str_bool (R_BIN_DBG_STRIPPED &info->dbg_info)),
|
||||
r_str_bool (r_bin_is_static (r->bin)),//R_BIN_DBG_STATIC (info->dbg_info)),
|
||||
r_str_bool (R_BIN_DBG_LINENUMS (info->dbg_info)),
|
||||
r_str_bool (R_BIN_DBG_SYMS (info->dbg_info)),
|
||||
r_str_bool (R_BIN_DBG_RELOCS (info->dbg_info))
|
||||
);
|
||||
r_str_bool (R_BIN_DBG_LINENUMS &info->dbg_info),
|
||||
r_str_bool (R_BIN_DBG_SYMS &info->dbg_info),
|
||||
r_str_bool (R_BIN_DBG_RELOCS &info->dbg_info);
|
||||
} else
|
||||
if ((mode & R_CORE_BIN_SIMPLE)) {
|
||||
r_cons_printf ("arch %s\n", info->arch);
|
||||
@ -262,7 +261,7 @@ static int bin_info (RCore *r, int mode) {
|
||||
snprintf (str, R_FLAG_NAME_SIZE, "%i", info->bits);
|
||||
r_config_set (r->config, "asm.bits", str);
|
||||
r_config_set (r->config, "asm.dwarf",
|
||||
R_BIN_DBG_STRIPPED (info->dbg_info)?"false":"true");
|
||||
(R_BIN_DBG_STRIPPED &info->dbg_info)?"false":"true");
|
||||
}
|
||||
} else {
|
||||
if (mode) {
|
||||
@ -285,7 +284,7 @@ static int bin_info (RCore *r, int mode) {
|
||||
"e asm.dwarf=%s\n",
|
||||
info->rclass, r_str_bool (info->big_endian), info->os,
|
||||
info->arch, info->arch, info->bits,
|
||||
r_str_bool (R_BIN_DBG_STRIPPED (info->dbg_info)));
|
||||
r_str_bool (R_BIN_DBG_STRIPPED &info->dbg_info));
|
||||
}
|
||||
} else {
|
||||
// if type is 'fs' show something different?
|
||||
@ -321,11 +320,11 @@ static int bin_info (RCore *r, int mode) {
|
||||
info->rclass, info->bclass, info->lang?info->lang:"unknown",
|
||||
info->arch, info->bits, info->machine, info->os,
|
||||
info->subsystem, info->big_endian? "big": "little",
|
||||
r_str_bool (R_BIN_DBG_STRIPPED (info->dbg_info)),
|
||||
r_str_bool (R_BIN_DBG_STRIPPED &info->dbg_info),
|
||||
r_str_bool (r_bin_is_static (r->bin)),
|
||||
r_str_bool (R_BIN_DBG_LINENUMS (info->dbg_info)),
|
||||
r_str_bool (R_BIN_DBG_SYMS (info->dbg_info)),
|
||||
r_str_bool (R_BIN_DBG_RELOCS (info->dbg_info)),
|
||||
r_str_bool (R_BIN_DBG_LINENUMS &info->dbg_info),
|
||||
r_str_bool (R_BIN_DBG_SYMS &info->dbg_info),
|
||||
r_str_bool (R_BIN_DBG_RELOCS &info->dbg_info),
|
||||
info->rpath);
|
||||
for (i=0; info->sum[i].type; i++) {
|
||||
int len;
|
||||
@ -901,9 +900,9 @@ delta = section->vaddr - r_bin_get_vaddr (r->bin, baddr, section->paddr, section
|
||||
if (!secbase || (section->vaddr && section->vaddr <secbase)) // ??
|
||||
secbase = section->vaddr;
|
||||
r_name_filter (section->name, 128);
|
||||
snprintf (str, R_FLAG_NAME_SIZE, "section.%s", section->name);
|
||||
snprintf (str, sizeof(str)-1, "section.%s", section->name);
|
||||
r_flag_set (r->flags, str, addr, section->size, 0);
|
||||
snprintf (str, R_FLAG_NAME_SIZE, "section_end.%s", section->name);
|
||||
snprintf (str, sizeof(str)-1, "section_end.%s", section->name);
|
||||
r_flag_set (r->flags, str, addr + section->size, 0, 0);
|
||||
r_io_section_add (r->io, section->paddr, addr, section->size,
|
||||
section->vsize, section->srwx, section->name, 0, fd);
|
||||
@ -914,14 +913,14 @@ delta = section->vaddr - r_bin_get_vaddr (r->bin, baddr, section->paddr, section
|
||||
if (!bits) bits = info->bits;
|
||||
//r_io_section_set_archbits (r->io, addr, arch, bits);
|
||||
}
|
||||
snprintf (str, R_FLAG_NAME_SIZE, "[%i] va=0x%08"PFMT64x" pa=0x%08"PFMT64x" sz=%"
|
||||
PFMT64d" vsz=%"PFMT64d" rwx=%c%c%c%c %s",
|
||||
i++, addr, section->paddr, section->size, section->vsize,
|
||||
R_BIN_SCN_SHAREABLE (section->srwx)?'s':'-',
|
||||
R_BIN_SCN_READABLE (section->srwx)?'r':'-',
|
||||
R_BIN_SCN_WRITABLE (section->srwx)?'w':'-',
|
||||
R_BIN_SCN_EXECUTABLE (section->srwx)?'x':'-',
|
||||
section->name);
|
||||
snprintf (str, sizeof(str)-1, "[%i] va=0x%08"PFMT64x" pa=0x%08"PFMT64x" sz=%"
|
||||
PFMT64d" vsz=%"PFMT64d" rwx=%c%c%c%c %s",
|
||||
i++, addr, section->paddr, section->size, section->vsize,
|
||||
(R_BIN_SCN_SHAREABLE §ion->srwx)?'s':'-',
|
||||
(R_BIN_SCN_READABLE §ion->srwx)?'r':'-',
|
||||
(R_BIN_SCN_WRITABLE §ion->srwx)?'w':'-',
|
||||
(R_BIN_SCN_EXECUTABLE §ion->srwx)?'x':'-',
|
||||
section->name);
|
||||
r_meta_add (r->anal, R_META_TYPE_COMMENT, addr, addr, str);
|
||||
}
|
||||
// H -> Header fields
|
||||
@ -967,10 +966,10 @@ delta = section->vaddr - r_bin_get_vaddr (r->bin, baddr, section->paddr, section
|
||||
r_cons_printf ("CC [%02i] va=0x%08"PFMT64x" pa=0x%08"PFMT64x" sz=%"PFMT64d" vsz=%"PFMT64d" "
|
||||
"rwx=%c%c%c%c %s @ 0x%08"PFMT64x"\n",
|
||||
i, addr, section->paddr, section->size, section->vsize,
|
||||
R_BIN_SCN_SHAREABLE (section->srwx)?'s':'-',
|
||||
R_BIN_SCN_READABLE (section->srwx)?'r':'-',
|
||||
R_BIN_SCN_WRITABLE (section->srwx)?'w':'-',
|
||||
R_BIN_SCN_EXECUTABLE (section->srwx)?'x':'-',
|
||||
(R_BIN_SCN_SHAREABLE §ion->srwx)?'s':'-',
|
||||
(R_BIN_SCN_READABLE §ion->srwx)?'r':'-',
|
||||
(R_BIN_SCN_WRITABLE §ion->srwx)?'w':'-',
|
||||
(R_BIN_SCN_EXECUTABLE §ion->srwx)?'x':'-',
|
||||
section->name, addr);
|
||||
} else {
|
||||
char str[128];
|
||||
@ -984,10 +983,10 @@ delta = section->vaddr - r_bin_get_vaddr (r->bin, baddr, section->paddr, section
|
||||
r_cons_printf ("idx=%02i addr=0x%08"PFMT64x" off=0x%08"PFMT64x" sz=%"PFMT64d" vsz=%"PFMT64d" "
|
||||
"perm=%c%c%c%c %sname=%s\n",
|
||||
i, addr, section->paddr, section->size, section->vsize,
|
||||
R_BIN_SCN_SHAREABLE (section->srwx)?'s':'-',
|
||||
R_BIN_SCN_READABLE (section->srwx)?'r':'-',
|
||||
R_BIN_SCN_WRITABLE (section->srwx)?'w':'-',
|
||||
R_BIN_SCN_EXECUTABLE (section->srwx)?'x':'-',
|
||||
(R_BIN_SCN_SHAREABLE §ion->srwx)?'s':'-',
|
||||
(R_BIN_SCN_READABLE §ion->srwx)?'r':'-',
|
||||
(R_BIN_SCN_WRITABLE §ion->srwx)?'w':'-',
|
||||
(R_BIN_SCN_EXECUTABLE §ion->srwx)?'x':'-',
|
||||
str, section->name);
|
||||
}
|
||||
}
|
||||
|
@ -16,16 +16,16 @@ extern "C" {
|
||||
|
||||
R_LIB_VERSION_HEADER (r_bin);
|
||||
|
||||
#define R_BIN_SCN_EXECUTABLE(x) x & 0x1
|
||||
#define R_BIN_SCN_WRITABLE(x) x & 0x2
|
||||
#define R_BIN_SCN_READABLE(x) x & 0x4
|
||||
#define R_BIN_SCN_SHAREABLE(x) x & 0x8
|
||||
#define R_BIN_SCN_EXECUTABLE 0x1
|
||||
#define R_BIN_SCN_WRITABLE 0x2
|
||||
#define R_BIN_SCN_READABLE 0x4
|
||||
#define R_BIN_SCN_SHAREABLE 0x8
|
||||
|
||||
#define R_BIN_DBG_STRIPPED(x) x & 0x01
|
||||
#define R_BIN_DBG_STATIC(x) x & 0x02
|
||||
#define R_BIN_DBG_LINENUMS(x) x & 0x04
|
||||
#define R_BIN_DBG_SYMS(x) x & 0x08
|
||||
#define R_BIN_DBG_RELOCS(x) x & 0x10
|
||||
#define R_BIN_DBG_STRIPPED 0x01
|
||||
#define R_BIN_DBG_STATIC 0x02
|
||||
#define R_BIN_DBG_LINENUMS 0x04
|
||||
#define R_BIN_DBG_SYMS 0x08
|
||||
#define R_BIN_DBG_RELOCS 0x10
|
||||
|
||||
#define R_BIN_SIZEOF_STRINGS 512
|
||||
#define R_BIN_MAX_ARCH 1024
|
||||
|
Loading…
x
Reference in New Issue
Block a user