Riru只做一件事,注入合子,以允许模块在应用程序或系统服务器中运行其代码。
要求
植根于Magisk v20.2 +的Android 6.0+设备
Magisk v20.2是第一个从模块支持预初始化Sepolicy补丁的版本,这对于Riru是必需的。
指南
安装
重要信息:在Magisk v21.1之前,您必须手动重启两次以进行首次安装。
从Magisk Manager
在Magisk Manager中搜索“ Riru”
安装名为“ Riru”的模块
Magisk版本要求由Magisk Manager强制执行。在发布Magisk v21.1时,要求是v20.4。
手动地
从下载zip(在百度晚网盘内)
在Magisk Manager中安装(模块-从存储安装-选择下载的zip)
设定档
文件/data/adb/riru/disable存在时,Riru将不执行任何操作
文件/data/adb/riru/enable_hide存在时,将启用隐藏机制(也需要模块的支持)
Riru如何运作?
如何注入合子过程?
在v22.0之前,我们使用替换将由zygote加载的系统库(libmemtrack)的方法。但是,这似乎会引起一些奇怪的问题。可能是因为libmemtrack被其他东西使用了。
然后,我们找到了一种超级简单的方法,即“本地桥梁”(ro.dalvik.vm.native.bridge)。特定的“ so”文件将由系统自动“ dlopen-ed”和“ dlclose-ed”。这是从这里来的。
如何知道我们处于应用程序进程还是系统服务器进程?
一些JNI函数(com.android.internal.os.Zygote#nativeForkAndSpecialize&com.android.internal.os.Zygote#nativeForkSystemServer)是用于派生应用程序进程或系统服务器进程的。因此,我们需要将这些功能替换为我们的功能。这部分很简单,jniRegisterNativeMethods因为所有Java本机方法libandroid_runtime.so都通过此函数注册,因此很容易上钩。然后,我们可以jniRegisterNativeMethods再次调用原始文件来替换它们。
隐藏皮的工作原理?
从v22.0开始,Riru提供了隐藏机制(Haruue Icymoon的想法),使Riru和模块的内存变为匿名内存以从“/proc/maps字符串扫描”中隐藏。
建立
重命名module.example.gradle为module.gradle
替换中的模块信息module.gradle(所有行均以“替换为您”结尾)
写你的代码
:module:assembleRelease从Android Studio或命令行运行gradle task任务,zip文件将保存在中out。
关于预制
该模板将prefab功能用于本地依赖项。预制支持是从AGP 4.0添加的,但只能在更高版本上正常使用。如果您不能或不愿意使用APG 4.1,则可以注释掉与预制件有关的零件build.gradle并riru.h从RikkaApps / Riru中复制。
档案结构
Riru模块是Magisk模块(Magisk模块文档)。
另外,当前唯一需要的文件(文件夹)是/data/adb/riru/modules/。Riru将检查它是否存在并加载/system/lib(64)/libriru_.so。
更新说明
v9,Riru v22.0
API
诸如此类的功能nativeForkAnd...不需要直接导出。唯一要导出的功能是void *init(void *)。有关更多信息,请参见init和模板的实现的注释。
具有以下优点:
模块可以支持不同的Riru版本
Riru本身不会中继“ .prop”文件(不可靠)以获取模块信息
里鲁
从v22.0开始,Riru已切换到“本机桥”(ro.dalvik.vm.native.bridge)来注入合子,这将导致Riru和稍后加载模块(LoadNativeBridgevs __attribute__((constructor)))。
对于大多数模块,这应该没有问题,但是诸如Xposed框架之类的模块可能必须进行更改。
Magisk可能会在不久的将来提供类似Riru的功能,当然,它将具有更严格的限制,模块代码不会在合子中运行。也许Xposed框架模块应该为此做准备?
Riru v22还提供了隐藏功能,以使模块的内存变为匿名内存(请参阅实现)。这是一种选择行为(module->supportHide),Riru本身也具有全局切换(/data/adb/riru/enable_hide)。
模块安装程序
RIRU_PATH已更改/data/adb/riru为隐藏目的。如果您还有其他文件/data/misc/riru,请将其移动到此处(或根据需要移动到其他位置)。
请注意/data/adb/riru,它与其他Magisk文件(由Riru在fs-data中设置)具有相同的SELinux u:object_r:magisk_file:s0。不要将上下文重置为其他内容。