【问题标题】:How Xposed do hooking in AndroidXposed 如何在 Android 中进行挂钩
【发布时间】:2016-07-21 12:39:40
【问题描述】:
我正在尝试了解 Xposed 如何进行挂钩部分,它为用户提供了 API 以非常容易地挂钩任何方法。
我已经浏览了 Xposed Bridge 的源代码,该 jar 文件在每个进程启动时驻留在其中。
我还发现他们使用 java 反射来获取类方法、参数等,通过 JNI 将其传递给 Native 方法。
有一件事,我无法弄清楚 Xposed 如何挂钩进程并能够完全控制它。
我试图弄清楚挂钩发生在 XposedBridge jar 文件内的 Java 端,或者它发生在本机代码中的 ART 级别。
【问题讨论】:
标签:
java
android
java-native-interface
native-code
xposed
【解决方案1】:
好问题。 XPosed 通过修改 app_process 文件来工作,该文件是 ART VM,之前是 Dalvik VM。
这个新修改的 ART/Dalvik VM 将在执行时加载 XPosedBridge.jar 文件以及已在系统中注册的所有 xposed 模块。现在,这只会发生一次,因为 Android 的工作方式是从头开始创建一个 Java VM(称为 Zygote),然后每次应用程序启动时,这个 VM 都会被分叉,以便新应用程序拥有自己的 VM。
此外,这个修改后的 ART/Dalvik VM 将在 Zygote 的 fork 函数之后添加一个回调,以允许它触发所有拦截 packageOnLoad 事件的 xposed 模块代码。
最后,为了允许它拦截单个类的方法,XposedBridge 中的 hookMethod 功能(这是您在创建 xposed 模块时使用的库)将修改 VM 中的本机类结构,即为您尝试挂钩的特定类定义,以便将您尝试挂钩的方法的方法指针重定向到新的替换方法。