找到真正Object数组并打印详情
之前Frida调试Android时,遇到Java代码相关的,Object[]=Object数组方面的问题:
有些值看起来像是Object的数组,但是其实不是(有些是单独(继承自List)的类)
比如之前打印出的值:
ankq.a => retArrOb=[# anjs@3dc8422b]
中的:
[# anjs@3dc8422b]
本来以为是:
Object的Array或List == 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的属性值)