Frida Hook Native:jobjectArray 参数解析

版权归作者所有,如有转发,请注明文章出处:cyrus-studio.github.io/blog/

env.js

常用的 JNI 函数在 frida 的 env.js 中都已经定义好了

github.com/frida/frida...

通过下面代码获取 JNIEnv 引用,就可以调用相关的 JNI 函数

bash 复制代码
let env = Java.vm.tryGetEnv()

文档:frida.re/docs/javasc...

获取数组长度

ini 复制代码
let arrLen = env.getArrayLength(objArray)
console.log('array length is: ' + arrLen);

元素类型判断

通过 getObjectClassName 可以获取到对象的类名进而判断该元素的类型。

ini 复制代码
// 获取对象的类名
let className = env.getObjectClassName(objArray)
console.log('className: ' + className);

// 判断是否 jobjectArray
if (className === '[Ljava.lang.Object;') {

}

获取数组元素

ini 复制代码
let element = env.getObjectArrayElement(objArray, i)

Int 元素读取

javascript 复制代码
let intElement = Java.cast(env.getObjectArrayElement(objArray, i), Java.use('java.lang.Integer'))
console.log(`element ${i} value: ${intElement}`);

Long 元素读取

javascript 复制代码
let longElement = Java.cast(env.getObjectArrayElement(objArray, i), Java.use('java.lang.Long'))
console.log(`element ${i} value: ${longElement}`);

Float 元素读取

javascript 复制代码
let floatElement = Java.cast(env.getObjectArrayElement(objArray, i), Java.use('java.lang.Float'))
console.log(`element ${i} value: ${floatElement}`);

Double 元素读取

javascript 复制代码
let doubleElement = Java.cast(env.getObjectArrayElement(objArray, i), Java.use('java.lang.Double'))
console.log(`element ${i} value: ${doubleElement}`);

字符串 元素读取

通过 env.js 中定义的 stringFromJni 函数可以直接获取到字符串对象的值

javascript 复制代码
let stringElement = env.stringFromJni(env.getObjectArrayElement(objArray, i))
console.log(`element ${i} value: ${stringElement}`);

Object 元素读取

javascript 复制代码
let element = env.getObjectArrayElement(objArray, i)

let elementClassName = env.getObjectClassName(element)

// 元素类型转换
let castElement = Java.cast(element, Java.use(elementClassName))

console.log(`element ${i} value: ${castElement}`);

打印 jobjectArray

打印 jobjectArray 的元素类型和值

javascript 复制代码
function printObjectArray(objArray) {
    if (objArray.isNull()) {
        console.log('Object array is null');
        return null;
    }

    // 获取 JNIEnv
    let env = Java.vm.tryGetEnv();
    let className = env.getObjectClassName(objArray);

    // 不是 jobjectArray,则直接打印类型
    if (!className.startsWith('[L')) {
        console.log(`Argument is not a jobjectArray, actual type: ${className}`);
        return;
    }

    let arrLen = env.getArrayLength(objArray);
    let result = `Object array of type ${className}, length: ${arrLen}\n`;

    for (let i = 0; i < arrLen; i++) {
        let element = env.getObjectArrayElement(objArray, i);
        let elementClassName = env.getObjectClassName(element);
        let castElement = Java.cast(element, Java.use(elementClassName));

        result += `  [${i}] ${elementClassName}: ${castElement}\n`;
    }

    console.log(result.trim());
}

hook native 函数并打印 jobjectArray 传参

javascript 复制代码
function hook_native_func(targetAddress) {

    // Hook 目标地址
    Interceptor.attach(targetAddress, {
        onEnter: function (args) {
            console.log('Entering native function at: ' + targetAddress);
            printObjectArray(args[2])
        },

        onLeave: function (retval) {
            console.log('Leaving native function');
        }
    });
}


setImmediate(function () {
    Java.perform(function () {
        var baseAddress = Module.findBaseAddress("libnative-lib.so");
        hook_native_func(baseAddress.add(0x26058))
    });
})

输出如下:

vbnet 复制代码
Entering native function at: 0x77fe13c058
Object array of type [Ljava.lang.Object;, length: 3
  [0] java.lang.Integer: 283
  [1] com.cyrus.example.jniexample.JNIExampleActivity: com.cyrus.example.jniexample.JNIExampleActivity@b8df529
  [2] java.lang.String: HelloWorld
Leaving native function
相关推荐
会编程的土豆1 分钟前
【数据结构与算法】 时间复杂度计算
数据结构·c++·算法
John_ToDebug1 分钟前
Chromium 页面类型与 IPC 通信机制深度解析
前端·c++·chrome
小年糕是糕手2 分钟前
【35天从0开始备战蓝桥杯 -- Day9】
数据结构·数据库·c++·算法·蓝桥杯
lishutong10064 分钟前
Android 性能诊断 V2:基于 Agent Skill 的原生 IDE 融合架构
android·ide·架构
山甫aa5 分钟前
STL---常见数据结构总结
开发语言·数据结构·c++·学习
H Journey8 分钟前
C++ 11 新特性 基于范围的for循环
c++·c++11·for循环
无限进步_10 分钟前
【C++】反转字符串的进阶技巧:每隔k个字符反转k个
java·开发语言·c++·git·算法·github·visual studio
恋猫de小郭12 分钟前
AGP 9.2 开始,Android 上协程启动和取消速度提升两倍
android·前端·flutter
计算机安禾16 分钟前
【数据结构与算法】第34篇:选择排序:简单选择排序与堆排序
c语言·开发语言·数据结构·c++·算法·排序算法·visual studio
IT 行者7 小时前
Web逆向工程AI工具:JSHook MCP,80+专业工具让Claude变JS逆向大师
开发语言·javascript·ecmascript·逆向