mirror of
https://github.com/radareorg/radare2.git
synced 2025-04-01 17:11:51 +00:00
Fix issues with DEX flags and class methods
This commit is contained in:
parent
e37ada9096
commit
2e9cc2f1b2
@ -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);
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user