Android Root原理和流程分析

2021-07-23 07:55:12 字數 3709 閱讀 9496

android手機的內部儲存裝置分ram和rom,ram是執行記憶體,掉電就會失去所有內容;rom中的內容掉電後也不會丟失。

比如一台手機的規格引數裡寫著「2g ram,16g rom」。理論上,ram越大,系統執行越流暢。像大型的3d遊戲,執行時需要約300m的記憶體,那麼在記憶體2g的手機上就可以流暢的執行,在512m記憶體的手機上幾乎跑不起來,跑起來也會卡死。我們可以在「設定-管理應用程式-正在執行」中看到手機目前剩餘的ram,一般2gram的手機顯示可用ram只有1g多點,因為android系統本身的執行也會消耗一定記憶體。ram訪問速度很快,但**昂貴,所以手機裡的ram不會特別大。

記憶體中的系統資料分割槽是非常重要的——可以說整個android系統都在上面。

那麼系統分割槽裡到底存放了哪些內容呢?粗略的講,包括以下內容:

/system

/boot

/cache

/data

/recovery

/misc

其中/system就是android系統,裡面存放了所有的系統應用、支援這些應用執行的framework、系統工具等等。如果把它刪了,你就進不來android系統了,也沒法打**發簡訊了,更不能玩遊戲了,因為android系統已經從你的手機上消失了。

/data就是使用者資料(注意與上面的使用者檔案是不同的),你的簡訊、聯絡歷史、聯絡人等;你用瀏覽器時瀏覽的網頁、輸入的使用者名稱密碼、儲存的設定,都是你的使用者資料。如果把它刪了,你的手機就相當於「恢復出廠設定」,你的簡訊、你裝的應用等統統不見了。

/boot主管手機的正常啟動。比如你按開機鍵會先見到開機動畫,然後順利的進入android系統;你開機時按住音量鍵和開機鍵會進入recovery,這些都是/boot來控制的。不要以為這是無關緊要的工作,開機前android系統是磁碟上的0和1,開機後它變成了乙個可以執行的系統,這都是/boot的功勞。

/cache就是系統當前的快取,你瀏覽的網頁正處在第15行的位置,你玩的遊戲正停留在這個畫面上,都是/cache來記錄的。

/recovery平時一般用不到,它是乙個小型的手機系統,就像android系統一樣。它的作用是可以刷入新的rom,進行系統更新,備份使用者資料等。(具體功能可以安裝乙個clockworkmod看看)

android啟動時會執行/boot下的**,將android系統從磁碟上讀出來,掛載到/system目錄下。注意這裡的/system與前文中說的磁碟上的/system分割槽不是乙個概念:/system分割槽是儲存裝置中的資料,是0和1。而/system目錄是檔案系統中的目錄。/system目錄是/system分割槽的掛載點。

掛載完成後,就可以通過/system目錄訪問到/system分割槽,並對其進行讀寫操作(需要root許可權)。

那麼,什麼是root許可權?怎樣才算root?

表現上:su檔案在/system/xbin資料夾下,並具有rwsr-sr-x許可權,就說明手機獲得了root許可權。

實際上:在*nix系統(android的核心是linux系統)下,一切皆檔案。如磁碟、**、輸入輸出……等等。像磁碟,就是/dev下的一些檔案;程序,也是通過/proc下的各種檔案來描述的。在一切皆檔案的*nix系統中,對所有檔案隨意操作的自由,就是最大限度的自由。這種自由,就叫「root」許可權。

所以現有的獲取root許可權的方法思路其實只有乙個,就是利用漏洞,破壞規則:

1. 利用android原始碼中的漏洞來進行提權(比如rageagainstthecage漏洞,通過大量建立子程序讓adbd程序降級失敗,從而獲取root許可權)

2. 先刷入自定義的recovery,然後利用修改過的recovery將su刷入/system分割槽

3. 從sd卡進行boot,從而修改/system分割槽(只有少部分機型有此功能)

利用原始碼的漏洞,有幾個有名的案例。比如rageagainstthecage漏洞,有人把它稱為setuid提權漏洞。**通過將adbd後台服務子程序耗盡迫使adbd重啟,adbd在重啟的時候具有root許可權,正常情況下這時adbd會呼叫setuid將許可權降到shell,但是由於rageagainstthecage讓adbd的殭屍程序充斥著整個系統,這時候setuid會呼叫失敗,最後adbd就被保留了root許可權執行,從而完成root提權。

詳見:不過這種方式root的成功率已經非常低了,因為隨著android系統的公升級,漏洞也在乙個乙個的被堵上。利用這種方式root的工具大多是手機上的「一鍵root」apk

第二種方式也是現在root成功率很高的一種方式,是通過pc端工具,連線手機進行root。pc端工具會根據機型選擇對應的修改後的recovery(其中認同度最高的是clockworkmod的recovery),通過cat或dd命令將其刷入recovery對應的硬體位址。

命令如下:

adb push stockrecovery.img /sbin/

adb shell "dd if=/sbin/stockrecovery.imgof=/dev/block/platform/mmci-omap-hs.1/by-name/recovery"

adb reboot

recovery其實是乙個小型的手機系統,也是linux核心的。也就是說,可以理解為手機上裝了雙系統,乙個是android系統,乙個是recovery。如果android系統被毀了(比如刪了rom中的/system分割槽),手機還是可以進入recovery的。

通過recovery怎樣獲取root許可權呢?原理很簡單,進入recovery後,/system分割槽就變成了rom中的乙個硬體盤塊,對它當然可以自由修改。我們把su放到/system/xbin資料夾下,賦予rwsr-sr-x許可權,基本就大功告成了。

那怎麼放過去呢?

指令碼語言edify的詳細介紹參見:

就這樣簡單幾步就完成了:

ui_print("mounting system...");

run_program("/sbin/busybox", "mount","/system");

ui_print("deleting old files...");

ui_print("copying files...");

package_extract_dir("system", "/system");

ui_print("fixing permissions...");

set_perm(0, 0, 06755, "/system/bin/su");

ui_print("symlinking...");

symlink("/system/bin/su", "/system/xbin/su");

ui_print("unmounting system...");

run_program("/sbin/busybox", "umount","/system");

至於第三種方式,一般只有非常少的機型支援從sd卡boot來進行root或刷機,這裡就簡單介紹一下這種情況root的思路:因為是從sd卡boot,所以sd卡上會有對應的boot.img。修改這裡的boot.img,就可以達到我們的目的。

boot.img解壓後是這個樣子的:

修改完init指令碼,再重新打回boot.img,放到sd卡從sd卡啟動,就大功告成了。

bootloader的定義:bootloader是嵌入式系統在加電後執行的第一段**,在它完成cpu和相關硬體的初始化之後,再將作業系統映像或固化的嵌入式應用程式裝在到記憶體中然後跳轉到作業系統所在的空間,啟動作業系統執行。

bootloader的加鎖: 「加鎖」的bootloader是指bootloader在載入作業系統映像或其它重要韌體之前,會先對其進行簽名校驗,簽名不符的話就中止啟動流程。

所以root和刷機之前需要先對bootloader進行解鎖。

Android root原理分析

綜合多篇文章,記錄備忘 步驟 1 通過漏洞獲得root許可權 2 獲得root許可權後,複製su檔案到,system xbin目錄下 su檔案時特殊定製的 3 安裝superuser.apk到手機 和su協作完成使用者的許可權確認 有的手機在每次重啟是都會檢查su問件,看它是否有變化 檔案本身和許可...

Android root 破解原理分析

現在android系統的root破解基本上成為大家的必備技能!網上也有很多中一鍵破解的軟體,使root破解越來越容易。但是你思考過root破解的 原理嗎?root破解的本質是什麼呢?難道是利用了linux kernal的漏洞嗎?本文將簡單對root的破解原理進行分析。網上有一篇文章已經對root破解...

緩衝流工作原理

之前i o複習的時候,有個關於位元組緩衝的 public class demo4 catch ioexception e finally 我們都知道緩衝流為我們預先開闢了乙個8192的緩衝陣列。bufferedinputstream原始碼片段 class bufferedinputstream ex...