Fix issues with DEX flags and class methods

This commit is contained in:
pancake 2015-11-09 21:47:11 +01:00
parent e37ada9096
commit 2e9cc2f1b2
2 changed files with 27 additions and 24 deletions

View File

@ -340,7 +340,6 @@ static char *dex_class_super_name (RBinDexObj *bin, RBinDexClass *c) {
static int *parse_class (RBinFile *binfile, struct r_bin_dex_obj_t *bin, struct dex_class_t *c, RBinClass *cls) {
int i, *methods;
char *name;
ut64 SF, IF, DM, VM;
const ut8 *p, *p_end;
char *class_name;
@ -354,7 +353,7 @@ static int *parse_class (RBinFile *binfile, struct r_bin_dex_obj_t *bin, struct
if (!class_name) {
return NULL;
}
methods = calloc (sizeof (ut32), bin->header.method_size);
methods = calloc (sizeof (int), bin->header.method_size);
if (!methods) {
free (class_name);
return false;
@ -420,52 +419,55 @@ static int *parse_class (RBinFile *binfile, struct r_bin_dex_obj_t *bin, struct
dprintf ("METHOD NAME %u\n", (ut32)MI);
if (!method_name) method_name = strdup ("unknown");
flag_name = flagname (class_name, method_name);
if (!flag_name)
continue;
dprintf ("f %s @ 0x%x\n", flag_name, (ut32)MC);
dprintf (" { name: %d %d %s,\n", (ut32)MC, (ut32)MI, method_name);
dprintf (" idx: %u,\n", (ut32)MI);
dprintf (" access_flags: 0x%x,\n", (ut32)MA);
dprintf (" code_offset: 0x%x },\n", (ut32)MC);
/* add symbol */
if (flag_name && *flag_name) {
if (*flag_name) {
RBinSymbol *sym = R_NEW0 (RBinSymbol);
sym->name = strdup (flag_name);
sym->name = flag_name;
sym->type = r_str_const ("FUNC");
sym->paddr = sym->vaddr = MC;
if (MC>0) { /* avoid methods at 0 paddr */
#if 0
// TODO: use sdb+pf to show method header
ut16 regsz;
ut16 ins_size
ut16 outs_size
ut16 tries_size
ut32 debug_info_off
ut32 insns_size
ut16[insn_size] insns;
ut16 padding = 0
try_item[tries_size] tries
encoded_catch_handler_list handlers
// TODO: use sdb+pf to show method header
ut16 regsz;
ut16 ins_size
ut16 outs_size
ut16 tries_size
ut32 debug_info_off
ut32 insns_size
ut16[insn_size] insns;
ut16 padding = 0
try_item[tries_size] tries
encoded_catch_handler_list handlers
#endif
sym->paddr += 0x10;
r_list_append (bin->methods_list, sym);
// this causes an invalid flag name issue
if (cls) {
if (!cls->methods) {
if (!cls->methods)
cls->methods = r_list_new ();
}
r_list_append (cls->methods, sym);
}
/* cache in sdb */
if (!mdb) {
mdb = sdb_new0 ();
}
sdb_num_set (mdb, sdb_fmt(0, "method.%d", MI), sym->paddr, 0);
sdb_num_set (mdb, sdb_fmt (0, "method.%d", MI), sym->paddr, 0);
} else {
//r_list_append (bin->methods_list, sym);
// XXX memleak sym
free (sym);
}
} else {
free (flag_name);
}
free (method_name);
free (flag_name);
}
/* virtual methods */
dprintf (" virtual methods: %u\n", (ut32)VM);
@ -479,7 +481,7 @@ encoded_catch_handler_list handlers
if (MC>0 && bin->code_from>MC) bin->code_from = MC;
if (MC>0 && bin->code_to<MC) bin->code_to = MC;
name = dex_method_name (bin, MI);
char *name = dex_method_name (bin, MI);
dprintf (" method name: %s\n", name);
dprintf (" method_idx: %u\n", (ut32)MI);
dprintf (" method access_flags: %u\n", (ut32)MA);

View File

@ -1659,7 +1659,8 @@ static int bin_classes(RCore *r, int mode) {
const char *classname = sdb_fmt (0, "class.%s", name);
r_flag_set (r->flags, classname, c->addr, 1, 0);
r_list_foreach (c->methods, iter2, sym) {
const char *method = sdb_fmt (1, "method.%s.%s", c->name, sym->name);
char *method = sdb_fmt (1, "method.%s.%s", c->name, sym->name);
r_name_filter (method, -1);
r_flag_set (r->flags, method, sym->vaddr, 1, 0);
}
} else if (IS_MODE_SIMPLE (mode)) {
@ -1688,19 +1689,19 @@ static int bin_classes(RCore *r, int mode) {
c->index);
}
} else {
int m = 0;
r_cons_printf ("0x%08"PFMT64x" class %d %s",
c->addr, c->index, c->name);
if (c->super) {
r_cons_printf (" super: %s\n", c->super);
} else {
r_cons_newline ();
}
r_cons_newline();
int m = 0;
r_list_foreach (c->methods, iter2, sym) {
r_cons_printf ("0x%08"PFMT64x" method %d %s\n",
sym->vaddr, m, sym->name);
m++;
}
r_cons_newline ();
}
free (name);