網友評分: 5分
riru-core模塊是一款專門針對安卓手機系統打造的手機ROOT模塊,這款模塊能夠通過替換被Zygote加載的libmemtrack.so從而實現Zygote注入,以允許模塊在應用程序或系統服務器中運行其代碼,有需要的小伙伴千萬不要錯過哦。
【構建】
在 Android Studio 或命令行執行 gradle task :riru-core:assembleMagiskRelease,zip 會被存到 release。
【檔案結構】
riru模塊是magisk模塊(magisk模塊文檔)。
另外,當前唯一需要的文件(文件夾)是/data/adb/riru/modules/。riru將檢查它是否存在并加載/system/lib(64)/libriru_.so。
【關于預制】
該模板將prefab功能用于本地依賴項。預制支持是從agp4.0添加的,但只能在更高版本上正常使用。如果您不能或不愿意使用apg4.1,則可以注釋掉與預制件有關的零件build.gradle并riru.h從rikkaapps/riru中復制。
為什么要做出 Riru 呢?
因為 libmemtrack.so 只有一個,如果有人想用替換 libmemtrack 的套路來做點什么別人就做不了。所以就制造了 Riru 來占下 libmemtrack 但是提供了模塊這樣的東西。
如何注入合子過程?
在v22.0之前,我們使用替換將由zygote加載的系統庫(libmemtrack)的方法。但是,這似乎會引起一些奇怪的問題。可能是因為libmemtrack被其他東西使用了。
然后,我們找到了一種超級簡單的方法,即“本地橋梁”(ro.dalvik.vm.native.bridge)。特定的“so”文件將由系統自動“dlopen-ed”和“dlclose-ed”。這是從這里來的。
她怎么工作呢?
簡而言之,替換一個會被 zygote 進程加載的共享庫。
首先要找到那個共享庫,而且那個共享庫要越簡單越好,所以就盯上了只有 10 個導出函數的 libmemtrack。 然后就可以自己提供一個叫 libmemtrack 并且也提供了原來的函數們的庫,這樣就可以進去 zygote 進程也不會發生爆炸。(然而現在看來選 libmemtrack 也不是很好)
接著如何知道自己已經在應用進程或者系統服務進程里面。 JNI 函數 (com.android.internal.os.Zygote#nativeForkAndSpecialize & com.android.internal.os.Zygote#nativeForkSystemServer) 會在應用進程或者系統服務進程被 fork 出來的時候被調用。 所以只要把這兩個函數換成自己的。這部分很簡單,只要 hook jniRegisterNativeMethods 因為所有 libandroid_runtime 里面的 JNI 方法都是通過這個注冊,然后就可以再調用 RegisterNatives 來替換它們。
標簽: riru-core