为方便以后开发 Inline Hook 模块,特在这里记录一下我从零开始使用 Inline Hook 技术的整个流程。

这是这个系列的第一部分。后续会随着我的研究进度,分享更多的内容。

技术栈#

  • Magisk,作为注入 Zygote 的底层框架;
  • Zygisk,作为劫持 Zygote 的实际作用部分;
  • Dobby ,用来实现指令精度级的 Inline Hook。

开发环境#

我使用的是 Android Studio 内含的 Emulator。从 Android 11 开始,x86_64 的镜像内含一个 ARM 指令转译模块 1。在非必要的情况下,不必再使用 ARM 镜像开发应用(转译性能较低)。

如果你是 Windows 用户,也可以考虑使用 MagiskOnWSALocal 项目,将 WSA 变成一个完美的 Magisk 开发环境。

克隆 Magisk 仓库#

下文假定你已经在 Emulator 里成功下载了相应的系统镜像,并拥有如何正确使用 Emulator 的经验。

Android Studio 内置的镜像自然是不包含 Magisk 的。我们需要使用 Magisk 项目自带的一个脚本,创建修改后的 ramdisk.img

使用下面的指令克隆 Magisk 仓库:

git clone --recurse-submodules -j8 https://github.com/topjohnwu/Magisk.git

带上 --recurse-submodules 的原因是 Magisk 项目本身会引用一些外部模块。-j8 用于加速克隆速度。

初始化环境#

克隆完成后,先在环境变量里设定 ANDROID_SDK_ROOT,用于让 Magisk 相应脚本找到需要的依赖项目。

或者,如果不想因此而修改环境,你可以用一个取巧的方法:

ANDROID_SDK_ROOT=/to/sdk/root/directory python3 build.py <your_command>

克隆完成后,需要在 Magisk 根目录运行下面的指令,以初始化 Magisk 所需的 NDK 模块:

./build.py ndk

不要在 Android SDK Manager 里下载对应的 NDK。可能会导致意外的无法编译错误。

植入 Magisk#

运行下面的指令:

./build.py emulator

你就能够获得一个一次性的 Magisk 开发环境。重启后环境会消失。

可能你不会想要这个命令,而是下面这个直接 patch ramdisk 的指令:

./build.py avd_patch /path/to/ramdisk.img

在成功执行这个命令后,Emulator 将自动重启。命令执行时间较长,请耐心等待。中间不会有太多输出。

之后,任意创建一个新的模拟器,并选中你 patch 后的 ramdisk,即可获得一个带有 Magisk 环境的模拟系统。

vUhIlq.png

至此,开发环境已经搭建完毕。