研究riru、magisk

Riru 注入框架的研究

https://github.com/RikkaApps/Riru

Riru 通过两点来注入进zygote

  1. 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.
  2. 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
extern "C" [[gnu::visibility("default")]] [[maybe_unused]] void

// NOLINTNEXTLINE

init(void *handle, const char* magisk_path, const RirudSocket& rirud) {

self_handle = handle;



magisk::SetPath(magisk_path);

hide::PrepareMapsHideLibrary();

jni::InstallHooks();

modules::Load(rirud);

}

研究Magisk

https://github.com/topjohnwu/Magisk

检测Magisk与Xposed - 残页的小博客