原文地址
https://mp.weixin.qq.com/s/zvxrLasOMOP9J_XSeonpvA
![](https://img.haomeiwen.com/i2554175/c89c9305e0988d37.png)
重点问题
1.Xposed 怎样实现的将代码加载到每一个应用进程中(Xposed 是基于 Root 权限实现的,所以有修改 Android 系统的能力)?
『Xposed 是通过修改系统 zygote 进程的实现将代码注入应用进程中的。
Xposed 对 zygote 进程的实现源码进行修改后,重新编译出 app_process 可执行文件,替换了系统的 app_process 文件(包括 64 位 zygote),并在其中加载了 XposedBridge.jar 这个 Dex 代码包,它包含 Xposed 的 Java 层实现代码和提供给 Xposed 模块的 API 代码,那么当 init 进程启动 zygote 服务进程时,将执行修改过的 app_process 文件,此时 zygote 进程就具有了 Xposed 的代码,Xposed 可以进行加载 Xposed 模块代码等任意操作了。
所有 Android 应用都是运行在 Java 虚拟机上的,所有的 Android 应用都是 zygote 的子进程,那么当 Android 应用进程启动后,将具备 zygote 进程加载的所有资源,从而将 Xposed 代码继承到了 Android 应用进程中,实现了将 Xposed 代码加载到每一个进程中的目的。』
2.dalvik 跟 art 虚拟机的hook方式一样嘛?
不一样。
『基于 Dalvik 的 Hook 方案是通过将被 Hook 方法修改为一个 JNI 方法,然后绑定一个 Xposed 自定义处理方法逻辑的函数上来实现的。』
『
基于 ART 的 Hook 方案相比 Dalvik 要复杂一些,需要重新修改编译 ART 虚拟机的源码,重新编译出 ART 虚拟机的可执行文件 libart.so,替换 Android 系统中的 ART 虚拟机实现。
它的核心原理就是直接修改一个方法对应的汇编代码的地址,让方法直接跳转到指定地址执行,然后就可以执行自定义的逻辑进行 Hook 处理了。』
网友评论