獲取root權限及破解原理分析

 

2012-03-18 17:58:45|  分類: android |字號 訂閱 php

現在Android系統的root破解基本上成爲你們的必備技能!網上也有很是多中一鍵破解的軟件,使root破解愈來愈easy。但是你思考過root破解的原理嗎?root破解的本質是什麼呢?難道是利用了Linux kernal的漏洞嗎?本文將簡單對root的破解原理進行分析。html

網上很是多root教程所使用的都是rageagainstthecage程序,今天下載了rageagainstthecage.c源程序看了一下,大體理解了獲取root權限的基本過程和原理。
首先簡單解釋一下什麼是root過的手機(Android系統),所謂root過的手機就是咱們可以以root的權限執行各類程序,進而全然控制系統。
因爲官方系統基於安全緣由,默認程序的執行都是以非root用戶執行的,包含adbd進程。adbd進程是手機中執行的一個守護進程,他負責解釋並執行PC傳送過來的命令,
該進程由init進程建立,但是建立後自身經過調用setuid()系統調用設置執行的用戶爲shell用戶。因此咱們在手機中執行ps命令看到的adbd進程都是以shell用戶身份執行的。
獲取root權限的關鍵是想辦法讓adbd進程又一次以root身份執行,這樣經過電腦傳送過來的命令也就行以root身份執行了。
衆所周知,Android系統用的是linux的內核,在linux中,對於用戶最大讚成執行的進程數有限制,因此rageagainstthecage程序在執行後先結束當前的adbd進程,
而後init進程會又一次啓動新的adbd進程。但是rageagainstthecage程序同一時候會建立大量的子進程,這些子進程默認都是shell用戶身份,從而使得shell用戶擁有的進程數達到最大值,這就使得新啓動的adbd進程調用setuid()系統調用失敗,因爲shell用戶的進程數已滿,adbd沒法把本身執行的用戶設置爲shell用戶,從而保持在剛建立時的root用戶身份中執行。
這時候咱們在電腦中運行adb shell命令時發現已經進入root shell了。
從上面的分析咱們能夠知道:要能夠root成功必須知足兩點:
一、系統必須已經設置每個用戶贊成執行的最大進程數(官方的Android2.一、2.2好像都已經設置,2.3的不是很是清楚)。
二、必須要在新啓動的adbd進程調用setuid()系統調用前建立足夠多的進程數。但是因爲系統進程調度的隨機性,並不能保證每一次都能知足這個要求,這也就是爲何網上說多試幾回就會成功。
運行完rageagainstthecage程序後事實上已經得到了root權限,但是每次這麼作很麻煩,因此還應該設置一些永久性的東西,主要是上傳幾個程序到系統並設置對應權限,這幾個程序各自是:
su--使得非root用戶能夠以root身份執行程序。
busybox--系統工具包,包括很是多的系統使用工具。
SuperUser.apk--受權管理軟件包,爲需要root身份執行的程序受權。

網上下的一鍵root包事實上也就是把上面的工做製做成腳本讓它本身主動運行罷了。
java

 

網上有一篇文章已經對root破解的基本原理進行了簡介,你們可以先參考一下《》,本文僅僅能說對root原理進行了方向性的描寫敘述,但是在一些詳細的方面沒有描寫敘述清楚。本文將會對其進行一些必要的擴展和補充。linux

     假設你進行過程序開發,在root過的手機上面得到root權限的代碼例如如下:android

   1: Process process = Runtime.getRuntime().exec("su");
   2: DataOutputStream os = new DataOutputStream(process.getOutputStream());
   3: ......
   4: os.writeBytes("exit\n");
   5: os.flush();

     從上面代碼咱們可以看到首先要執行su程序,事實上root的祕密都在su程序中,《》中講到Android系統默認的su程序僅僅能root和shell可以用執行su,這個是安全的。假設把這個限制拿掉,就是root破解了!ios

     如下咱們細緻分析一下程序是如何得到root權限的,假設對Linux的su命令熟悉的朋友可能知道su程序都設置SUID位,咱們查看一下個人手機(已經root破解)上的su權限設置,c++

獲取root權限及破解原理分析 - KidGeek - 等待機遇

      咱們發現su的所有者和所有組都是root,是事實上是busybox的軟連接,咱們查看busybox的屬性發現,其設置了SUID和SGID,並且所有者和所有組都是root。SUID和SGID的做用是什麼呢?假設你不太清楚,請參考《Linux進程的實際用戶ID和有效用戶ID》,這樣執行busybox的普通用戶,busybox執行過程當中得到的是root的有效用戶。su程序則是把本身啓動一個新的程序,並把本身權限提高至root(咱們前面提到su事實上就是busybox,執行期它的權限是root,固然也有權限來提高本身的權限)。web

     再強調一下不光root手機上su需要設置SUID,所有的Linux系統上的su程序都需要設置SUID位。請參考一下UCserver的su的權限狀況:sql

獲取root權限及破解原理分析 - KidGeek - 等待機遇

     咱們發現su也設置了SUID位,這樣普通用戶也可以執行su程序,su程序會驗證rootpassword,假設正確su程序可以把用戶權限提升的root(因爲其設置SUID位,執行期是root權限,這樣其有權限提高本身的權限)。shell

     這樣咱們就可以看出事實上Android系統的破解的根本原理就是替換掉系統中的su程序,因爲系統中的默認su程序需要驗證明際用戶權限(僅僅有root和shell用戶纔有權執行系統默認的su程序,其它用戶執行都會返回錯誤)。而破解後的su將不檢查實際用戶權限,這樣普通的用戶也將可以執行su程序,也可以經過su程序將本身的權限提高。

     到這裏你們對root破解不感到神奇了吧。root破解沒有利用什麼Linux內核漏洞(Linux內核不可能有這麼大的漏洞存在),可以理解成root破解就是在你係統中植入「木馬su」,說它是「木馬」一點兒都不爲過,假如惡意程序在系統中執行也可以經過su來提高本身的權限的這種結果將會是災難性的。因此普通狀況下root過手機都會有一個SuperUser應用程序來讓用戶管理贊成誰得到root權限,也算是給系統加了一層保險吧!

 

Android的應用程序入口確定是Java程序。應用程序的啓動者是由系統暫時依據Androidmanifest.xml中定義的權限而建立的暫時用戶。而不像linux那樣是使用登錄者的身份啓動,從而使得進程具備登錄者的所有權限。這也是Android的安全機制之中的一個。新的權限機制也帶來新的問題,Android給應用程序的權限是按功能來分,java儘管可以訪問文件系統。但由於應用程序自己是暫時用戶啓動,這個暫時用戶權限十分有限。所以誕生了<越獄/root機器>這種產物事實上root機器不是真正能讓你的應用程序具備root權限。它原理就跟linux下的像sudo這種命令。在系統的bin文件夾下放個su程序並屬主是root並有suid權限。則經過su運行的命令都具備Android root權限。
Su的源碼網上也有,有興趣的同窗去google下。
固然使用暫時用戶權限想把su拷貝的/system/bin文件夾並改屬性並不是一件easy的事情。這裏用到2個工具跟2個命令。工具就是busybox。不熟悉的同窗可以去網上google下。這個太有名了我就不說了。把busybox複製到你有權限訪問的文件夾而後給他賦予4755權限,你就可以用它作很是多事了。固然busybox僅僅能不能提高權限,真正提高權限的是ratc這個程序,這個程序中一鍵root包裏面可以找到,做用是rooting在adb的shell。
網上介紹Ratc的文章很少,它是rage against the cage 的縮寫。是真正的提高權限的破解程序。儘管我沒看過源碼,但預計是利用adb源碼部份內容來實現的,原理預計跟模擬器使用adb shell登錄可以得到root shell差點兒相同。(因爲它執行需要adb鏈接纔會成功)。使用busybox前先執行ratc,這樣執行busybox的UID將是0,也就是root。首先把system文件夾改爲可讀性的:busybox mount -o remount,rw /system,固然你還不能改如下的文件,因爲system下文件的所有者都不是你。但你可以偷樑換柱把system下的文件夾給換掉。使用命令Busybox mount -t tmpfs none /system/xbin,呵呵這下xbin文件夾你隨便寫了。
將su跟busybox弄過去cp /data/data/xxx/su /system/xbin。而後賦權限chmod 4755 /system/xbin/su。/而後使文件夾生效busybox --install -s /system/xbin,
別忘善後busybox mount -o remount,ro /system去掉system可寫。這樣僅僅是暫時的,僅僅能用su跟busybox能運行一些原來系統沒有權限運行的命令而已。當系統從新啓動後/system/xbin又變爲原來的文件。真正要改系統的話需要本身寫內核代碼(至關於windows的驅動程序)。內核文件擁有所有權限。使用busybox命令insmod /data/data/xxx/xxx.ko裝載內核文件,你想幹嗎就可以幹嗎了。
固然咱們不是搞破解的不是必需去改別人的機器,咱們僅僅是想讓本身應用程序具備root權限而已。因此暫時的su就可以了。咱們用c++寫一個可運行文件。使用socket可以跟java的程序通信。而後將需要使用root權限才幹運行的代碼放在c++程序裏,而後java程序中建立新的su進程,將c++程序帶全路徑做爲參數1。啓動後就可以經過socket調用c++函數去運行你想幹的事了。
最後程序運行完了別忘了善後busybox umount /system/xbin。
最後說說要注意的事情,假設機器已經擁有Android root權限的話就不需要作這些事情了,但root過的機器都有裝有個權限管理的程序。會彈出對話框。但這個程序管理能力有限,假設不想讓他彈出的話。或許可以經過改su文件名稱來解決。有興趣的同窗最好仍是試試。

SuperOneClick 獲取 Root 權限的原理

轉貼自:http://blog.csdn.net/liwei_cmg/article/details/6313944

1、前言

通過筆者本身測試與分析,得出結論:因此Android手機獲取Root權限,最直觀
最有效,最簡便的就是SuperOneClick方法!
與i9000基帶版本號的什麼JPE,JPD,JP8等等,沒有關係
與i9000Android軟件版本號的什麼2.0,2.1,2.2等等,沒有關係
與詳細的什麼Android手機也沒有關係
管你是三星的,仍是MOTO的,仍是HTC……

究竟與什麼有關呢,我理解是Linux的內核版本號!固然普通用戶根本沒必要關心!
興許的文章會提到有關破解Root的底層概念,固然也超出普通用戶的理解範圍。

這裏,我僅僅想介紹一下SuperOneClick獲取Root權限的簡單原理!

2、提示

有關Root權限的獲取方法可參考
《Android應用.三星i9000系列(3).無需刷機輕鬆獲取Root權限》
本系列文章:http://blog.csdn.net/liwei_cmg/category/241839.aspx
3、原理簡單介紹

咱們已經知道adb(Android Debug Bridge)這個概念,不管是Moto的,仍是Samsung
的,Android手機經過USB鏈接電腦後,安裝好驅動,在設備管理器裏都會看到Android
Composite ADB Interface這種東東。SuperOneClick就是調用的adb這種接口。
相同豌豆莢,91手機助手這種軟件也是使用了adb。

關於Android手機USB鏈接電腦的相關內容,可參考:
《Android應用.三星i9000系列(1).版本號選擇與USB鏈接電腦》

4、SuperOneClick提取Root權限的基本步驟

F:/Own/Phone/Samsung/Tools/SuperOneClick 的文件夾下所有文件

2010/10/16  22:04           577,335 adb.exe
2010/10/18  11:27           339,885 adblinux
2010/10/18  11:26           171,656 adbmac
2010/10/16  22:04            96,256 AdbWinApi.dll
2010/10/16  22:04            60,928 AdbWinUsbApi.dll
2010/10/16  23:29         1,062,992 busybox
2010/10/16  22:04             5,392 rageagainstthecage  //步驟一
2010/10/16  22:04            24,120 sqlite3
2010/10/16  22:04            26,264 su                  //步驟二
2010/11/04  21:21           379,392 SuperOneClick.exe
2010/10/16  22:04           196,521 Superuser.apk       //步驟三

手機USB調試方法鏈接好電腦後,在電腦上執行SuperOneClick.exe,在彈出的
界面上,點擊Rootbutton,便開始了Root權限提取的本身主動操做!

事實上它的步驟是這種:

步驟一:將rageagainstthecage文件存放在手機/data/local/tmp下,並運行
——————————————————————————–

1) 將文件放在/data/local/tmp下,其它文件夾沒法運行。命令例如如下:
F:/Own/Phone/Samsung/Tools/SuperOneClick>adb push rageagainstthecage /data/local/tmp

2) 使用adb shell,改動rageagainstthecage文件權限
F:/Own/Phone/Samsung/Tools/SuperOneClick>adb shell
$ cd /data/local/tmp
cd /data/local/tmp
$ chmod 777 rageagainstthecage

3) 使用adb shell,執行rageagainstthecage
$ ./rageagainstthecage

[*] CVE-2010-EASY Android local root exploit (C) 2010 by 743C

[*] checking NPROC limit …
[+] RLIMIT_NPROC={2410, 2410}
[*] Searching for adb …
[+] Found adb as PID 19374
[*] Spawning children. Dont type anything and wait for reset!
[*]
[*] If you like what we are doing you can send us PayPal money to
[*] 7-4-3-C@web.de so we can compensate time, effort and HW costs.
[*] If you are a company and feel like you profit from our work,
[*] we also accept donations > 1000 USD!
[*]
[*] adb connection will be reset. restart adb server on desktop and re-login.
$

此時退出shell,再次使用adb shell,會發現提示符爲#,已經在電腦Shell
上獲取了Root權限。假設不是#,反覆運行(./rageagainstthecage),
直到提示#。

F:/Own/Phone/Samsung/Tools/SuperOneClick>adb shell
#

步驟二:將/system改動爲可讀寫,把su拷貝到/system/bin/
——————————————————————————–

1)上步驟一成功出現的#號提示符下,改動/system
# mount -o remount rw /system
#

2)另開一個命令行窗體,複製su至/system/bin
F:/Own/Phone/Samsung/Tools/SuperOneClick>adb push su /system/bin

su這個文件的功能,即是實現:普通用戶至root超級用戶的權限切換!

步驟三:將受權管理的標準Android軟件包(Superuser.apk)拷貝到手機並安裝
——————————————————————————–

這個過程很是easy,再也不贅述,就是adb push與adb install。受權管理事實上
就是管理哪些程序可使用su。也就意味着對超級用戶權限的使用進行管理。

步驟四:從新啓動手機
——————————————————————————–

事實上就是從新啓動測試一下。

 

5、總結
在提取Root權限過程當中,僅僅有兩個關鍵的文件:

rageagainstthecage
su

rageagainstthecage負責直接破解獲取Root權限,而後才幹改動/system/。
su假設僅僅放在/data/local/tmp文件夾下,是沒有權限執行的。

$ ls -l su
ls -l su
-rwxrwxrwx shell    shell       26264 2010-10-16 22:04 su
$ ./su
./su
Permission denied
$

因此需要把su放在/system/bin文件夾下。以供之後的手機應用程序使用!
至於rageagainstthecage,su的執行原理,就不是本文現在討論的問題了。

This entry was written by sense, posted on August 5, 2011 at 20:43, filed under Android and tagged Android. Bookmark the permalink. Follow any comments here with the RSS feed for this post. Post a comment or leave a trackback: Trackback URL.
 

android 手機/平板大行其道的今天,得到 root 權限成了你們關注的話題。

據我所知,需要得到 root 權限的嵌入式操做系統,僅僅有 ios 和 android。當中 ios 稱爲越獄,隨着 ios 的公佈,有衆多高手開發了對應的傻瓜越獄工具。但是 android 應用很是普遍,卻沒有統一的技術支持,因此僅僅能由用戶本身進行權限破解。因爲 android 的內核是 linux,而 linux 中 root 擁有至高無上的權限,因此一時間獲取 root 權限也成了很是多非 linuxer 關注的話題。
一鍵獲取 android root 權限: Unviersal Androod (不適用所有機型)

爲何要得到 root 權限呢?

事實上平常應用並不需要 root 權限,但是由於一些 android 的限制,咱們必須擁有 root 權限才幹:

  • 下載收費軟件
  • 改動系統文件
  • 替換 hosts 文件
  • 截圖
  • 等等 …

連截圖都要 root 權限……(記得 ios 是 home+power 吧?)

消歧

使用 adb 鏈接到設備得到的 root 權限並不是 設備所擁有的 root。

也就是說,鏈接設備成功後,咱們對設備的系統具備了 root 權限,而設備系統自身並無 root 權限。好比您在 market 看到 need rooted device 字樣,那就是意味着您的設備系統也具備 root 權限。一般來講,root 指設備自身可以運行 su 並得到 root 權限。

原理

adb ( android debug bridge ) 連接設備,並使用具備 root 權限的 adb 改動/替換設備 su 文件,從而具備 root 權限。

前期準備

  • 開啓您的 android 設備,並運行例如如下操做: settings — application — development, 勾選usb debugging;

  • 建立 DE>/etc/udev/rules.d/51-android.rules 文件,內容例如如下:DE>

ubuntu:

1
2
DE> SUBSYSTEM==&amp;amp;amp;quot;usb&amp;amp;amp;quot;, SYSFS{idVendor}==&amp;amp;amp;quot;0bb4&amp;amp;amp;quot;,             MODE=&amp;amp;amp;quot;0666&amp;amp;amp;quot; DE>
DE> SUBSYSTEM==&amp;amp;amp;quot;usb_device&amp;amp;amp;quot;, SYSFS{idVendor}==&amp;amp;amp;quot;0bb4&amp;amp;amp;quot;,             MODE=&amp;amp;amp;quot;0666&amp;amp;amp;quot; DE>

arch:

1
2
3
DE> SUBSYSTEM==」usb」, SYSFS{idVendor}==」0bb4″, MODE=」0666″ DE>
DE> SUBSYSTEM==」usb」,ATTR{idVendor}==」0bb4″,ATTR{idProduct}==」0c02″,SYMLINK+=」android_adb」 DE>
DE> SUBSYSTEM==」usb」,ATTR{idVendor}==」0bb4″,ATTR{idProduct}==」0c01″,SYMLINK+=」android_fastboot」 DE>

當中 USB Vendor IDs 可以在 這裏 查到。

更改文件權限:

1
DE> chmod DE>   DE>a+rx DE>DE>/etc/udev/rulesDE>DE>.dDE>DE>/50-androidDE>DE>.rulesDE>

又一次載入 udev 規則:

1
DE> udevadm control –reload-rules DE>
  • 下載越獄軟件包,並把 su 複製到 adb/tools 內

    開始~

    插入 usb 數據線,而後打開終端,進入 adb/tools 文件夾,運行

    1
    DE> adb devices DE>

    Android adb devices顯示 ????????????    no permissions怎麼辦?

    Windows:執行adb root

    Linux:
    adb kill-server
    sudo adb root

    此時顯示爲:

    List of devices attached 0123456789ABCDEF    device

    成功列出已鏈接的設備後,運行

    1
    2
    3
    4
    5
    6
    7
    DE>adb shell DE>DE>mvDE>   DE> /system/xbin/su DE>   DE> /system/xbin/osu DE>        DE> # 備份原 su 文件 DE>
    DE>adb push DE>DE>suDE>   DE> /system/xbin DE>        DE> # 把 adb/tools 的 su 文件 推送到 android設備 /system/xbin DE>
    DE>adb shell DE>DE>rmDE>   DE> /system/bin/su DE>        DE> # 移除其它的 su 文件 DE>
    DE>adb shell DE>DE>lnDE>   DE>-s DE>DE>/system/xbin/suDE>   DE> /system/bin/su DE>        DE> # 軟鏈 su DE>
    DE>adb shell DE>DE>chmodDE>   DE>6755 DE>DE>/system/xbin/suDE>         DE> # 變動權限 DE>
    DE>adb shell DE>DE>syncDE>        DE> # 同步所有緩存中的文件 DE>
    DE>adb shell reboot      DE>DE># 從新啓動 android 設備DE>

    (您需要依據您的設備和設置變動運行的路徑)

    等待設備從新啓動完畢後,可以在 adb shell 模式輸入:su(回車),會出現su: access granted, courtesy of www.magicandroidapps.com #等提示,表明成功了。

    現在您可以使用root explorer,藍牙上網,截圖,martket enabler等工具啦~

    爲何我不需要 root

    網上超多的 root 教程會讓你驚奇的發現,ROOT好簡單哦。但是看到新手一拿到手機就當即刷ROOT,而後再問:取了ROOT有什麼用?
    咱們不能全然責備用戶,因爲很是多教程都沒有強調刷ROOT可能致使的嚴重後果,會危及到你手上設備的安全性。實際上,很是多用戶根本不需要ROOT權限!

    在開始以前,請先問你本身下面2個問題:
    1.你有幾回細讀過菜市場裏下載的軟件或者遊戲的使用協議?
    2. 你有幾回看了軟件使用協議中的權限要求(full internet, gps location, read contacts等等)後會問「嗯,爲何這個遊戲需要這些權限呢?」
    你是否是仍是照安裝不誤呢?

    事實是,絕大多數的用戶根本不會理會 程序所 請求 的這些權限,他們會照安裝不誤。

    儘管 market 已經通知了用戶軟件所需的權限,但這遠遠不夠。 因爲用戶仍是不知道這些權限和安全有什麼關係。有些軟件或許沒有什麼惡意,但設計的卻極其的爛。因爲開發人員也是人,也會犯錯。有時,程序猿會選擇一個他們以爲安全的協議,但實際上倒是很是危急的。又或者有些惡意軟件,可以讓別人遠程清空你的手機,或者將你手機裏的信息傳送回指定server後再清空你的手機(或許已經有這種軟件了)。我以上所說的這些樣例代表,即使是非ROOT權限的程序都有可能很是危急,況且那些得到ROOT權限的程序呢?

    事實上,有些功能事實上全然不該該需要ROOT權限的。很是多用戶取得ROOT權限僅僅是爲了加入一些本身的主題,爲了一些小衆的需求而已。

    老實的說,看到愈來愈多的ANDROID新手以爲不ROOT就不能正常工做,讓我感到很是沮喪。(via

    參考資料

    http://developer.android.com/guide/developing/device.html

    http://www.kunli.info/2009/08/22/archlinux-android-adb-recognize-device/

    http://henryh.cn/blog/android_cupcake_root.html

    http://bbs.hiapk.com/thread-652917-1-1.html

     https://www.deleak.com/blog/2010/12/17/android-root-on-linux/

  • 相關文章
    相關標籤/搜索