`
weihe6666
  • 浏览: 439062 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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函数调用可以看到这个函数的作用。
分享到:
评论

相关推荐

    Xposed-NueXini-x86_64.zip

    这个"Xposed-NueXini-x86_64.zip"文件是专为64位Android设备或模拟器设计的Xposed框架版本。在深入探讨相关知识点之前,需要强调的是,对Android系统的任何修改都涉及到一定的风险,尤其是对于新手来说,不当操作...

    xposed-x86 xposed-x86-64

    由于这两种架构的不同,Xposed框架也需要为每个架构提供相应的版本,即“xposed-x86”和“xposed-x86_64”。这确保了框架在不同硬件平台上能够正常运行。 安装Xposed框架的步骤通常包括以下几步: 1. 获取对应架构...

    xposed-v89-sdk25-x86.zip

    《Xposed框架详解:深入理解xposed-v89-sdk25-x86.zip》 Xposed框架是一款在Android系统上广泛使用的模块化开发工具,它允许开发者通过编写特定的模块来改变系统的功能或应用的行为,而无需修改APK文件。在本文中,...

    xposed-v88-sdk25-x86.zip

    标题 "xposed-v88-sdk25-x86.zip" 提供了关于这个压缩包的重要信息,它是一个针对特定环境的 Xposed 框架版本。Xposed 是一个在 Android 系统上运行的框架,允许用户通过安装模块来修改系统行为,无需root权限。这里...

    xposed api-82

    - **XposedBridge API**:这是Xposed框架的核心接口,包括`IXposedHookLoadPackage`、`IXposedHookZygoteInit`等,它们定义了如何在系统启动或加载应用时执行自定义逻辑。 - **Hook技术**:理解Java反射和Method ...

    weixin-alipay-yunshanfu-xposed-pay-master.zip_oldgem_p. alipay.

    标题 "weixin-alipay-yunshanfu-xposed-pay-master.zip_oldgem_p.alipay." 暗示这是一个与微信支付和支付宝支付相关的项目,可能是一个针对Android系统的Xposed框架插件。Xposed是一个允许用户在不修改APK的情况下...

    0积分 Xposed开发必备 api-82.jar

    Xposed提供`XposedBridge.log()`方法用于调试,帮助开发者查看被Hook的方法何时被调用以及传递的参数。 2. **ClassLoader Hook**:这种方法涉及到类加载过程的修改,可以控制哪些类会被加载,或者在类加载后立即...

    xposed-v89-sdk25合集.zip

    xposed-v89-sdk25-arm86与xposed-v89-sdk25-arm64两个版本对应的系统是安卓5.0以上的

    Xposed工具XposedBridgeApi-89.jar

    《Xposed框架与XposedBridgeApi-89.jar详解》 在Android开发领域,Xposed框架是一个极具影响力的神器,它允许开发者通过修改系统的运行时行为,实现对系统和应用的深度定制,而无需修改APK文件。XposedBridgeApi-89...

    xposed-uninstaller-20180117-arm.zip

    而“xposed-uninstaller-20180117-arm.zip”则是专门为Xposed框架提供的卸载工具,适用于基于ARM架构的Android 5.0系统。 在深入探讨Xposed框架之前,我们需要理解Android系统的运行机制。Android系统基于Linux内核...

    xposed-uninstaller-20150831-arm.zip_xposed_xposed uninstaller_xp

    Xposed框架是一款强大的Android系统修改工具,它允许用户在不修改APK的情况下影响应用程序或系统的行为。"Xposed Uninstaller 20150831-arm.zip" 是专为基于ARM架构的Android设备设计的Xposed框架卸载程序。这款工具...

    XPOSED依赖JAR包下载, XposedBridgeApi-82.jar

    内有XposedBridgeApi-82.jar XposedBridgeApi-82-source.jar两个文件 api-82.jar SHA-1:35866b507b360d4789ff389ad7386b6e8bbf6cc4 api-82-source.jar SHA-1:2030f71764b06b2f39fa1a85660690aa834cfd84

    xposed-v89-sdk23-x86.zip

    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 ...

    xposed-x86and64.zip

    1. **下载Xposed框架**:你需要下载两个文件,分别是"xposed-x86_64.zip"和"xposed-v89-sdk25-x86.zip"。这两个文件是Xposed框架的安装核心,一个用于X86架构,另一个用于X64架构。请确保你下载的是与你的设备架构相...

    xposed-v90.2-sdk27-beta3-topjohnwu.zip

    标题 "xposed-v90.2-sdk27-beta3-topjohnwu.zip" 暗示了这是一个关于Xposed框架的更新版本,版本号为v90.2,针对Android SDK 27(即Android 8.1 Oreo)平台,并且是topjohnwu开发的Beta 3测试版。Xposed框架是一款...

    3C_All-in-One_Toolbox_Pro_v2.2e.apk

    还允许使用图形添加状态栏通知以及使用Xposed框架删除原始电池图标 ★高度可配置的小部件都可调整大小,从简单的仪表到更复杂的数据显示,组件切换和历史图形 ★在应用程序,小部件或使用配置文件中的系统组件...

    framework-xposed-v89-sdk25-x86

    "framework-xposed-v89-sdk25-x86"这个标题表明我们正在处理的是Xposed框架的一个版本,针对的是Android SDK Level 25(即Android 7.1.1 Nougat)的x86架构设备。这个版本号"v89"表示它是Xposed框架的某个迭代更新。...

    xposed-v89-sdk25-x86.zip和script.sh

    "xposed-v89-sdk25-x86.zip" 文件名表明这是一款针对Android SDK 25(即Android 7.1 Nougat)的Xposed框架版本,适用于x86架构的设备。"script.sh" 文件则可能是一个脚本,用于帮助用户安装或配置Xposed框架。 1. *...

    EdXposed-SandHook-v0.5.1.3_4646-master-release_xposed_EdXposed-S

    EdXposed-SandHook 是一个基于 Xposed 框架的模块,主要用于 Android 设备上的系统级自定义和功能扩展。Xposed 是一个在 Android 系统上运行的框架,它允许用户通过安装各种模块来修改系统的行为和界面,而无需修改...

Global site tag (gtag.js) - Google Analytics