* Added r_bin_get_object() to cache binary information

* Initial work in r_core_bin_load()
  - Integrating rabin2 inside core
This commit is contained in:
pancake 2010-10-04 10:55:43 +02:00
parent afedad76bb
commit e8f8e72896
7 changed files with 72 additions and 18 deletions

13
TODO
View File

@ -13,16 +13,15 @@ Questions
* Add "pm ?" for bit print like in pb?
* Only use uppercase KMG for Kilo,Mega,Giga in r_num?
- 'g' is for double
* Add support for float/double in r_num
* Add support for float/double in r_num :?
* in Visual Debugger mode cursor mode also scrolls O_o
* distribute 'spp' with 'rarc2' ?
* distribute 'spp' with 'rarc2' ? imho no
* r2 -dls HANGS!!1
* rarc2 allows to compile invalid code like calling puts() out of context
* Add rabin2 .! calls into r_core api? r_core_rabin_import(core, "rIs") ?
0.6 RELEASE
===========
* Fix eflags string and str_bits
* Create radare2-testsuite project
- tests for ired, rax2, radare2, rabin2 ...
@ -61,11 +60,8 @@ TODO edu
TODO pancake
------------
* Embed RBin inside RCoreFile
* Fix eflags string and str_bits
* Implement DRX support
* Record trace of register status for each function when running
- r_reg_arena_copy();
{
* Implement RAnalCall (analyze function arguments, return values, propagate types..)
- define number of arguments for given function
- warn if signature and analysis differs in number of args or so..
@ -74,7 +70,6 @@ TODO pancake
- if they do not match: we need to warn/ask user/store multiple options
- function signature comparsion if they dont match
r_anal_fcn_cmp (anal, f1, f2);
}
unassigned TODO pointz
----------------------
@ -122,6 +117,8 @@ Refactoring
0.7
===
* Record trace of register status for each function when running
- r_reg_arena_copy();
* Add lua and dalvik disassembler
* Reimplement or fix the delta diffing in C
- first we need to do it for ired..

View File

@ -194,9 +194,8 @@ static int rabin_show_relocs() {
else eprintf ("[Relocations]\n");
r_list_foreach (relocs, iter, reloc) {
if (rad) {
printf ("f reloc.%s @ 0x%08"PFMT64x"\n", reloc->name, va?baddr+reloc->rva:reloc->offset);
} else printf ("sym=%02i address=0x%08"PFMT64x" offset=0x%08"PFMT64x" type=0x%08x %s\n",
if (rad) printf ("f reloc.%s @ 0x%08"PFMT64x"\n", reloc->name, va?baddr+reloc->rva:reloc->offset);
else printf ("sym=%02i address=0x%08"PFMT64x" offset=0x%08"PFMT64x" type=0x%08x %s\n",
reloc->sym, baddr+reloc->rva, reloc->offset, reloc->type, reloc->name);
i++;
}

View File

@ -391,3 +391,20 @@ R_API void r_bin_list_archs(RBin *bin) {
R_API void r_bin_set_user_ptr(RBin *bin, void *user) {
bin->user = user;
}
R_API RBinObj *r_bin_get_object(RBin *bin, int flags) {
RBinObj *obj = R_NEW (RBinObj);
if (obj) {
obj->symbols = r_bin_get_symbols (bin);
obj->imports = r_bin_get_imports (bin);
obj->entries = r_bin_get_entries (bin);
obj->main = r_bin_get_main (bin);
obj->baddr = r_bin_get_baddr (bin);
}
return obj;
}
R_API void r_bin_object_free(RBinObj *obj) {
// XXX: leak
free (obj);
}

View File

@ -218,11 +218,9 @@ static RBinInfo* info(RBinArch *arch) {
ret->bits = Elf_(r_bin_elf_get_bits) (arch->bin_obj);
ret->big_endian=Elf_(r_bin_elf_is_big_endian) (arch->bin_obj);
ret->dbg_info = 0;
if (!Elf_(r_bin_elf_get_stripped) (arch->bin_obj)) {
ret->dbg_info |= 0x04;
ret->dbg_info |= 0x08;
ret->dbg_info |= 0x10;
} else ret->dbg_info |= 0x01;
if (!Elf_(r_bin_elf_get_stripped) (arch->bin_obj))
ret->dbg_info |= 0x04 | 0x08 | 0x10
else ret->dbg_info |= 0x01;
if (Elf_(r_bin_elf_get_static) (arch->bin_obj))
ret->dbg_info |= 0x02;
return ret;

View File

@ -37,6 +37,30 @@ R_API void r_core_sysenv_update(RCore *core) {
r_sys_setenv ("IOVA", r_config_get_i (core->config, "io.va")?"1":"0");
}
R_API int r_core_bin_load(RCore *r, const char *file) {
RBinObj *obj;
if (!r_bin_load (r->bin, file, 0))
return R_FALSE;
r->file->obj = obj = r_bin_get_object (r->bin, 0);
#if 0
RListIter *iter;
RBinImport *import;
RBinSection *section;
r_list_foreach (obj->sections, iter, section) {
printf ("ff %s\n", section->name);
}
r_list_foreach (obj->imports, iter, import) {
printf ("ff %s\n", import->name);
}
r_list_foreach (obj->symbols, iter, symbol) {
printf ("ff %s\n", symbol->name);
}
#endif
// TODO: moar
return R_TRUE;
}
R_API RCoreFile *r_core_file_open(RCore *r, const char *file, int mode) {
RCoreFile *fh;
const char *cp;
@ -57,8 +81,7 @@ R_API RCoreFile *r_core_file_open(RCore *r, const char *file, int mode) {
fh->size = r_io_size (r->io, fd);
list_add (&(fh->list), &r->files);
r_bin_load (r->bin, fh->filename, NULL);
r_core_bin_load (r, fh->filename);
r_core_block_read (r, 0);
cp = r_config_get (r->config, "cmd.open");
@ -70,6 +93,7 @@ R_API RCoreFile *r_core_file_open(RCore *r, const char *file, int mode) {
R_API int r_core_file_close(struct r_core_t *r, struct r_core_file_t *fh) {
int ret = r_io_close (r->io, fh->fd);
// TODO: free fh->obj
list_del (&(fh->list));
// TODO: set previous opened file as current one
return ret;

View File

@ -176,6 +176,23 @@ typedef struct r_bin_write_t {
int (*rpath_del)(RBinArch *arch);
} RBinWrite;
typedef struct r_bin_obj_t {
ut64 baddr;
RList/*<RBinSection>*/ *sections;
RList/*<RBinImport>*/ *imports;
RList/*<RBinSymbol>*/ *symbols;
RList/*<??>*/ *entries;
RList/*<??>*/ *fields;
RList/*<??>*/ *libs;
RList/*<??>*/ *relocs;
RList/*<??>*/ *strings;
RBinInfo *info;
RBinAddr *main;
// TODO: deprecate r_bin_is_big_endian
// TODO: r_bin_is_stripped .. wrapped inside rbinobj?
// TODO: has_dbg_syms... maybe flags?
} RBinObj;
#ifdef R_API
/* bin.c */
@ -184,6 +201,7 @@ R_API int r_bin_xtr_add(RBin *bin, RBinXtrPlugin *foo);
R_API void* r_bin_free(RBin *bin);
R_API int r_bin_list(RBin *bin);
R_API int r_bin_load(RBin *bin, const char *file, int dummy);
R_API RBinObj *r_bin_get_object(RBin *bin, int flags);
R_API ut64 r_bin_get_baddr(RBin *bin);
R_API RBinAddr* r_bin_get_main(RBin *bin);
R_API RList* r_bin_get_entries(RBin *bin);

View File

@ -57,6 +57,7 @@ typedef struct r_core_file_t {
int rwx;
int fd;
int dbg;
RBinObj *obj;
struct list_head list;
} RCoreFile;