找到真正Object数组并打印详情

之前Frida调试Android时,遇到Java代码相关的,Object[]=Object数组方面的问题:

有些值看起来像是Object的数组,但是其实不是(有些是单独(继承自List)的类)

比如之前打印出的值:

ankq.a => retArrOb=[# anjs@3dc8422b]

中的:

[# anjs@3dc8422b]

本来以为是:

ObjectArrayList == Object[]

但是其实不是的

-》而其真实的类名,最后是通过

        var clsName = FridaAndroidUtil.getJavaClassName(retArrObj)
        console.log(funcName + " => retArrObj=" + retArrObj + ", clsName=" + clsName)

而打印出的:

ankq.a => retArrObj=[# anjs@3dc8422b], clsName=enln

中的:enln

才明白,其实是:

  • [# anjs@3dc8422b]看起来以为类型是Object[]
    • 但其实是:另外一个类:enln(的实例)

-》而具体底层细节是:

其中enln的代码是:

xxx_v250861_JEB/enln.java

import j..util.Objects;

public final class enln extends encw {
    public static final encw a;
    final transient Object[] b;
    public final transient int c;

    static {
        enln.a = new enln(new Object[0], 0);
    }

    public enln(Object[] arr_object, int v) {
        this.b = arr_object;
        this.c = v;
    }
...

以及其所继承的父类是:

xxx_v250861_JEB/encw.java

public abstract class encw extends enck implements List, java.util.List, RandomAccess {
    private static final enor a = null;
    public static final int d = 0;
    private static final long serialVersionUID = 0xFFFFFFFFCAFEBABEL;
...

-》好像由于是:

本身也是属于(父类encw所继承自的)List类型

所以最终打印出来的值,类似于toString()后的值,是:

[# anjs@3dc8422b]

看起来像是对象的数组而已,但其实本身是个单独的类

想要打印对象的数组的详情的核心思路

  • (1)先找到,真正的Object[]的对象的数组的变量objArr
  • (2)然后再去用for循环+objArr.length,去获取每个Object对象,打印对象的详情

举例:

此处核心代码是:

  static printClass_enln(inputObj, prefixStr=""){
...
          var bValue = curObj.b.value

          console.log(newPrefStr + ClassName + ":"
            + " a=" + curObj.a.value
            + ", b=objArr=" + bValue
            + ", c=size=" + curObj.c.value
          )

          console.log("bValue.length=" + bValue.length)
          for(var idx = 0; idx < bValue.length; idx++) {
            console.log(`---------- ${bValue} [${idx}] ----------`)
            var curAnjs = bValue[idx]
            console.log("curAnjs=" + curAnjs)
            HookAppJava_xxx.printClass_anjs(curAnjs, prefixStr)
          }

核心输出是:

ankq.a enln: a=[], b=objArr=# anjs@3dc8422b, c=size=1
bValue.length=1

---------- # anjs@3dc8422b [0] ----------
curAnjs=# anjs@3dc8422b
printClass_anjs: inputObj=# anjs@3dc8422b, inputClsName=anjs
printClass_anjs: curObj=# anjs@3dc8422b, curClsName=anjs
ankq.a anjs: a=# anjs@18f4ef8d, b=0xD7, c=45507, d=只能拨打紧急呼救电话 — China Telecom, e=0, f=<clsName=fjgr>=[object Object], g=455070004000000, h=, i=<clsName=fjex>=<ByteString@8a9b02a size=2 contents="\026<">, j=-1, k=<clsName=null>=null

才是我们要的效果:

可以打印出,此处:

对象的数组Object[],即enln.b,的每个对象元素(其本身是另外一个类anjs)的详情(anjs的属性值)

results matching ""

    No results matching ""