Riru 注入框架的研究
https://github.com/RikkaApps/Riru
Riru 通过两点来注入进zygote
- Before v22.0, we use the method of replacing a system library (libmemtrack) that will be loaded by zygote. However, it seems to cause some weird problems. Maybe because libmemtrack is used by something else.
- Then we found a super easy way, the “native bridge” (
ro.dalvik.vm.native.bridge
). The specific “so” file will be automatically “dlopen-ed” and “dlclose-ed” by the system. This way is from here.
通过GOT表hook libandroid_runtime.so中对jniRegisterNativeMethods方法的调用,因为libandroid_runtime.so中所有JNI方法都是通过该方法进行注册,然后再通过手动调用registeNatives来替换
因此通过hook该方法可以在com.android.internal.os.Zygote#nativeForkAndSpecialize和com.android.internal.os.Zygote#nativeForkSystemServer注册时进行替换
Riru也因此完成了zygote进程的注入。
跟别人交流的过程中得知,内存中的so跟本地文件进行对比,检测text段有没有修改过。
内存中的so跟本地文件进行对比,这算是一种比较常见的对比方法了,首先注入进来肯定会多出一个so,那么如何从内存中得到so呢。
Text又是什么,是指汇编中的.text吗。
然后跟我讲了,腾讯游戏竞赛中的安卓题就有对hook的检测,这算是很好的一个样本来学习了。
https://mp.weixin.qq.com/s/Kqygpbk_jAi23i3XCRPB-g
主要的核心代码在/riru/src/cpp/entry.cpp中
1 | extern "C" [[gnu::visibility("default")]] [[maybe_unused]] void |