版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/
前言
在 Android 的 Native 层,Java 中的 Object[] 类型参数会以 jobjectArray 的形式传递到 C/C++ 代码中。
与 JS 数组不同,你不能直接对 jobjectArray 进行索引访问或直接操作其元素。要获取或修改其中的内容,必须借助 JNI 提供的接口,例如获取数组长度、读取单个元素或创建新的数组等操作。
env.js
常用的 JNI 函数在 frida 的 env.js 中都已经封装好了
https://github.com/frida/frida-java-bridge/blob/main/lib/env.js

通过下面代码获取 JNIEnv 引用,就可以调用相关的 JNI 函数
let env = Java.vm.tryGetEnv()

文档:https://frida.re/docs/javascript-api/
获取数组长度
let arrLen = env.getArrayLength(objArray)
console.log('array length is: ' + arrLen);
元素类型判断
通过 getObjectClassName 可以获取到对象的类名进而判断该元素的类型。
// 获取对象的类名
let className = env.getObjectClassName(objArray)
console.log('className: ' + className);
// 判断是否 jobjectArray
if (className === '[Ljava.lang.Object;') {
}
获取数组元素
let element = env.getObjectArrayElement(objArray, i)
Int 元素读取
let intElement = Java.cast(env.getObjectArrayElement(objArray, i), Java.use('java.lang.Integer'))
console.log(`element ${i} value: ${intElement}`);
Long 元素读取
let longElement = Java.cast(env.getObjectArrayElement(objArray, i), Java.use('java.lang.Long'))
console.log(`element ${i} value: ${longElement}`);
Float 元素读取
let floatElement = Java.cast(env.getObjectArrayElement(objArray, i), Java.use('java.lang.Float'))
cons

最低0.47元/天 解锁文章
940

被折叠的 条评论
为什么被折叠?



