Riru只做一件事,注入Zygote进程,以允许模块在app或system server中运行其代码。
安装Magisk的安卓7.0+的设备
-
一键式
- 在Magisk Manager中搜索 「riru」
- 安装「riru」
-
手动
- 下载压缩包GitHub release
- 在Magisk Manager中安装(Modules - Install from storage - Select downloaded zip)
- When the file
/data/adb/riru/disable
exists, Riru will do nothing - When the file
/data/adb/riru/enable_hide
exists, the hide mechanism will be enabled (also requires the support of the modules)
-
如何注入Zygote进程
v22.0之前,通过替换会被zygote进程加载的系统动态库libmemtrack.so来完成Zygote注入,因为libmemtrack.so只有十几个导出函数,非常轻量便于修改,但是这种方式可能导致某些奇怪的问题因为libmemtrack.so可能被用作其他用途
v22.0之后,通过一个更简单的方式,在
/system/etc/public.libraries.txt
文件中追加我们的so路径,该文件中的所有动态库文件都会被系统自动dlopen,这种方式可见here -
如何区分当前运行在app进程还是system server进程?
有写JNI方法例如com.android.internal.os.Zygote#nativeForkAndSpecialize和com.android.internal.os.Zygote#nativeForkSystemServer是app进程或者system server进程fork时会调用的方法,所以我们可以通过把这些方法替换咱们自己的方法来进行区分。 替换的方式也很简单,因为libandroid_runtime.so里的所有jni方法都会通过jniRegisterNativeMethods进行注册,所以我们可以通过GOT表hook这个方法,然后替换其中参数jniMethods,然后手动调用一次注册方法来完成替换。
v22.0之后,Riru提供一种通过匿名内存来隐藏/proc/maps痕迹的方式,灵感来源于Haruue Icymoon。
Run gradle task :riru:assembleRelease
:core:assembleRelease
task from Android Studio or the terminal, zip will be saved to out
.