为方便以后开发 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

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