Riru
Riru 是一个非常简单但有用的东西。只需要替换一个系统文件,就可以让 Riru 模块在应用程序或系统服务器的进程中运行它们的代码。
Riru 这个名字来自一个角色。(https://www.pixiv.net/member_illust.php?mode=medium&illust_id=74128856)
要求
- Rooted Android 6.0+ 设备
- Magisk (用于替换系统文件,暂时仅提供 Magisk zip)
它是如何运作的?
简而言之,替换将由zygote进程加载的共享库。
首先,我们需要找到那个库。这个库需要尽可能简单,所以我们找到了 libmemtrack,它只有10个导出函数。然后我们可以提供一个名为 libmemtrack 的库,其中包括所有函数,这样功能就不会受到影响,而且我们可以在 zygote 过程中进行。(但是,现在选择 libmemtrack 似乎不太合适)。
接下来的问题是,如何知道我们是处于应用程序进程中还是系统服务器进程中。我们发现在“fork”应用程序或系统服务器时,将调用一些JNI函数(com.android.internal.os.Zygote#nativeForkAndSpecialize
和 com.android.internal.os.Zygote#nativeForkSystemServer
)。 因此,我们只需要将这些功能替换为我们的功能即可。这部分很简单,只需“hook” jniRegisterNativeMethods
,因为 libandroid_runtime 中的所有 Java 本机方法都已使用此函数注册。然后,我们可以再次调用 RegisterNatives
来替换它们。
为什么是 Riru?
只有一个 libmemtrack.so
,因此,如果有人想通过替换它来做某事,其他人则不能。因此,我让 Riru 占用了 libmemtrack,但提供了制作模块的能力。
构建
从 Android Studio 或命令行运行 gradle task :module:assembleRelease
,zip 将被保存到 out
。
安装
在 Magisk 管理器中安装 zip。