]> git.feebdaed.xyz Git - 0xmirror/radare2.git/commitdiff
Fix multidex apk:// rebasing ##bin
authorpotato <30723680+0verflowme@users.noreply.github.com>
Fri, 12 Dec 2025 14:51:58 +0000 (20:21 +0530)
committerGitHub <noreply@github.com>
Fri, 12 Dec 2025 14:51:58 +0000 (15:51 +0100)
libr/bin/p/bin_dex.c
libr/core/cbin.c
test/db/formats/dex
test/db/tools/rabin2

index 3e104a081de780089b5be00e197e49c5a40ad587..92c5cc9a125f4c550ee54a01ce486a75355ae7c1 100644 (file)
@@ -832,7 +832,7 @@ static RList *strings(RBinFile *bf) {
                                continue;
                        }
                        ptr->paddr = bin->strings[i];
-                       ptr->vaddr = ptr->paddr + bf->bo->baddr;
+                       ptr->vaddr = ptr->paddr;
                        ptr->size = len;
                        ptr->length = len;
                        ptr->ordinal = i + 1;
@@ -1104,7 +1104,6 @@ static void parse_dex_class_method(RBinFile *bf, RBinDexClass *c, RBinClass *cls
        if (!dex->trycatch_list) {
                dex->trycatch_list = r_list_newf ((RListFree)r_bin_trycatch_free);
        }
-       const ut64 baddr = bf->bo->baddr;
        size_t skip = 0;
        ut64 bufsz = r_buf_size (bf->buf);
        ut64 encoded_method_addr;
@@ -1338,7 +1337,7 @@ static void parse_dex_class_method(RBinFile *bf, RBinDexClass *c, RBinClass *cls
                                sym->type = R_BIN_TYPE_METH_STR;
                                sym->paddr = encoded_method_addr;
                        }
-                       sym->vaddr = sym->paddr + bf->bo->baddr;
+                       sym->vaddr = sym->paddr;
                        // sym->vaddr += bf->bo->baddr;
                        dex->code_from = R_MIN (dex->code_from, sym->paddr);
                        sym->lang = R_BIN_LANG_JAVA;
@@ -1365,10 +1364,12 @@ static void parse_dex_class_method(RBinFile *bf, RBinDexClass *c, RBinClass *cls
                                //}
                                //eprintf("%s (0x%x-0x%x) size=%d\nregsz=%d\ninsns_size=%d\nouts_size=%d\ntries_size=%d\ninsns_size=%d\n", flag_name, sym->vaddr, sym->vaddr+sym->size, prolog_size, regsz, ins_size, outs_size, tries_size, insns_size);
                                r_list_append (dex->methods_list, sym);
-                               // XXX this is necessary because class methods and symbols obey baddr in a inconsistent way in cbin.c .. so better get this to work and fix later with more tests
+                               // XXX keep class method vaddr consistent with symbol
                                RBinSymbol *method = r_bin_symbol_clone (sym);
-                               method->vaddr += baddr;
-                               r_list_append (cls->methods, method);
+                               if (method) {
+                                       method->paddr = method->vaddr;
+                                       r_list_append (cls->methods, method);
+                               }
 
                                if (dex->code_from == UT64_MAX || dex->code_from > sym->paddr) {
                                        dex->code_from = sym->paddr;
@@ -1400,8 +1401,10 @@ static void parse_dex_class_method(RBinFile *bf, RBinDexClass *c, RBinClass *cls
                                r_list_append (dex->methods_list, sym);
                                sym->lang = R_BIN_LANG_JAVA;
                                RBinSymbol *method = r_bin_symbol_clone (sym);
-                               // method->vaddr += baddr;
-                               r_list_append (cls->methods, method);
+                               if (method) {
+                                       method->paddr = method->vaddr;
+                                       r_list_append (cls->methods, method);
+                               }
                        }
                        if (MC > 0 && debug_info_off > 0 && dex->header.data_offset < debug_info_off &&
                                debug_info_off < dex->header.data_offset + dex->header.data_size) {
@@ -1576,7 +1579,7 @@ static bool is_class_idx_in_code_classes(RBinDexObj *dex, int class_idx) {
 
 static bool dex_loadcode(RBinFile *bf) {
        R_RETURN_VAL_IF_FAIL (bf && bf->bo && bf->bo->bin_obj, false);
-       RBinDexObj *dex = (RBinDexObj*)bf->bo->bin_obj;
+       RBinDexObj *dex = bf->bo->bin_obj;
        dex->verbose = true;
        PrintfCallback cb_printf = bf->rbin->cb_printf;
        size_t i;
@@ -1811,7 +1814,7 @@ static RList *entries(RBinFile *bf) {
                                if (!already_entry (ret, m->paddr)) {
                                        if ((ptr = R_NEW0 (RBinAddr))) {
                                                ptr->paddr = m->paddr;
-                                               ptr->vaddr = ptr->paddr + bf->bo->baddr;
+                                               ptr->vaddr = ptr->paddr;
                                                r_list_append (ret, ptr);
                                        }
                                }
index f6f3e93d525dfbf29396979aa8e97b12d25aec42..a30ad7c2d2ee2b82af690fa0f4b53cf2b66bf87f 100644 (file)
@@ -2753,8 +2753,16 @@ static bool bin_symbols(RCore *core, PJ *pj, int mode, ut64 laddr, int va, ut64
                }
                ut64 addr = compute_addr (core->bin, symbol->paddr, symbol->vaddr, va);
                ut32 len = symbol->size? symbol->size: 1;
-               if (at != UT64_MAX && (!symbol->size || !is_in_range (at, addr, symbol->size))) {
-                       continue;
+               if (at != UT64_MAX) {
+                       if (symbol->size) {
+                               if (!is_in_range (at, addr, symbol->size)) {
+                                       continue;
+                               }
+                       } else {
+                               if (addr != at) {
+                                       continue;
+                               }
+                       }
                }
                if (printHere) {
                        // const ut64 addr = va? symbol->vaddr: symbol->paddr;
@@ -4173,6 +4181,8 @@ static bool bin_classes(RCore *core, PJ *pj, int mode) {
        RBinClass *c;
        RBinField *f;
        RList *cs = r_bin_get_classes (core->bin);
+       RBinInfo *info = r_bin_get_info (core->bin);
+       const int va = (info && info->has_va)? VA_TRUE: VA_FALSE;
        if (IS_MODE_JSON (mode)) {
                pj_a (pj);
        } else if (IS_MODE_SET (mode)) {
@@ -4205,12 +4215,13 @@ static bool bin_classes(RCore *core, PJ *pj, int mode) {
                ut64 at_max = 0LL;
 
                r_list_foreach (c->methods, iter2, sym) {
-                       if (sym->vaddr) {
-                               if (sym->vaddr < at_min) {
-                                       at_min = sym->vaddr;
+                       ut64 maddr = compute_addr (core->bin, sym->paddr, sym->vaddr, va);
+                       if (maddr) {
+                               if (maddr < at_min) {
+                                       at_min = maddr;
                                }
-                               if (sym->vaddr + sym->size > at_max) {
-                                       at_max = sym->vaddr + sym->size;
+                               if (maddr + sym->size > at_max) {
+                                       at_max = maddr + sym->size;
                                }
                        }
                }
@@ -4223,19 +4234,20 @@ static bool bin_classes(RCore *core, PJ *pj, int mode) {
                        r_strf_var (classname, R_FLAG_NAME_SIZE, "class.%s", name);
                        r_flag_set (core->flags, classname, c->addr, 1);
                        r_list_foreach (c->methods, iter2, sym) {
-                               RFlagItem *fi = r_flag_get_at (core->flags, sym->vaddr, false);
+                               ut64 maddr = compute_addr (core->bin, sym->paddr, sym->vaddr, va);
+                               RFlagItem *fi = r_flag_get_at (core->flags, maddr, false);
                                if (fi) {
                                        // eprintf ("%s .. %s\n", sym->name, fi->name);
                                } else {
                                        const char *sym_name = r_bin_name_tostring (sym->name);
                                        // char *mflags = r_core_bin_attr_tostring (core, sym->attr, mode);
-                                       char *mflags = r_bin_attr_tostring (sym->attr, false);
+                               char *mflags = r_bin_attr_tostring (sym->attr, false);
                                        r_str_replace_char (mflags, ' ', '.');
                                        // XXX probably access flags should not be part of the flag name
                                        r_strf_var (method, R_FLAG_NAME_SIZE, "method%s%s.%s.%s", R_STR_ISEMPTY (mflags)? "": ".", mflags, cname, sym_name);
                                        R_FREE (mflags);
                                        r_name_filter (method, -1);
-                                       RFlagItem *fi = r_flag_set (core->flags, method, sym->vaddr, 1);
+                                       RFlagItem *fi = r_flag_set (core->flags, method, maddr, 1);
                                        if (fi) {
                                                const char *rawname = r_bin_name_tostring2 (sym->name, 'o');
                                                if (rawname) {
@@ -4253,7 +4265,7 @@ static bool bin_classes(RCore *core, PJ *pj, int mode) {
                                const char *kind = r_bin_field_kindstr (f);
                                // XXX remove 'field' and just use kind?
                                char *fn = r_str_newf ("field.%s.%s.%s", classname, kind, fname);
-                               ut64 at = f->vaddr;
+                               ut64 at = compute_addr (core->bin, f->paddr, f->vaddr, va);
                                r_flag_set (core->flags, fn, at, 1);
                                free (fn);
                        }
@@ -4321,7 +4333,8 @@ static bool bin_classes(RCore *core, PJ *pj, int mode) {
                                const char *n = cname; //  r_name_filter_shell (cname);
                                char *sn = r_bin_name_tostring (sym->name); // r_name_filter_shell (sym->name); // symbol contains classname
                                const char *predot = R_STR_ISNOTEMPTY (mflags)? ".": "";
-                               char *cmd = r_str_newf ("'f method.%s%s%s.%s = 0x%" PFMT64x "\n", n, predot, mflags, sn, sym->vaddr);
+                               ut64 maddr = compute_addr (core->bin, sym->paddr, sym->vaddr, va);
+                               char *cmd = r_str_newf ("'f method.%s%s%s.%s = 0x%" PFMT64x "\n", n, predot, mflags, sn, maddr);
                                // free (n);
                                // free (sn);
                                if (cmd) {
@@ -4345,7 +4358,7 @@ static bool bin_classes(RCore *core, PJ *pj, int mode) {
                                const char *fname = r_bin_name_tostring2 (f->name, pref);
                                char *fn = r_str_newf ("field.%s.%s.%s", cname, kind, fname);
                                r_name_filter (fn, -1);
-                               ut64 at = f->vaddr; //  sym->vaddr + (f->vaddr &  0xffff);
+                               ut64 at = compute_addr (core->bin, f->paddr, f->vaddr, va); //  sym->vaddr + (f->vaddr &  0xffff);
                                r_cons_printf (core->cons, "'f %s = 0x%08" PFMT64x "\n", fn, at);
                                free (fn);
                        }
@@ -4428,7 +4441,8 @@ static bool bin_classes(RCore *core, PJ *pj, int mode) {
                                                rname = NULL;
                                        }
                                        pj_ks (pj, "name", sname);
-                                       RFlagItem *fi = r_flag_get_at (core->flags, sym->vaddr, false);
+                                       ut64 maddr = compute_addr (core->bin, sym->paddr, sym->vaddr, va);
+                                       RFlagItem *fi = r_flag_get_at (core->flags, maddr, false);
                                        if (fi) {
                                                pj_ks (pj, "flag", fi->realname? fi->realname: fi->name);
                                        }
@@ -4456,7 +4470,7 @@ static bool bin_classes(RCore *core, PJ *pj, int mode) {
                                        if (lang && *lang != '?') {
                                                pj_ks (pj, "lang", lang);
                                        }
-                                       pj_kN (pj, "addr", sym->vaddr);
+                                       pj_kN (pj, "addr", maddr);
                                        pj_end (pj);
                                }
                                pj_end (pj);
@@ -4477,7 +4491,8 @@ static bool bin_classes(RCore *core, PJ *pj, int mode) {
                                                pj_j (pj, mflags);
                                                free (mflags);
                                        }
-                                       pj_kN (pj, "addr", f->vaddr);
+                                       ut64 faddr = compute_addr (core->bin, f->paddr, f->vaddr, va);
+                                       pj_kN (pj, "addr", faddr);
                                        pj_end (pj);
                                }
                                pj_end (pj);
@@ -4506,8 +4521,9 @@ static bool bin_classes(RCore *core, PJ *pj, int mode) {
                                char *mflags = r_core_bin_attr_tostring (core, sym->attr, mode);
                                const char *ls = r_bin_lang_tostring (sym->lang);
                                const char *sname = r_bin_name_tostring2 (sym->name, pref);
+                               ut64 maddr = compute_addr (core->bin, sym->paddr, sym->vaddr, va);
                                r_cons_printf (core->cons, "0x%08" PFMT64x " %s %8s %3d %s %s\n",
-                                       sym->vaddr, ls? ls: "?", "method", m, mflags, sname);
+                                       maddr, ls? ls: "?", "method", m, mflags, sname);
                                R_FREE (mflags);
                                m++;
                        }
@@ -4516,8 +4532,9 @@ static bool bin_classes(RCore *core, PJ *pj, int mode) {
                        r_list_foreach (c->fields, iter3, f) {
                                char *mflags = r_core_bin_attr_tostring (core, f->attr, mode);
                                const char *ks = r_bin_field_kindstr (f);
+                               ut64 faddr = compute_addr (core->bin, f->paddr, f->vaddr, va);
                                r_cons_printf (core->cons, "0x%08" PFMT64x " %s %8s %3d %s %s\n",
-                                       f->vaddr, ls, ks, m, mflags, r_bin_name_tostring2 (f->name, pref));
+                                       faddr, ls, ks, m, mflags, r_bin_name_tostring2 (f->name, pref));
                                m++;
                                free (mflags);
                        }
index 4482a6ecefbfb5c9eeb600c0353fb7537ea9f18e..6b2d04adf9255a0c0e99bcba18ff0109cf8d3802 100644 (file)
@@ -2003,3 +2003,22 @@ EXPECT=<<EOF
 544  0x0001b938 0x00022530 GLOBAL FUNC   2        Lcom/google/progress/Gps$1.method.onProviderEnabled(Ljava/lang/String;)V
 EOF
 RUN
+
+NAME=APK multidex is.j rebasing
+FILE=apk://bins/dex/mobipwn-nores.apk
+CMDS=<<EOF
+is.j @ 0xd56ac
+is.j @ 0x199ef4
+is.j @ 0xd56c4
+s method.public.final.Landroid_arch_a_a_a_1.Landroid_arch_a_a_a_1.method.execute_Ljava_lang_Runnable__V
+pd 2
+EOF
+EXPECT=<<EOF
+{"name":"Landroid/arch/a/a/a$1.method.<init>()V","flagname":"sym.Landroid_arch_a_a_a_1.method._init___V","realname":"Landroid/arch/a/a/a$1.method.<init>()V","ordinal":0,"bind":"LOCAL","size":8,"type":"FUNC","vaddr":874156,"paddr":69220,"is_imported":false}
+{}
+{"name":"Landroid/arch/a/a/a$1.method.execute(Ljava/lang/Runnable;)V","flagname":"sym.Landroid_arch_a_a_a_1.method.execute_Ljava_lang_Runnable__V","realname":"Landroid/arch/a/a/a$1.method.execute(Ljava/lang/Runnable;)V","ordinal":1,"bind":"GLOBAL","size":16,"type":"FUNC","vaddr":874180,"paddr":69244,"is_imported":false}
+            ;-- method.public.final.Landroid_arch_a_a_a_1.Landroid_arch_a_a_a_1.method.execute_Ljava_lang_Runnable__V:
+            0x000d56c4      710024000000   invoke-static {}, Landroid/arch/a/a/a.a()Landroid/arch/a/a/a; ; 0x24
+            0x000d56ca      0c00           move-result-object v0
+EOF
+RUN
index 604ea83f03acc8266a9b56534ae9e13b99981d75..b15a6a74c8c2598aeadf8058ff800a19a0162e15 100644 (file)
@@ -856,7 +856,7 @@ EXPECT=<<EOF
 0x00000afb java   method   5      $createCallSiteArray_1
 0x00000b6a java   method   6      $createCallSiteArray
 0x00000b99 java   method   7      $getCallSiteArray
-0x00000000 java      var   0 ps   __$stMC
+0x000008d1 java      var   0 ps   __$stMC
 EOF
 RUN