Magisk hide/Denylist 核心原理分析 ROOT隱藏的實現(xiàn)淺論


前言
當手機安裝magisk后,全局的掛載空間會受到變更,magisk給我們掛載上了一個su二進制,這就是我們能夠訪問到su命令的原因
無論是Magisk hide還是Denylist,我們都可以將它們的工作分成兩個部分,第一個部分是如何監(jiān)控安卓進程的啟動,第二部分是在安卓進程啟動(fork)之后,盡快移除已經(jīng)“污染”的掛載空間
ROOT隱藏關(guān)乎到magisk的核心原理:
mount
我們可以從linux內(nèi)核獲取到mount的相關(guān)信息

全局掛載空間
/proc/mounts
/proc/mountinfo
/proc/mountstats
進程的掛載空間
/proc/pid/mounts
...
如果我們成功刷入magisk, 以下命令將會有大量的掛載信息輸出
cat /proc/mounts |grep magisk
在linux系統(tǒng)中,mount有好多種
我們注意關(guān)注的是“mount --bind”
mount --bind命令來將兩個目錄連接起來,mount --bind命令是將前一個目錄掛載到后一個目錄上,所有對后一個目錄的訪問其實都是對前一個目錄的訪問
就是說,我們可以給文件目錄戴上一個“面具”,應(yīng)用程序訪問文件,首先訪問到的是“面具層”,而不是真正的文件。
程序由數(shù)據(jù)和代碼組成,但是,我們也可以說,數(shù)據(jù)和代碼都是基于“文件”, 因此對文件的改動,就能改變程序的運行~
所以我們可以面具實現(xiàn)許許多多的黑科技
在root下的程序可以切換到任意進程的命名空間,進行mount(umount)操作
如果我們使用momo檢測,我們可以發(fā)現(xiàn)magisk這套檢測并非運行得很完美
1. magisk hide 的ptrace容易被檢測到
2. magisk hide 無法對isolated_zygote進程處理,因為isolated_zygote與zygote進程共享掛載空間,如果對isolated_zygote進程進行處理,那么后面所有打開的app無法訪問到su,即無法獲取到root權(quán)限。因此,出現(xiàn)一個名為riru_unshare的插件可以使用unshare函數(shù)指定獨立進程不與zygote共享命名空間。
3. 還有一些可以繞過早期magisk hide(18)的方法,就是自定義安卓的進程名后面加兩個.., 如微信的“:hotpot..”進程會被magisk_hide忽略為無效的隱藏進程而被magisk hide忽視。

上述方法在magisk時代下,幾乎毫無作用的,因為我們可以使用面具隨機地讓某個指定程序看到哪些文件,看不到哪些文件。
magisk hide/denylist 的源碼分析
在magisk 23版本之前, 使用magisk hide進行隱藏, magisk hide使用ptrace監(jiān)控進程啟動,如果是zygote進程且非isolated_zygote進程,則暫停進程,進行umount操作,再繼續(xù)運行進程
Part1 監(jiān)控安卓進程的啟動
在magisk 25版本之后,使用denylist,如果你要使用denylist,那需要先需要開啟zygote,因為denylist通過hook zygote的fork函數(shù)獲知進程的啟動。
denylist與magisk hide也是一樣,都是對污染的命名空間進行卸載,但有一點不同,denylist是在自身的進程執(zhí)行卸載代碼,而magisk_hide在magiskd進程進行操作,需要先使用__switch_to_ns__切換到目標進程的命名空間。
Yyds.Msu 的設(shè)計
Yyds.Msu與magisk hide反其道而行之。大道至簡,盡可能讓方案更加簡單才能更穩(wěn)定。
1. Yyds.Msu 是先卸載,默認應(yīng)用是沒有污染命名空間的,也就是說,直接對zygote以及zygote64進程進行命名空間卸載。
2. Yyds.Msu 在不使用zygote hook與ptrace的情況下,是無法監(jiān)聽其它app進程的啟動的,但可以想辦法監(jiān)聽到y(tǒng)yds.msu管理apk的啟動,那就是inotify,我們只需要讓yyds.msu管理apk在Application時候創(chuàng)建一個文件,即可讓我們魔改過的magiskd知曉到并進行掛載。
3. 缺點是我們無法讓其它app打開即進行掛載獲得到root權(quán)限,在不進行任何hook的情況下除非我們死循環(huán)地地掃描/proc目錄。
4. 在Yyds.Msu中我們手動使用超級運行對指定進程直接掛載root權(quán)限以及相關(guān)magisk bin,但是似乎對某些app來說獲取root權(quán)限有些慢,我們直接對zygote進程掛載root權(quán)限并在app啟動成功后恢復zygote的正常掛載,這個就是超級運行的兼容模式。