Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android Root原理和流程分析

Android Root原理和流程分析

編輯:關於Android編程


預備知識

android手機的內部存儲設備分RAM和ROM,RAM是運行內存,掉電就會失去所有內容;ROM中的內容掉電後也不會丟失。

比如一台手機的規格參數裡寫著“2G RAM,16G ROM”。理論上,RAM越大,系統運行越流暢。像大型的3D游戲,運行時需要約300M的內存,那麼在內存2G的手機上就可以流暢的運行,在512M內存的手機上幾乎跑不起來,跑起來也會卡死。我們可以在“設置-管理應用程序-正在運行”中看到手機目前剩余的RAM,一般2GRAM的手機顯示可用RAM只有1G多點,因為Android系統本身的運行也會消耗一定內存。RAM存取速度很快,但價格昂貴,所以手機裡的RAM不會特別大。

Rom的大小與手機卡不卡幾乎沒什麼關系,可以把它當成一張內置的SD卡(它事實上也確實就是一張內置的SD卡)。它上面的內容分成兩大塊:系統數據,用戶文件(也就是我們的照片、歌曲、視頻等等)。系統數據只占據比較小的一部分,大概不到1G,剩下的就由用戶隨意的放照片、視頻等。我們使用MTP(媒體連接模式)將手機連接電腦時,可以在電腦上看到多出來的Phone盤符,在裡面可以查看我們自己的文件。如果16G的ROM,連到電腦上就會發現沒有這麼大,原因就是有一部分放了系統數據。

內存中的系統數據分區是非常重要的——可以說整個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權限?怎樣才算root?

表現上:su文件在/system/xbin文件夾下,並具有rwsr-sr-x權限,就說明手機獲得了root權限。

實際上:在*nix系統(android的內核是linux系統)下,一切皆文件。如磁盤、媒體、輸入輸出……等等。像磁盤,就是/dev下的一些文件;進程,也是通過/proc下的各種文件來描述的。在一切皆文件的*nix系統中,對所有文件隨意操作的自由,就是最大限度的自由。這種自由,就叫“root”權限。

可見,root權限的自由非常大,如果被惡意利用,會使整個系統處於危險之中(你的短信、聯系人,你的賬號密碼,你的照片視頻等等)。所以手機廠商和android系統都不會主動開放root授權的。要獲取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提權。

詳見:http://blog.sina.com.cn/s/blog_da6ccaf60101g86r.html

不過這種方式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權限,基本就大功告成了。

那怎麼放過去呢?

具體操作參見:http://blog.csdn.net/happy_6678/article/details/7242594

腳本語言Edify的詳細介紹參見:http://blog.csdn.net/tody_guo/article/details/7948083

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

ui_print("Mounting system...");

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

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

delete("/system/bin/su","/system/xbin/su","/system/app/Superuser.apk");

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.**.rc就是啟動的腳本,它負責把android系統從/system分區掛載到/system目錄下,並修改其權限為ro(只讀)。這裡我們注意到,init腳本運行時,是擁有修改/system目錄的權限的。

如果我們修改這裡的init腳本,在/system的權限變成ro之前,將su放到/system/xbin目錄下並修改權限,root權限就獲取了。

修改init腳本也並不難,init腳本使用的是AIL(Android InitLanguage),它的詳細介紹參見:http://blog.csdn.net/nokiaguy/article/details/9109491

修改完init腳本,再重新打回boot.img,放到SD卡從SD卡啟動,就大功告成了。

Bootloader加鎖

Bootloader的定義:Bootloader是嵌入式系統在加電後執行的第一段代碼,在它完成CPU和相關硬件的初始化之後,再將操作系統映像或固化的嵌入式應用程序裝在到內存中然後跳轉到操作系統所在的空間,啟動操作系統運行。

Bootloader的加鎖: “加鎖”的BootLoader是指BootLoader在加載操作系統映像或其它重要固件之前,會先對其進行簽名校驗,簽名不符的話就中止啟動流程。

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

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved