使用 Frida 定位 JNI 方法内存地址

Java调用Native方法及JNI函数地址查找

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

java 调用 native 方法流程

ArtMethod 是 Android Runtime (ART) 中一个非常重要的数据结构,它在 Android 系统中用于表示每个 Java 方法。

entry_point_from_jni_ 是 ArtMethod 结构体的一个字段,专门用于存储一个 Java 方法的 JNI(Java Native Interface)入口点。

当 Java 代码调用一个 native 方法时,ART 会通过entry_point_from_jni_ 字段找到对应的 JNI 函数入口,然后切换到 C/C++ 层执行该方法。

确定 entry_point_from_jni 的偏移量_

先通过查找 ART 中 ArtMethod 结构体中 entry_point_from_jni_ 的偏移量,最终确定 JNI 函数的地址。

let entry_point_from_jni_offset = -1;

/**
 * 找到 entry_point_from_jni_ 在 ArtMethod 结构体中的偏移量(根据 Android 版本不同可能会变化)
 *
 * @returns {number} 返回 entry_point_from_jni_ 的偏移量,若未找到返回 -1
 */
function get_jni_offset() {

    // 如果偏移量已经计算过(不为 -1),直接返回已保存的偏移量
    if (entry_point_from_jni_offset !== -1) {
        return entry_point_from_jni_offset;
    }

    // 获取 getUidForName JNI 方法的内存地址,该方法位于 "libandroid_runtime.so" 中
    let native_addr = Module.findExportByName("libandroid_runtime.so", "_Z32android_os_Process_getUidForNameP7_JNIEnvP8_jobjectP8_jstring");
    // console.log("native_addr:",native_addr);

    // 目标类名 "android.os.Process"
    let className = "android.os.Process";
    // 使用 Java.use 获取该类的 Java 类对象,并访问其 Class 对象
    let clazz = Java.use(className).class;
    // 获取该类的所有声明的方法
    let methods = clazz.getDeclar
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值