1. 程式人生 > >判斷手機是否ROOT 程式碼實現+ Android 作業系統 獲取Root許可權 原理解析

判斷手機是否ROOT 程式碼實現+ Android 作業系統 獲取Root許可權 原理解析

判斷手機是否具有ROOT限                                                   

 許多機友新購來的Android機器沒有破解過Root許可權,無法使用一些需要高許可權的軟體,以及進行一些高許可權的操作,其實破解手機Root許可權是比較簡單及安全的,破解Root許可權的原理就是在手機的/system/bin/或/system/xbin/目錄下放置一個可執行檔案“su”,這是一個二進位制檔案,相當於電腦上的exe檔案,僅僅在系統中置入這個“su”檔案是不會給手機的軟體或硬體造成任何故障。 
    /** 
     * 判斷手機是否ROOT 
     */
public boolean isRoot() { boolean root = false; try { if ((!new File("/system/bin/su").exists()) && (!new File("/system/xbin/su").exists())) { root = false; } else { root = true; } }
catch (Exception e) { } return root; }

上面返回的引數就知道手機是否具有ROOT許可權了。

向ROOT許可權傳送請求資訊,以獲取ROOT許可權 

此方法不涉及底層, 這種方式需要使用者點選確認才可以獲取.

public class MainActivity extends Activity {  
  
    /** 
     * 建立 
     */  
    public void onCreate(Bundle savedInstanceState) {  
        super
.onCreate(savedInstanceState); setContentView(R.layout.main); // 返回系統包名 String apkRoot = "chmod 777 " + getPackageCodePath(); RootCommand(apkRoot); } /** * 應用程式執行命令獲取 Root許可權,裝置必須已破解(獲得ROOT許可權) * * @param command * 命令: String apkRoot="chmod 777 "+getPackageCodePath(); * RootCommand(apkRoot); * @return 應用程式是/否獲取Root許可權 */ public static boolean RootCommand(String command) { Process process = null; DataOutputStream os = null; try { process = Runtime.getRuntime().exec("su"); os = new DataOutputStream(process.getOutputStream()); os.writeBytes(command + "\n"); os.writeBytes("exit\n"); os.flush(); process.waitFor(); } catch (Exception e) { Log.d("*** DEBUG ***", "ROOT REE" + e.getMessage()); return false; } finally { try { if (os != null) { os.close(); } process.destroy(); } catch (Exception e) { } } Log.d("*** DEBUG ***", "Root SUC "); return true; } }

android root許可權破解分析

許多機友新購來的Android機器沒有破解過Root許可權,無法使用一些需要高許可權的軟體,以及進行一些高許可權

的操作,其實破解手機Root許可權是比較簡單

及安全的,破解Root許可權的原理就是在手機的/system/bin/或/system/xbin/目錄下放置一個可執行文

件“su”,這是一個二進位制檔案,相當於電腦上的exe文

件,僅僅在系統中置入這個“su”檔案是不會給手機的軟體或硬體造成任何故障。

下面的程式碼是android系統原版的su中的部分程式碼,可以看出只允許getuid()為AID_ROOT和AID_SHELL的進

程可以使用su進行登陸。

[cpp] view plaincopyprint?
  1. <span style="font-size:18px;"><strong>/* Until we have something better, only root and the shell can use su. */
  2. myuid = getuid();  
  3. if (myuid != AID_ROOT && myuid != AID_SHELL) {  
  4. fprintf(stderr,"su: uid %d not allowed to su\n", myuid);  
  5. return 1;  
  6. }</strong></span>  
面在Superuser這個android程式中的su不再有上面的一部分,這樣任何程序都可以使用su進行登陸了,有一部分android程式要使用root許可權可能的用法類似於(這個也是Superuser中的一部分程式碼): [cpp] view plaincopyprint?
  1. Process process = Runtime.getRuntime().exec("su");  
  2. DataOutputStream os = new DataOutputStream(process.getOutputStream());  
  3. os.writeBytes("mount -oremount,rw /dev/block/mtdblock3 /system\n");  
  4. os.writeBytes("busybox cp /data/data/com.koushikdutta.superuser/su /system/bin/su\n");  
  5. os.writeBytes("busybox chown 0:0 /system/bin/su\n");  
  6. os.writeBytes("chmod 4755 /system/bin/su\n");  
  7. os.writeBytes("exit\n");  
  8. os.flush();  
而在上面提到的Superuser和android程式中的su原始碼中都有這部分程式碼: [cpp] view plaincopyprint?
  1. if(setgid(gid) || setuid(uid)) {  
  2. fprintf(stderr,"su: permission denied\n");  
  3. return 1;  
  4. }  
看上去這裡就是進行許可權切換的地方了。面普通使用者要能使用su,su的許可權要是這樣: -rwsr-xr-x. 1 root root 34904 11月 3 2010 /bin/su 這個和電腦版的su上是一樣的。 從出上面的分析可以認為破解android的root許可權的實質是:在系統中加入一個任何使用者都可能用於登陸的su命令。當然這首先要取得root許可權才能做到。在z4root這個android下的破解android的root許可權的程式中有一個rageagainstthecage,可能就是設法得到root許可權的程式。 第二篇文章:如果你進行過程式開發,在root過的手機上面獲得root許可權的程式碼如下: [java] view plaincopyprint?
  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 root許可權破解分析》中講到Android系統預設的su程式只能root和shell可以用執行su,這個是安全的。如果把這個限制拿掉,就是root破解了!

下面我們仔細分析一下程式是怎樣獲得root許可權的,如果對Linux的su命令熟悉的朋友可能知道su程式都設定SUID位,我們檢視一下我的手機(已經root破解)上的su許可權設定,

 我們發現su的所有者和所有組都是root,是其實是busybox的軟連結,我們檢視busybox的屬性發現,其設定了SUID和SGID,並且所有者和所有組都是root。SUID和SGID的作用是什麼呢?如果你不太清楚,請參考《Linux程序的實際使用者ID和有效使用者ID》,這樣執行busybox的普通使用者,busybox執行過程中獲得的是root的有效使用者。su程式則是把自己啟動一個新的程式,並把自己許可權提升至root(我們前面提到su其實就是busybox,執行期它的許可權是root,當然也有許可權來提升自己的許可權)。

再強調一下不光root手機上su需要設定SUID,所有的Linux系統上的su程式都需要設定SUID位。請參考一下UC伺服器的su的許可權情況:

我們發現su也設定了SUID位,這樣普通使用者也可以執行su程式,su程式會驗證root密碼,如果正確su程式可以把使用者許可權提高的root(因為其設定SUID位,執行期是root許可權,這樣其有許可權提升自己的許可權)。

這樣我們就可以看出其實Android系統的破解的根本原理就是替換掉系統中的su程式,因為系統中的預設su程式需要驗證實際使用者許可權(只有root和 shell使用者才有權執行系統預設的su程式,其他使用者執行都會返回錯誤)。而破解後的su將不檢查實際使用者許可權,這樣普通的使用者也將可以執行su程式, 也可以通過su程式將自己的許可權提升。

到這裡大家對root破解不感到神祕了吧。root破解沒有利用什麼Linux核心漏洞(Linux核心不可能有這麼大的漏洞存在),可以理解成root 破解就是在你係統中植入“木馬su”,說它是“木馬”一點兒都不為過,假如惡意程式在系統中執行也可以通過su來提升自己的許可權的這樣的結果將會是災難性 的。所以一般情況下root過手機都會有一個SuperUser應用程式來讓使用者管理允許誰獲得root許可權,也算是給系統加了一層保險吧!

通過上文《Android系統root破解原理分析》 的介紹大家應該明白了root破解過程的終極目標是替換掉系統中的su程式。但是要想替換掉系統中su程式本身就是需要root許可權的,怎樣在root破 解過程中獲得root許可權,成為我們研究的重點了。下面我們先清點一下我們需要破解系統情況,假設需要破解的Android系統具備如下條件: [java] view plaincopyprint?
  1. 1、可以通過adb連線到裝置,一般意味著驅動程式已經安裝。   
  2. 2、但是adb獲得使用者許可權是shell使用者,而不是root。  

要想理解root破解過程我們首先需要了解一下adb工具,SDK中包含adb工具,裝置端有adbd服務程式後臺 執行,為開發機的adb程式提供服務,adbd的許可權,決定了adb的許可權。具體使用者可檢視/system/core/adb下的原始碼,檢視 Android.mk你將會發現adb和adbd其實是一份程式碼,然後通過巨集來編譯。

檢視adb.c的adb_main函式你將會發現adbd中有如下程式碼:

[java] view plaincopyprint?
  1. int adb_main(int is_daemon)  
  2. {  
  3.     ......  
  4.     property_get("ro.secure", value, "");  
  5.     if (strcmp(value, "1") == 0) {  
  6.         // don't run as root if ro.secure is set...
  7.         secure = 1;  
  8.         ......  
  9.     }  
  10.     if (secure) {  
  11.         ......  
從中我們可以看到adbd會檢測系統的ro.secure屬性,如果該屬性為1則將會把自己的使用者許可權降級成shell使用者。一般裝置出廠的時候在/default.prop檔案中都會有: [java] view plaincopyprint?
  1. ro.secure=1

這樣將會使adbd啟動的時候自動降級成shell使用者。

然後我們再介紹一下adbd在什麼時候啟動的呢?答案是在init.rc中配置的系統服務,由init程序啟動。我們檢視init.rc中有如下內容:

[java] view plaincopyprint?
  1. # adbd is controlled by the persist.service.adb.enable system property  
  2. service adbd /sbin/adbd  
  3.    disabled  
對Android屬性系統少有了解的朋友將會知道,在init.rc中配置的系統服務啟動的時候都是root許可權(因為init進行是root許可權,其子程式也是root)。由此我們可以知道在adbd程式在執行: [java] view plaincopyprint?
  1. /* then switch user and group to "shell" */
  2. setgid(AID_SHELL);  
  3. setuid(AID_SHELL);  

程式碼之前都是root許可權,只有執行這兩句之後才變成shell許可權的。

這樣我們就可以引出root破解過程中獲得root許可權的方法了,那就是讓以上面setgid和setuid函式執行失敗,也就是降級失敗,那就繼續在root許可權下面運行了。

[java] view plaincopyprint?
  1. 1、出廠設定的ro.secure屬性為1,則adbd也將執行在shell使用者許可權下;  
  2. 2、adb工具建立的程序ratc也執行在shell使用者許可權下;  
  3. 3、ratc一直建立子程序(ratc建立的子程式也 將會執行在shell使用者許可權下),緊接著子程式退出,形成殭屍程序,佔用shell使用者的程序資源,直到到達shell使用者的程序數為 RLIMIT_NPROC的時候(包括adbd、ratc及其子程式),這是ratc將會建立子程序失敗。這時候殺掉adbd,adbd程序因為是 Android系統服務,將會被Android系統自動重啟,這時候ratc也在競爭產生子程式。在adbd程式執行上面setgid和setuid之 前,ratc已經建立了一個新的子程序,那麼shell使用者的程序限額已經達到,則adbd程序執行setgid和setuid將會失敗。根據程式碼我們發 現失敗之後adbd將會繼續執行。這樣adbd程序將會執行在root許可權下面了。  
  4. 3、這是重新用adb連線裝置,則adb將會執行在root許可權下面了。  

通過上面的介紹我們發現利用RageAgainstTheCage漏洞,可以使adbd獲得root許可權,也就是adb獲得了root許可權。拿到root許可權剩下的問題就好辦了,複製破解之後的su程式到系統中(見上文《Android系統root破解原理分析》的介紹),都是沒有什麼技術含量的事情了。

其實堵住adbd的這個漏洞其實也挺簡單的:

[java] view plaincopyprint?
  1. /* then switch user and group to "shell" */
  2. if (setgid(AID_SHELL) != 0) {  
  3.     exit(1);  
  4. }  
  5. if (setuid(AID_SHELL) != 0) {  
  6.     exit(1);  
  7. }  

如果發現setgid和setuid函式執行失敗,則adbd程序異常退出,就把這個漏洞給堵上了。為什麼這麼多設 備都沒有堵上這個漏洞呢?我覺得是裝置廠商的策略(不排除傻X的廠商存在哦),雖然知道怎麼封堵漏洞但是就是留著個後門給大家,讓第三方給自己定製 rom,提高自己系統的易用性。

至此我們把root的過程和root之後系統情況都進行了介紹,相信你也不會對root破解再神祕了吧!

以上兩篇文章分別轉自:

相關推薦

判斷手機是否ROOT 程式碼實現+ Android 作業系統 獲取Root許可權 原理解析

判斷手機是否具有ROOT限                                                    許多機友新購來的Android機器沒有破解過Root許可權,無法使用一些需要高許可權的軟體,以及進行一些高許可權的操作,其實破解手機Root

一行程式碼實現Android右滑返回功能

一行程式碼實現Android右滑返回功能 一、使用方式 二、設計思路 三、方案過濾 四、實現過程 1、實現NavigationLayout 2、新增NavigationLayou

一行程式碼實現android檔案下載

起源 本文主要介紹開源專案Aria的使用。 Aria專案源於15年工作中遇到的一個檔案下載管理的需求,當時被下載折磨的痛不欲生,從那時起便萌生了編寫一個簡單易用,穩當高效的下載框架,aria經歷了1.0到3.0的開發,算是越來越接近當初所制定的目標了。 以

Android 兩行程式碼實現換膚 從appcompat-v7原理出發

背景 換膚方案原理在網上已經很多了, 這裡不再詳細描述, 強迫症的我總是想讓提供給別人使用的SDK儘量好用, 哪怕是給自己帶來額外的工作量, 經過一段時間的奮鬥, 實現了一個自我感覺良好的換膚框架. 這裡主要來看看Android 原始碼中”com.android.su

android emulator 獲取 Root 許可權

參考:https://blog.csdn.net/luvsnow/article/details/79963025  在2018.4的博文,搜尋時排在前面,我嘗試了一下。 浪費將近1小時,下載,按步驟,等;些方法是如此之差。其實有更簡單的方法! 看我的文章:笨方法,原本簡單的方

android apk獲取root許可權執行相應的操作 demo除錯

在apk中,有時候需要root許可權,例如通過apk更新系統庫等system的檔案等,避免升級韌體,或者在apk中需要直接訪問某些裝置等。下面是在apk中獲取root許可權的方法,前提是裝置已經root過了。 關鍵點在於下面這句,通過執行su產生一個具有roo

Android 獲取ROOT許可權原理解析

一、 概述 本文介紹了android中獲取root許可權的方法以及原理,讓大家對android玩家中常說的“越獄”有一個更深層次的認識。 二、 Root的介紹 1.       Root 的目的 可以讓我們擁有掌控手機系統的許可權,比如刪除一些system/app下面的無用軟體,更換開關機鈴聲和

【30秒】android模擬器獲取ROOT許可權!!!安卓

秒殺所有ROOT方法,30秒就讓你的模擬器獲得ROOT許可權!!! 1、取得root許可權  adb shell mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system cd /system/bin cat

Android Handler 消息機制原理解析

當前 its leak 示例 異步消息 了解 modifier supported 異步 前言 做過 Android 開發的同學都知道,不能在非主線程修改 UI 控件,因為 Android 規定只能在主線程中訪問 UI ,如果在子線程中訪問 UI ,那麽程序就會拋出異常 a

Android View 的事件分發原理解析

pri ping res 參考文獻 方法 處理 llb tst ancestor 作為一名 Android 開發者,每天接觸最多的就是 View 了。Android View 雖然不是四大組件,但其並不比四大組件的地位低。而 View 的核心知識點事件分發機制則是不少剛入門

圖片上傳時實現本地預覽功能的原理解析

前言 最近在專案上加一個圖片裁剪上傳的功能,用的是cropper外掛,注意到選擇本地圖片後就會有預覽效果,這裡整理一下這種預覽效果的實現原理; 實現原理 通過input的 type = file屬性和window的內建FileReader物件,利用

Android 網路獲取資料之Json解析

1.簡介 JSON(JavaScript Object Notation) 是一種輕量級的資料交換格式。 JSON資料作為目前網路中主流的資料傳輸格式之一,應用十分廣泛。 2. Json資料格式(兩種) Json資料有兩種格式: (1)物件 :物件表示

C++實現K-means,聚類原理解析(並用在圖片畫素點聚類)

最近用到影象中的點的聚類,於是就寫了一個k-means的類。 驗證的過程是將一幅圖的所有點的(B, G, R)作為資料點,進行聚類。 算出K箇中心類後,對影象中的每個點進行重新上色。按照類別給給每類生成一種隨機色彩。 使用該類,可以自定義聚類中心K的個數、資料維度N的大

Android應用獲取通知欄許可權是否開啟--以及跳轉到系統設定介面--解決方案

因為專案用到推送功能,所以需求是知道使用者是否開啟了通知欄的許可權,並且提供滑動按鈕進行跳轉以便使用者進行關閉或者開啟。 1.獲取通知欄許可權是否開啟: /** * 獲取通知欄許可權是否開啟 * */ public class Notifica

Android 外掛補丁框架 ZeusPlugin 原理解析

ZeusPlugin 是掌閱開源的一個外掛補丁框架,最近在使用的過程中也一邊在研究原理,在此記錄一下。 Android外掛化主要需要解決兩個問題:程式碼載入和資源載入。 程式碼載入 系統類載入機制 雙親委託模型 Java的JVM虛擬機器

Android黃油計劃之Choreographer原理解析

   搞客戶端開發,時間也有點了,但是每次想起來,總感覺自己掌握的東西零零散散,沒有一點集在的感覺,應用層的懂,framework的也懂,框架啥的瞭解一點,分層的思想也有一些,JVM的原理啊,記憶體分配和管理啊,執行機制啊啥的也知道一點,每次下班或者沒事了,就在考慮,自己應

Android判斷手機是否已經Root

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

android 程式碼實現手機自動恢復出廠設定不需要許可權

需要啟用成為裝置管理器 DevicePolicyManager mDPM; boolean active = mDPM.isAdminActive(mDeviceAdminSample); if (active) {mDPM.wipeData(0);}

JS判斷是否是微信頁面,判斷手機作業系統(ios或android)並跳轉到不同下載頁面

JS判斷客戶端是否是iOS或者Android 1 function is_weixin() { 2 var ua = window.navigator.userAgent.toLowerCase(); 3 if (ua.match(/Micr

Android 判斷手機是否有root許可權

root許可權是安卓最高的操作許可權,俗稱superuser,簡稱su,一般來說root過的手機,系統目錄會有su目錄和系統app目錄中有Superuser.apk,或者kingroot、360Root