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函数调用可以看到这个函数的作用。
分享到:
相关推荐
这个"Xposed-NueXini-x86_64.zip"文件是专为64位Android设备或模拟器设计的Xposed框架版本。在深入探讨相关知识点之前,需要强调的是,对Android系统的任何修改都涉及到一定的风险,尤其是对于新手来说,不当操作...
由于这两种架构的不同,Xposed框架也需要为每个架构提供相应的版本,即“xposed-x86”和“xposed-x86_64”。这确保了框架在不同硬件平台上能够正常运行。 安装Xposed框架的步骤通常包括以下几步: 1. 获取对应架构...
《Xposed框架详解:深入理解xposed-v89-sdk25-x86.zip》 Xposed框架是一款在Android系统上广泛使用的模块化开发工具,它允许开发者通过编写特定的模块来改变系统的功能或应用的行为,而无需修改APK文件。在本文中,...
标题 "xposed-v88-sdk25-x86.zip" 提供了关于这个压缩包的重要信息,它是一个针对特定环境的 Xposed 框架版本。Xposed 是一个在 Android 系统上运行的框架,允许用户通过安装模块来修改系统行为,无需root权限。这里...
- **XposedBridge API**:这是Xposed框架的核心接口,包括`IXposedHookLoadPackage`、`IXposedHookZygoteInit`等,它们定义了如何在系统启动或加载应用时执行自定义逻辑。 - **Hook技术**:理解Java反射和Method ...
标题 "weixin-alipay-yunshanfu-xposed-pay-master.zip_oldgem_p.alipay." 暗示这是一个与微信支付和支付宝支付相关的项目,可能是一个针对Android系统的Xposed框架插件。Xposed是一个允许用户在不修改APK的情况下...
Xposed提供`XposedBridge.log()`方法用于调试,帮助开发者查看被Hook的方法何时被调用以及传递的参数。 2. **ClassLoader Hook**:这种方法涉及到类加载过程的修改,可以控制哪些类会被加载,或者在类加载后立即...
xposed-v89-sdk25-arm86与xposed-v89-sdk25-arm64两个版本对应的系统是安卓5.0以上的
《Xposed框架与XposedBridgeApi-89.jar详解》 在Android开发领域,Xposed框架是一个极具影响力的神器,它允许开发者通过修改系统的运行时行为,实现对系统和应用的深度定制,而无需修改APK文件。XposedBridgeApi-89...
而“xposed-uninstaller-20180117-arm.zip”则是专门为Xposed框架提供的卸载工具,适用于基于ARM架构的Android 5.0系统。 在深入探讨Xposed框架之前,我们需要理解Android系统的运行机制。Android系统基于Linux内核...
Xposed框架是一款强大的Android系统修改工具,它允许用户在不修改APK的情况下影响应用程序或系统的行为。"Xposed Uninstaller 20150831-arm.zip" 是专为基于ARM架构的Android设备设计的Xposed框架卸载程序。这款工具...
内有XposedBridgeApi-82.jar XposedBridgeApi-82-source.jar两个文件 api-82.jar SHA-1:35866b507b360d4789ff389ad7386b6e8bbf6cc4 api-82-source.jar SHA-1:2030f71764b06b2f39fa1a85660690aa834cfd84
Android11 — SDK 30 Android10 — SDK 29 Pie 9.0 — SDK 28 Oreo 8.1 — SDK 27 Oreo 8.0 — SDK 26 Nougat 7.1 — SDK 25 Nougat 7.0 — SDK 24 Marshmallow 6.0 — SDK 23 Lollipop 5.1 — SDK 22 ...
1. **下载Xposed框架**:你需要下载两个文件,分别是"xposed-x86_64.zip"和"xposed-v89-sdk25-x86.zip"。这两个文件是Xposed框架的安装核心,一个用于X86架构,另一个用于X64架构。请确保你下载的是与你的设备架构相...
标题 "xposed-v90.2-sdk27-beta3-topjohnwu.zip" 暗示了这是一个关于Xposed框架的更新版本,版本号为v90.2,针对Android SDK 27(即Android 8.1 Oreo)平台,并且是topjohnwu开发的Beta 3测试版。Xposed框架是一款...
还允许使用图形添加状态栏通知以及使用Xposed框架删除原始电池图标 ★高度可配置的小部件都可调整大小,从简单的仪表到更复杂的数据显示,组件切换和历史图形 ★在应用程序,小部件或使用配置文件中的系统组件...
"framework-xposed-v89-sdk25-x86"这个标题表明我们正在处理的是Xposed框架的一个版本,针对的是Android SDK Level 25(即Android 7.1.1 Nougat)的x86架构设备。这个版本号"v89"表示它是Xposed框架的某个迭代更新。...
"xposed-v89-sdk25-x86.zip" 文件名表明这是一款针对Android SDK 25(即Android 7.1 Nougat)的Xposed框架版本,适用于x86架构的设备。"script.sh" 文件则可能是一个脚本,用于帮助用户安装或配置Xposed框架。 1. *...
EdXposed-SandHook 是一个基于 Xposed 框架的模块,主要用于 Android 设备上的系统级自定义和功能扩展。Xposed 是一个在 Android 系统上运行的框架,它允许用户通过安装各种模块来修改系统的行为和界面,而无需修改...