定制ART跟踪JNI函数绑定

本文详细阐述了JNI函数的绑定过程,包括静态和动态两种注册方式。静态注册涉及类加载时的桥函数绑定及首次调用时的So函数地址查询。动态注册则需要开发者手动完成函数地址的绑定。所有注册最终都会调用ArtMethod的SetEntryPointFromJni函数。通过函数hookJniRegister示例展示了动态注册的细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

   JNI函数的绑定:每一个JAVA层函数在native层都对应一个ArtMethod对象,JNI函数在执行前必须完成JNI函数所在类的加载和初始化、以及该JNI函数的ArtMethod对象当中属性和So中具体函数地址的绑定。

JNI函数绑定的分类:

1、静态:

两次绑定,第一次是在类加载的时候,会绑定到Art中的“桥函数”;第二次绑定是在该Jni函数第一次被真正调用时候,由Art完后该JNI函数在So中地址的查询以及绑定。

art_jni_dlsym_looup_stub_(汇编实现)->artFindNativeMethod->FindCodeForNativeMethod(method) 

2、动态:

两次绑定,不同于静态的两次在于由开发人员编写代码主动进行绑定,而不是由art帮助完成绑定。

不管静态或者动态注册,最后都会到达:const void* ArtMethod::RegisterNative函数中的SetEntryPointFromJni(new_native_method)函数

function hookJniRegister() {
var Regiseteraddr = Module.findExportByName("libart.so","_ZN3art9ArtNethod14RegisterNativeEPKvb");
Interceptor.attach(Regiseteraddr, {
    onEnter: function (args) {
    console. log("go into RegisterNative" );
    var artmethodptr = args[0];
    var dex_method_index_ = Memory.readU32(ptr(artmethodptr).add(12));
    var funcaddr = args[1];
    console.log ("RegisterNative :" + dex_method_index_ + " - -funcaddr:" + funcaddr);},             
    onLeave: function (retval){
}
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值