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