From ba3065fb994140adc8e68858abd8eb599941af08 Mon Sep 17 00:00:00 2001 From: aaSSfxxx Date: Wed, 20 Nov 2013 09:45:17 +0100 Subject: [PATCH] Add get_vaddr to RBinPlugin and fix vaddr calculation for PE files --- libr/bin/bin.c | 11 +++++++++++ libr/bin/p/bin_pe.c | 6 ++++++ libr/core/bin.c | 41 +++++++++++++++++------------------------ libr/include/r_bin.h | 4 +++- 4 files changed, 37 insertions(+), 25 deletions(-) diff --git a/libr/bin/bin.c b/libr/bin/bin.c index edea3e4a3d..9d4d8f459e 100644 --- a/libr/bin/bin.c +++ b/libr/bin/bin.c @@ -711,6 +711,17 @@ R_API ut64 r_bin_get_offset (RBin *bin) { return bin->cur.offset; } +R_API ut64 r_bin_get_vaddr (RBin *bin, ut64 baddr, ut64 paddr, ut64 vaddr) { + RBinPlugin *cp = bin->cur.curplugin; + if(cp && cp->get_vaddr) + return cp->get_vaddr (baddr, paddr, vaddr); + + ut32 delta; + if (!baddr) return vaddr; + delta = (paddr & 0xfffff000) | (vaddr & 0xfff); + return baddr + delta; +} + R_API ut64 r_bin_get_size (RBin *bin) { return bin->cur.o->size; } diff --git a/libr/bin/p/bin_pe.c b/libr/bin/p/bin_pe.c index 714eeab3cb..9fc3ba075b 100644 --- a/libr/bin/p/bin_pe.c +++ b/libr/bin/p/bin_pe.c @@ -323,6 +323,11 @@ static RBuffer* create(RBin* bin, const ut8 *code, int codelen, const ut8 *data, return buf; } +static ut64 get_vaddr (ut64 baddr, ut64 paddr, ut64 vaddr) { + if (!baddr) return vaddr; + return baddr + vaddr; +} + struct r_bin_plugin_t r_bin_plugin_pe = { .name = "pe", .desc = "PE bin plugin", @@ -346,6 +351,7 @@ struct r_bin_plugin_t r_bin_plugin_pe = { .write = NULL, .minstrlen = 4, .create = &create, + .get_vaddr = &get_vaddr }; #ifndef CORELIB diff --git a/libr/core/bin.c b/libr/core/bin.c index b59b07353b..a6e8f6d801 100644 --- a/libr/core/bin.c +++ b/libr/core/bin.c @@ -2,13 +2,6 @@ #include -static ut64 get_vaddr (ut64 baddr, ut64 paddr, ut64 vaddr) { - ut32 delta; - if (!baddr) return vaddr; - delta = (paddr & 0xfffff000) | (vaddr & 0xfff); - return baddr + delta; -} - static int bin_strings (RCore *r, int mode, ut64 baddr, int va) { char *p, *q, str[R_FLAG_NAME_SIZE]; RBinSection *section; @@ -40,7 +33,7 @@ static int bin_strings (RCore *r, int mode, ut64 baddr, int va) { if ((mode & R_CORE_BIN_JSON)) { r_cons_printf ("["); r_list_foreach (list, iter, string) { - ut64 addr = va? get_vaddr (baddr, string->rva, + ut64 addr = va? r_bin_get_vaddr (r->bin, baddr, string->rva, string->offset): string->offset; q = strdup (string->string); //r_name_filter (str, 128); @@ -54,7 +47,7 @@ static int bin_strings (RCore *r, int mode, ut64 baddr, int va) { } else if ((mode & R_CORE_BIN_SIMPLE)) { r_list_foreach (list, iter, string) { - ut64 addr = va? get_vaddr (baddr, string->rva, + ut64 addr = va? r_bin_get_vaddr (r->bin, baddr, string->rva, string->offset): string->offset; r_cons_printf ("%"PFMT64d" %d %s\n", addr, string->size, string->string); @@ -323,7 +316,7 @@ static int bin_entry (RCore *r, int mode, ut64 baddr, int va) { r_cons_printf ("["); r_list_foreach (entries, iter, entry) { ut64 paddr = entry->offset; - ut64 vaddr = get_vaddr (baddr, paddr, entry->rva); + ut64 vaddr = r_bin_get_vaddr (r->bin, baddr, paddr, entry->rva); r_cons_printf ("%s%"PFMT64d, iter->p?",":"", va?vaddr: paddr); @@ -333,14 +326,14 @@ static int bin_entry (RCore *r, int mode, ut64 baddr, int va) { if (mode & R_CORE_BIN_SIMPLE) { r_list_foreach (entries, iter, entry) { ut64 paddr = entry->offset; - ut64 vaddr = get_vaddr (baddr, paddr, entry->rva); + ut64 vaddr = r_bin_get_vaddr (r->bin, baddr, paddr, entry->rva); r_cons_printf ("0x%08"PFMT64x"\n", va?vaddr: paddr); } } else if ((mode & R_CORE_BIN_SET)) { r_list_foreach (entries, iter, entry) { ut64 paddr = entry->offset; - ut64 vaddr = get_vaddr (baddr, paddr, entry->rva); + ut64 vaddr = r_bin_get_vaddr (r->bin, baddr, paddr, entry->rva); snprintf (str, R_FLAG_NAME_SIZE, "entry%i", i++); r_flag_set (r->flags, str, va? vaddr: paddr, r->blocksize, 0); @@ -354,7 +347,7 @@ static int bin_entry (RCore *r, int mode, ut64 baddr, int va) { r_list_foreach (entries, iter, entry) { ut64 paddr = entry->offset; - ut64 vaddr = get_vaddr (baddr, paddr, entry->rva); + ut64 vaddr = r_bin_get_vaddr (r->bin, baddr, paddr, entry->rva); if (mode) { r_cons_printf ("f entry%i @ 0x%08"PFMT64x"\n", i, va?vaddr: paddr); @@ -492,7 +485,7 @@ static ut64 impaddr(RBin *bin, int va, ut64 baddr, const char *name) { if (strncmp (symbol->name, "imp.", 4)) continue; if (!strcmp (symbol->name+4, name)) - return va? get_vaddr (baddr, symbol->offset, + return va? r_bin_get_vaddr (bin, baddr, symbol->offset, symbol->rva): symbol->offset; } return 0; @@ -591,7 +584,7 @@ static int bin_symbols (RCore *r, int mode, ut64 baddr, int va, ut64 at, const c if (mode & R_CORE_BIN_JSON) { r_cons_printf ("["); r_list_foreach (symbols, iter, symbol) { - ut64 addr = va? get_vaddr (baddr, symbol->offset, + ut64 addr = va? r_bin_get_vaddr (r->bin, baddr, symbol->offset, symbol->rva): symbol->offset; r_cons_printf ("%s{\"name\":\"%s\"," "\"size\":%"PFMT64d"," @@ -602,7 +595,7 @@ static int bin_symbols (RCore *r, int mode, ut64 baddr, int va, ut64 at, const c } else if ((mode & R_CORE_BIN_SIMPLE)) { r_list_foreach (symbols, iter, symbol) { - ut64 addr = va? get_vaddr (baddr, symbol->offset, + ut64 addr = va? r_bin_get_vaddr (r->bin, baddr, symbol->offset, symbol->rva): symbol->offset; char *name = strdup (symbol->name); r_name_filter (name, 80); @@ -615,7 +608,7 @@ static int bin_symbols (RCore *r, int mode, ut64 baddr, int va, ut64 at, const c char *name, *dname; r_flag_space_set (r->flags, "symbols"); r_list_foreach (symbols, iter, symbol) { - ut64 addr = va? get_vaddr (baddr, symbol->offset, + ut64 addr = va? r_bin_get_vaddr (r->bin, baddr, symbol->offset, symbol->rva): symbol->offset; name = strdup (symbol->name); r_name_filter (name, 80); @@ -640,7 +633,7 @@ static int bin_symbols (RCore *r, int mode, ut64 baddr, int va, ut64 at, const c } r_list_foreach (symbols, iter, symbol) { - ut64 addr = va? get_vaddr (baddr, symbol->offset, + ut64 addr = va? r_bin_get_vaddr (r->bin, baddr, symbol->offset, symbol->rva): symbol->offset; if (name && strcmp (symbol->name, name)) continue; @@ -690,7 +683,7 @@ static int bin_sections (RCore *r, int mode, ut64 baddr, int va, ut64 at, const if (mode & R_CORE_BIN_JSON) { r_cons_printf ("["); r_list_foreach (sections, iter, section) { - ut64 addr = va? get_vaddr (baddr, section->offset, + ut64 addr = va? r_bin_get_vaddr (r->bin, baddr, section->offset, section->rva): section->offset; r_cons_printf ("%s{\"name\":\"%s\"," "\"size\":%"PFMT64d"," @@ -705,7 +698,7 @@ static int bin_sections (RCore *r, int mode, ut64 baddr, int va, ut64 at, const } else if ((mode & R_CORE_BIN_SIMPLE)) { r_list_foreach (sections, iter, section) { - ut64 addr = va? get_vaddr (baddr, section->offset, + ut64 addr = va? r_bin_get_vaddr (r->bin, baddr, section->offset, section->rva): section->offset; r_cons_printf ("0x%"PFMT64x" 0x%"PFMT64x" %s %s\n", addr, addr + section->size, @@ -717,7 +710,7 @@ static int bin_sections (RCore *r, int mode, ut64 baddr, int va, ut64 at, const RBinInfo *info = r_bin_get_info (r->bin); r_flag_space_set (r->flags, "sections"); r_list_foreach (sections, iter, section) { - ut64 addr = va? get_vaddr (baddr, section->offset, + ut64 addr = va? r_bin_get_vaddr (r->bin, baddr, section->offset, section->rva): section->offset; if (!secbase || (section->rva && section->rva rva; @@ -760,7 +753,7 @@ static int bin_sections (RCore *r, int mode, ut64 baddr, int va, ut64 at, const if (!at) r_cons_printf (mode? "fs sections\n": "[Sections]\n"); r_list_foreach (sections, iter, section) { - ut64 addr = va? get_vaddr (baddr, section->offset, + ut64 addr = va? r_bin_get_vaddr (r->bin, baddr, section->offset, section->rva): section->offset; if (name && strcmp (section->name, name)) continue; @@ -833,7 +826,7 @@ static int bin_fields (RCore *r, int mode, ut64 baddr, int va) { if (mode & R_CORE_BIN_JSON) { r_cons_printf ("["); r_list_foreach (fields, iter, field) { - ut64 addr = va? get_vaddr (baddr, field->offset, + ut64 addr = va? r_bin_get_vaddr (r->bin, baddr, field->offset, field->rva): field->offset; r_cons_printf ("%s{\"name\":\"%s\"," "\"offset\":%"PFMT64d"}", @@ -850,7 +843,7 @@ static int bin_fields (RCore *r, int mode, ut64 baddr, int va) { else r_cons_printf ("[Header fields]\n"); r_list_foreach (fields, iter, field) { - ut64 addr = va? get_vaddr (baddr, field->offset, + ut64 addr = va? r_bin_get_vaddr (r->bin, baddr, field->offset, field->rva): field->offset; if (mode) { r_name_filter (field->name, sizeof (field->name)); diff --git a/libr/include/r_bin.h b/libr/include/r_bin.h index d4f84af7c4..fcf0e11703 100644 --- a/libr/include/r_bin.h +++ b/libr/include/r_bin.h @@ -175,6 +175,7 @@ typedef struct r_bin_plugin_t { struct r_bin_meta_t *meta; struct r_bin_write_t *write; int (*get_offset)(RBinArch *arch, int type, int idx); + ut64 (*get_vaddr)(ut64 baddr, ut64 paddr, ut64 vaddr); RBuffer* (*create)(RBin *bin, const ut8 *code, int codelen, const ut8 *data, int datalen); int minstrlen; } RBinPlugin; @@ -329,10 +330,11 @@ R_API int r_bin_select_idx(RBin *bin, int idx); R_API void r_bin_list_archs(RBin *bin); R_API void r_bin_set_user_ptr(RBin *bin, void *user); R_API RBuffer *r_bin_create (RBin *bin, const ut8 *code, int codelen, const ut8 *data, int datalen); +R_API ut64 r_bin_get_offset (RBin *bin); +R_API ut64 r_bin_get_vaddr (RBin *bin, ut64 baddr, ut64 paddr, ut64 vaddr); /* bin_meta.c */ R_API int r_bin_meta_get_line(RBin *bin, ut64 addr, char *file, int len, int *line); R_API char *r_bin_meta_get_source_line(RBin *bin, ut64 addr); -R_API ut64 r_bin_get_offset (RBin *bin); /* bin_write.c */ R_API ut64 r_bin_wr_scn_resize(RBin *bin, const char *name, ut64 size); R_API int r_bin_wr_rpath_del(RBin *bin);