3

我试图了解 Xposed 如何进行挂钩部分,它为用户提供了 API 以非常容易地挂钩任何方法。

我已经浏览了 Xposed Bridge 的源代码,该 jar 文件在每个进程启动时驻留在其中。我还发现他们正在使用 java 反射来获取类方法、参数等,以通过 JNI 将其传递给 Native 方法。

有一件事,我无法弄清楚 Xposed 如何挂钩进程并能够完全控制它。

我试图弄清楚挂钩发生在 XposedBridge jar 文件内的 Java 端,或者它发生在本机代码的 ART 级别。

4

1 回答 1

2

好问题。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 中为您尝试挂钩的特定类,以便将您尝试挂钩的方法的方法指针重定向到新的替换方法。

于 2016-07-30T16:30:13.360 回答