XPosed解析--callback_XposedBridge_initNative分析

callback_XposedBridge_initNative函数为XposedBridge注册回调方法的JNI接口,在整个Xposed中起关键作用,连接了module与Xposed框架,下面来分析一些这个函数。


完整的代码如下:libxposed_dalvik.cpp

jboolean callback_XposedBridge_initNative(JNIEnv* env) {
xposedHandleHookedMethod = (Method*) env->GetStaticMethodID(classXposedBridge, "handleHookedMethod",
"(Ljava/lang/reflect/Member;ILjava/lang/Object;Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;");
if (xposedHandleHookedMethod == NULL) {
ALOGE("ERROR: could not find method %s.handleHookedMethod(Member, int, Object, Object, Object[])", CLASS_XPOSED_BRIDGE);
dvmLogExceptionStackTrace();
env->ExceptionClear();
return false;
}

Method* xposedInvokeOriginalMethodNative = (Method*) env->GetStaticMethodID(classXposedBridge, "invokeOriginalMethodNative",
"(Ljava/lang/reflect/Member;I[Ljava/lang/Class;Ljava/lang/Class;Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;");
if (xposedInvokeOriginalMethodNative == NULL) {
ALOGE("ERROR: could not find method %s.invokeOriginalMethodNative(Member, int, Class[], Class, Object, Object[])", CLASS_XPOSED_BRIDGE);
dvmLogExceptionStackTrace();
env->ExceptionClear();
return false;
}
dvmSetNativeFunc(xposedInvokeOriginalMethodNative, XposedBridge_invokeOriginalMethodNative, NULL);

objectArrayClass = dvmFindArrayClass("[Ljava/lang/Object;", NULL);
if (objectArrayClass == NULL) {
ALOGE("Error while loading Object[] class");
dvmLogExceptionStackTrace();
env->ExceptionClear();
return false;
}

return true;
}



xposedHandleHookedMethod = (Method*) env->GetStaticMethodID(classXposedBridge, "handleHookedMethod",
"(Ljava/lang/reflect/Member;ILjava/lang/Object;Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;");

这个函数式通过JNI环境指针env,查找classXposedBridge类中的handleHookedMethod函数,具体java源码在XposedBridge:handleHookedMethod,其中GetStaticMethodID可以返回Method对象指针,当Xposed框架调用hookedMethodCallback函数时会调用handleHookedMethod方法,从而调用到java层的回调。

Method* xposedInvokeOriginalMethodNative = (Method*) env->GetStaticMethodID(classXposedBridge, "invokeOriginalMethodNative",
"(Ljava/lang/reflect/Member;I[Ljava/lang/Class;Ljava/lang/Class;Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;");

这段是获取XposedBridge:invokeOriginalMethodNative方法,这个方法是native,会通过jvm调用XposedBridge_invokeOriginalMethodNative JNI函数。


invokeOriginalMethodNative和JNI 函数XposedBridge_invokeOriginalMethodNative如何关联呢?在java层并没有XposedBridge_invokeOriginalMethodNative的注册,而在这里确调用了此JNI方法,关键在这个函数dvmSetNativeFunc。

dvmSetNativeFunc(xposedInvokeOriginalMethodNative, XposedBridge_invokeOriginalMethodNative, NULL);
此函数是真正执行JNI方法注册的函数,建立了Method和JNI方法的关联,对此方法进一步解析:


void dvmSetNativeFunc(Method* method, DalvikBridgeFunc func,
const u2* insns)
{
......

if (insns != NULL) {
/* update both, ensuring that "insns" is observed first */
method->insns = insns;
android_atomic_release_store((int32_t) func,
(void*) &method->nativeFunc);
} else {
/* only update nativeFunc */
method->nativeFunc = func;
}

......
}


这里的method->nativeFunc = func; 就是把JNI函数XposedBridge_invokeOriginalMethodNative的地址赋值给Method的nativeFunc变量,当java层调用invokeOriginalMethodNative时就会调用到此JNI方法。


objectArrayClass = dvmFindArrayClass("[Ljava/lang/Object;", NULL);

这个函数用来加载Object类,为后面调用hook做准备,结合hook函数调用可以看到这个函数的作用。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值