【BUG 体质康复日记】尝试在 Android 10 安装 Xposed 踩的坑

由于需要在新测试机(Android 10)上使用 Xposed,记录一下踩坑心得(苦涩.jpg)

踩到的坑

Xposed 报错“下载 http://dl.xposed.info/repo/full.xml.gz 失败”

错误原因:用了 http 协议,应该是 https 协议
解决方法:改 apk 包,对应字段的 http 改成 https 就好(苦涩.jpg)

框架无响应

无报错,并且安装成功后,Xposed 无法正常使用,表现为操作无响应
原因应该是 Xposed 框架很久不更新了,无法兼容较新的系统版本。

Android 10 上 Xposed 的正确打开方式

最终为了快速解决问题上手干活用了 LSposed

原理

Android Zygote进程

Zygote 进程是 Android 系统第一个拥有 Java 运行环境的进程,由用户空间第一个进程 init 进程通过 init.rc 文件创建,从 init 进程(pid 为 1) fork 而来。所有 APP 进程都是由 Zygote fork 出来,Zygote 进程在启动过程将创建 Java ART 虚拟机,预加载一个 Java 进程需要的所有资源,子进程被创建后就可以直接使用这些资源。

Xposed 原理

Xposed 会替换 Zygote 进程达到控制所有 APP 进程的目的。
Xposed 通过修改 ART/Dalvik 虚拟机,注册需要 hook 的函数为 Native 函数,这样执行到相应函数时,虚拟机优先执行 Narive 函数,然后执行 Java 函数。

基于 Dalvik 的 Hook

将被 Hook 方法修改为一个 JNI 方法,然后绑定一个 Xposed 自定义处理方法逻辑的函数上。

被 Hook 方法调用过程

  • Dalvik 将会进行代码的解释执行,Java 方法进入 Dalvik 虚拟机中会被转化为一个 Method 对象
  • 虚拟机判断这个方法如果是一个 JNI 方法,就会直接调用它绑定的的 nativeFunc 函数
  • 来到 Xposed 处理 Hook 的函数中,这个函数将这个被 Hook 方法的参数进行转发,让 Xposed 模块提供的处理 Hook 的回调方法来接管原来的逻辑,获得新的返回值返回给被 Hook 方法,即可完成整个 Hook 操作

基于 ART 的 Hook

需要重新修改编译 ART 虚拟机的源码,重新编译出 ART 虚拟机的可执行文件 libart.so,替换 Android 系统中的 ART 虚拟机。核心原理就是直接修改一个方法对应的汇编代码的地址,让方法直接跳转到指定地址执行,然后就可以执行自定义的逻辑进行 Hook 处理。

被 Hook 方法调用过程

  • ART 对方法代码进行执行,首先这个 Java 方法在 ART 虚拟机中将使用一个 ArtMethod 对象表示
  • 进入 ART 的 Java 方法执行函数中,会跳入一段蹦床代码中进行执行,这段蹦床代码又会跳入这个 ArtMethod 对象设置的汇编代码地址处
  • 进而执行到 Xposed 用于处理 Hook 的代码中,之后完成 Hook 逻辑

参考资料
https://www.jianshu.com/p/6b4a80654d4e
https://blog.csdn.net/weixin_47883636/article/details/109018440