場景描述:
1. 連接Android手機,adb shell find xxxx,顯示adb permission denied;
2. Google顯示需要運行在root權限下,adb root,無錯誤輸出,再次adb shell find xxxx,仍顯示permission denied;
3. 發現手機未獲取root權限,嘗試root精靈和kingroot一鍵root均失敗。
原因:
1. adb是Android SDK自帶調試工具(相關介紹:Android developer);
2. adb默認以shell權限執行(非root),即使已獲取手機及root權限,也需要顯示切換 adb root;
若未獲取root權限,顯示切換當然也是沒有用的;
3. adb 獲取root權限的大前提:手機已root,目前依賴root工具,而root工具一般會有試用機型系統列表,列表外的手機無法實現root。
解析:
1. 為什么要root?
Android采用Linux內核;所以同Linux一致,無root權限將無法操作部分文件(如系統文件等)。
2. “把手機root一下”,這句話應該聽說很多,究竟root一下代表什么呢?
用戶對手機的權限一般是普通用戶,手機廠商禁止用戶獲取root權限,root一下,即為將用戶的shell權限提升為root權限。
3. 重中之重,root的通用原理是什么?
(提前注明:搜索的資料多為2013年或之前,具體提及破解細節只適用於當時Android版本,但猜想通用原理是一致的,整理之。)
關鍵的 "su" 參考:Android 系統 root 破解原理分析 + Android 的提權 (Root) 原理是什么?
- 在Linux中,執行su命令輸入密碼即可獲取root權限;在Android中,有些手機封裝系統會直接去除su命令,另外的也不是通過密碼來驗證,而是看用戶原先權限。即如果你是root,那你可以通過su切換到別的用戶,比如說shell,wifi,audio什么的。但如果你是root之外的其他用戶,就不能切換回root了,會提示你permission denied。
- 在Linux中,存在一種特殊權限 s , 設置SUID(意思是,執行這個文件的用戶暫時擁有文件擁有者的權限)。而su的擁有者即為root,所以普通用戶運行su,即可獲取到root權限。

- Android同理,由於手機廠商可能封裝了其他性質的su,所以首先需要確認兩點:1. Android手機中存在su命令;2. su命令擁有者為root,執行權限為s。
所以root的重點在於要想辦法替換並執行su。
cp /data/tmp/su /system/bin/ #copy su 到/system/分區
chown root:root su #su的所有者置成root chmod 4775 /system/bin/su #把su置成-rwsr-xr-
以上操作都需要root權限,至此陷入循環,常規途徑無法破解。
非常規途徑(adbd漏洞為例)參考:Android 系統 root 破解原理分析(續)
Android init進程以root權限啟動,從而啟動init.rc及其配置的系統服務(包括adbd),adbd在執行以下兩句命令后變為shell權限
/* then switch user and group to "shell" */ setgid(AID_SHELL); setuid(AID_SHELL);
破解的方法,在於讓這兩句命令執行失敗,切換為shell失敗則保留為原始的root權限。
(但實際在Android4.2以后su命令的執行過程有修改,5.X之后也有變動,具體資料未梳理明了,暫保留以上)
