淺析Android Root,你懂了嗎?
本文轉(zhuǎn)載自微信公眾號「懶編程」,作者ayuliao。轉(zhuǎn)載本文請聯(lián)系懶編程公眾號。
最近在研究Android逆向,其中就涉及到對Android進行Root的操作,Root方式有多種,本篇文章就來簡單總結(jié)一下。
這是一篇科普向文章,沒有代碼層的分析。
Android Root核心原理
Android內(nèi)核其實就是Linux,所以Android要獲得Root權(quán)限,其實等同于內(nèi)核的Linux系統(tǒng)要獲得Root權(quán)限。
使用過Linux的人都比較清楚,我們可以通過sudo或su獲得Root權(quán)限,不同之處在于sudo是暫時獲得Root權(quán)限,而su是一直獲得Root權(quán)限。
因為Root權(quán)限具有危險性,比如用戶可以刪除任意文件,如果不小心將Android核心代碼文件刪除,那么手機就無法正常使用了,為了避免這種情況,Android手機默認是不會提供進入Root權(quán)限的功能的,即缺少su程序。
如果你想讓Android獲得Root權(quán)限,那么你首先需要編譯好su程序文件,然后拷貝到PATH(環(huán)境變量)中,并給予su文件執(zhí)行權(quán)限。
Android手機的PATH有:
- /sbin
- /vendor/bin
- /system/sbin
- /system/bin
- /system/xbin
進行Root時,通常將su程序文件放在/system/xbin目錄中,這樣你在通過adb shell連接Android手機后,就可以通過su命令進入Root權(quán)限了。
原理是這個原理,但實際操作起來,會出現(xiàn)一個邏輯死結(jié)。我們將su文件拷貝到Android PATH中需要Root權(quán)限,而我們當(dāng)前沒有Root權(quán)限,拷貝su文件到PATH的目的便是獲得Root權(quán)限,所以陷入兩難的邏輯死結(jié)中。
一鍵Root
要獲得Root權(quán)限,就需要突破這個邏輯死結(jié)。
在幾年前,市面上有很多一鍵Root的軟件,當(dāng)時,讓Android手機獲得Root最簡單的方式便是從應(yīng)用商城下載好這些一鍵Root軟件,然后通過該軟件可以輕松讓Android獲得Root權(quán)限。
這類一鍵Root軟件會利用Android系統(tǒng)的漏洞,從而獲得某個具有Root權(quán)限的進程,然后利用該進程實現(xiàn)將su文件拷貝到/system/xbin目錄并給予su文件執(zhí)行權(quán)限的過程,但隨著Android的發(fā)展,很多漏洞已經(jīng)被堵上,這類一鍵Root軟件就沒有用武之地了。
此外很多一鍵Root軟件與流氓軟件無異,因為有了最高權(quán)限,可以對你的Android手機做各種流氓操作,你卻無可奈何。
刷Recovery
現(xiàn)在要獲取Android的Root,更常用的方式是刷入第三方的Recovery,然后再借助Recovery刷入獲取Root的程序。
什么是Recovery?
一部Android手機,通常會有2個系統(tǒng),一個是Android系統(tǒng)本身,這也是用戶開機默認會使用的系統(tǒng),另一個便是Recovery系統(tǒng),該系統(tǒng)的主要功能便是操作Android系統(tǒng),比如Android系統(tǒng)出現(xiàn)無法開啟的故障,此時就需要Recovery系統(tǒng),大多數(shù)手機廠商都會讓用戶通過長按開機鍵+音量鍵的方式進入Recovery系統(tǒng),如下圖:
進入Recovery后,你便可以對Android系統(tǒng)本身進行自由管理了,此時我們會通過Recovery來將su文件刷入,從而獲得Root后的Android系統(tǒng)。
如果你使用的不是Google親兒子(如:Nexus),而是使用國內(nèi)廠商的手機,如小米、華為之類的,你還需要突破BootLoader鎖帶來的限制。
BootLoader是你按下手機開機時,最先啟動的程序,它的主要作用便是拉起整個Android系統(tǒng)和Recovery系統(tǒng),但國內(nèi)廠商會對BootLoader上鎖,從而讓手機只能運行該廠商驗證過的Android系統(tǒng)和Recovery,而廠商自己的Recovery通常進行過閹割,無法讓Android獲得Root權(quán)限。
對于國內(nèi)廠商的玩家,獲得Root的第一步是解鎖BootLoader,解鎖分官方解鎖和強制解鎖,比如你使用小米手機,你想刷機,可以去小米論壇申請官方解鎖,但有些手機不支持官方解鎖,此時只能自己搜索解決方案,進行強制解鎖了。
目前最常用的第三方Recovery叫做 TWRP (TeamWin Recovery Project ), 它是由國外 android 愛好者開發(fā)的一款工具,你需要根據(jù)自己的Android型號去找對應(yīng)版本的TWRP。
注意,我們刷入了第三方Recovery后并不表示已經(jīng)完成Root了,我們只是需要一個功能更加強大的Recovery來幫助我們刷入可以獲取Root的程序。
SuperSU與Magisk
SuperSU與Magisk都是知名的Root管理程序,兩者都可以通過TWRP將其刷入,然后讓Android獲得Root權(quán)限,但兩者有較大的不同。
SuperSU
SuperSU由Chainfire開發(fā),在幾年前是當(dāng)之無愧的Android獲取Root的最佳方式,但互聯(lián)網(wǎng)中對SuperSU的討論止步于2017年末,其原因是SuperSU被國內(nèi)公司收購,SuperSU從此由開源模式轉(zhuǎn)為閉源模式,開源版本的SuperSU依舊留在Github,其支持的最新Android版本為7.0,即Android8.0以后,你要使用,就需要使用閉源版本,但沒人愿意使用陌生公司的閉源版本。
SuperSU實現(xiàn)Root的方式也是將SuperSU自己準(zhǔn)備好的su程序文件放到Android中,只是其借助Recovery來刷入su,此外,也會將SuperSU應(yīng)用也刷入到系統(tǒng)中。
如果Android中的任何應(yīng)用都可以不加限制的使用Root權(quán)限,那么手機將沒有安全性可言,所以SuperSU應(yīng)用的目的就是對需要使用Root的應(yīng)用進入管理,如果一個應(yīng)用需要使用Root,會調(diào)用su程序,而該su程序是SuperSU應(yīng)用處理好的su程序,在下放權(quán)限前,會通知SuperSU應(yīng)用,從而實現(xiàn)對應(yīng)用獲取Root的管理。
在Android 6.0時,Google在Android系統(tǒng)中新增了SafetyNet程序,該程序的主要功能便是監(jiān)測系統(tǒng)API,如果發(fā)現(xiàn)系統(tǒng)API遭到修改或系統(tǒng)完備性檢測失敗,則會告知使用了該功能的應(yīng)用,而SuperSU這種更改系統(tǒng)文件并新增文件到Android系統(tǒng)分區(qū)的做法會被SafetyNet程序檢測出來,從而導(dǎo)致很多通過SuperSU實現(xiàn)Root的用戶無法使用Google Play、Netflix等使用了SafetyNet功能的應(yīng)用,也無法獲得任何OTA更新(Over The Air Updates,無線下載更新)。
關(guān)于SuperSU獲取Root的更多細節(jié)可以看一下Chainfire寫的How-To SU(http://su.chainfire.eu/)。
Magisk
SuperSU被收購且開源版只能支持到Android 7.0,Magisk扛起大旗。
Magisk實現(xiàn)Root的方式也是將自己的su程序利用Recovery刷入Android中實現(xiàn)Root。
Magisk的特點在于它會掛載一個與系統(tǒng)文件相互隔離的文件系統(tǒng)來加載自己的內(nèi)容,Magisk的改動都發(fā)生在這個獨立的文件系統(tǒng)中,不會影響到Android系統(tǒng)本身的文件,從而避免被檢測。
與SuperSU類似,Magisk不止提供Root的功能,還提供管理應(yīng)用獲取Root的功能,從而避免任意應(yīng)用亂用Root。
我們可以將Magisk看成一個文件系統(tǒng),該文件系統(tǒng)通過巧妙的設(shè)計實現(xiàn)了各種功能且不對系統(tǒng)文件進行直接修改。
因為Magisk也有自己的模塊系統(tǒng),所以很多人會拿Xposed與Magisk做對比(Xposed與獲取Root沒有啥關(guān)系)。
Xposed的原理是通過劫持Android系統(tǒng)的Zygote進程來加載自己的功能(Zygote進程是App啟動時要fork的進程),顯然,Xposed需要對文件系統(tǒng)進行相應(yīng)的修改,容易被檢測出來,其與Magisk的直觀差別如下圖:
關(guān)于Magisk獲取Root的更多細節(jié)可以看Magisk官方文檔:Magisk Internal Details(https://topjohnwu.github.io/Magisk/details.html)
參考
- Android adb setuid提權(quán)漏洞的分析
- Android Root原理分析及防Root新思路
- Magisk Manager 詳解
- 什么是SafetyNet?如何通過SafetyNet驗證?