riru
-
通过修改系统属性ro.dalvik.vm.native.bridge将libriruloader.so注入到zygote进程中
zygote会执行LoadNativeBridge函数, LoadNativeBridge函数会根据属性
ro.dalvik.vm.native.bridge
的值进行dlopen,因此.init_array成为了Hook点 -
libriru的init函数分别调用了PrepareMapsHideLibrary,InstallHooks和 Load
-
PrepareMapsHideLibrary // 隐藏maps
-
InstallHooks // 利用xHook框架hook函数jniRegisterNativeMethods,因此可以拿到nativeForkAndSpecialize, nativeSpecializeAppProcess, nativeForkSystemServer的函数地址
-
Load // 调用LoadModule函数,通过dlopen加载所有的riru模块so,隐藏maps, 加载的riru模块so的onModuleLoaded函数
LSP
LSP就是一个Riru模块
void onModuleLoaded() {
LOGI("onModuleLoaded: welcome to LSPosed!");
LOGI("onModuleLoaded: version v{} ({})", versionName, versionCode);
MagiskLoader::Init();
ConfigImpl::Init();
}
zygote上的钩子
-
nativeForkAndSpecialize(pre/post)
-
LoadDex // 将lspd.dex文件从磁盘map到内存中, InMemoryClassLoader加载,而不是pathclassload可能还是怕被风控
-
InitArtHooker
-
InitJNI(env) //通过jni env 获取java 比如 dalvik/system/PathClassLoader
-
InitNative(env, info)
-
-
InitHooks
-
-
nativeSpecializeAppProcess(pre/post),
-
nativeForkSystemServer(pre/post)