1. 程式人生 > >Android手機Root授權原理細節全解析

Android手機Root授權原理細節全解析

首先關於Root的方式,這裡不做詳解,可以有很多漏洞,比如利用uid溢位後歸為0,得到Root許可權,然後操作檔案系統等。 手機Root後,最重要的是,給手機安裝了su程式和superuser apk。 su一般被安裝在/system/xbin 或者 /system/bin 下面,su檔案的許可權如下: # ls su -l
ls su -l
-rwsr-sr-x    1 root     root         26336 Aug  1  2008 su 這裡可以看到,su的Owner和Group分別為Root,Root。 Other使用者具有exeute許可權,另外,su設定了suid和sgid,這個非常重要,後面會詳述,這個使得Su程序可以提升自身的EUID。 我們這裡以RootExplorer為例,看是如何申請和提升許可權的: 首先,ps一下,可以看到root explorer的資訊,這裡第一列是UID,更加準確的,應該是EUID。 app_73    1143  103   301620 39944 ffffffff 400194c4 S com.speedsoftware.rootexp
lorer 這裡可以看到,Root Explorer的EUID=10073(App Base是從10000開始的) 然後,Root Explorer通過Runtime方式,使用shell 命令列運行了“su”, 所以,會有一個Root Explorer啟動的sh: app_73    1159  1143  764    376   c003e454 4001cf94 S /system/bin/sh default情況下,程序的UID是繼承的,這裡sh的PPID是1143,說明是RootExplorer啟動的。 RootExplorer通過類似下面的程式碼執行“su”:

p = Runtime.getRuntime().exec("su"

);    

所以,1159  PID的sh會啟動su,這裡需要注意的是,su程序的Real UID是10073,因為繼承自parent,但是,其EUID卻提升為了ROOT,這就是由於SUID被設定的原因。 由於su程序的EUID是ROOT,所以導致了su可以做很多高許可權的事情。

su會通過:

sprintf(sysCmd, "am start -a android.intent.action.MAIN -n com.koushikdutta.superuser/com.koushikdutta.superuser.SuperuserRequestActivity --ei uid %d --ei pid %d > /dev/null", g_puid, ppid);
  if (system(sysCmd))
   return executionFailure("am.");

啟動SuperUser Request Activity來詢問使用者是否授權當前應用,如果否的話,則su將return 結束, 否則su會繼續執行。

得到使用者許可後(通過sqlite和SuperUser Request Activity交流使用者許可),su會將自己的Real UID也設定為ROOT:

 if(setgid(0) || setuid(0))
  return permissionDenied();

由於su的EUID是ROOT,所以su有許可權執行以上程式碼,執行完後su程序的Real UID,effective UID都變成了ROOT。 這裡為什麼要同時提升Real UID的許可權,後面會說明。

然後,su會啟動一個額外的sh來執行使用者的指令:

char *exec_args[argc + 1];
 exec_args[argc] = NULL;
 exec_args[0] = "sh";
 int i;
 for (i = 1; i < argc; i++)
 {
  exec_args[i] = argv[i];

 }
 execv("/system/bin/sh", exec_args);
 return executionFailure("sh");


 這裡非常關鍵的程式碼是execv! 這裡沒有使用fork,而是直接使用execv,這將導致不會建立新的程序執行sh image,而是直接在當前su的程序空間load並執行sh image。 所以,return executionFailure("sh"); 正常情況下是永遠不會被執行的,執行完execv後,就開始直接sh的程式碼了。

這裡可以看到,由於複用su當前程序來執行sh,使得sh執行的程序的EUID,Real UID都是ROOT,那麼,任何操作都可以執行了。 如果不提升Real UID為Root的話,那麼只要sh執行中通過啟動外部程式的方式來完成操作的話,就會出現許可權問題,因為新啟動的程序只會繼承父程序的Real UID,而不是EUID,那麼新起的程序的Real UID=EUID= parent RealUID != ROOT,那麼某些操作可能有問題。 所以,su把自己的Real UID也提升為ROOT後,則不管啟動後的任何代後的子程序執行操作,都是以ROOT的許可權執行。

RootExplorer通過得到sh流後,就可以通過該流執行任何shell指令了:

  1. try {   
  2. // Preform su to get root privledges
  3.    p = Runtime.getRuntime().exec("su");    
  4. // Attempt to write a file to a root-only
  5.    DataOutputStream os = new DataOutputStream(p.getOutputStream());   
  6.    os.writeBytes("echo \"Do I have root?\" >/system/sd/temporary.txt\n");   
  7. // Close the terminal
  8.    os.writeBytes("exit\n");   
  9.    os.flush();   

通過ps也可以明顯看到su變成了sh,如下,

app_73    1143  103   301620 39944 ffffffff 400194c4 S com.speedsoftware.rootexp
lorer
app_73    1159  1143  764    376   c003e454 4001cf94 S /system/bin/sh
root      1161  1159  772    388   c012e760 4007c578 S sh

這裡的PID=1161的程序其實是su(可以通過打log驗證),當執行execv("/system/bin/sh", exec_args);後,程序名就變成了sh。當然程序EUID不變,仍然是ROOT。

通過cat 程序的proc資訊,我們也可以看到其實RootExplorer自身的UID或者許可權根本沒有被提升(這是和linux上執行su不一樣的地方),

[email protected]:/proc/1143 # cat status
cat status
Name:   re.rootexplorer
State:  S (sleeping)
Tgid:   1143
Pid:    1143
PPid:   103
TracerPid:      0
Uid:    10073(Real)   10073(Effecttive)   10073(saved)   10073
Gid:    10073   10073   10073   10073

而su演變成的sh,卻是具有所有的ROOT UID:

[email protected]:/proc/1161 # cat status
cat status
Name:   sh
State:  S (sleeping)
Tgid:   1161
Pid:    1161
PPid:   1159
TracerPid:      0
Uid:    0       0       0       0
Gid:    0       0       0       0

總結: Android中App授權獲取Root許可權,其實不是App自身的許可權提升了,而是通過具有ROOT許可權的sh流來執行shell命令

相關推薦

Android手機Root授權原理細節解析

首先關於Root的方式,這裡不做詳解,可以有很多漏洞,比如利用uid溢位後歸為0,得到Root許可權,然後操作檔案系統等。 手機Root後,最重要的是,給手機安裝了su程式和superuser apk。 su一般被安裝在/system/xbin 或者 /system/bi

Android 獲取ROOT許可權原理解析

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

Android: 在native中訪問assets解析

lock mp4 cpp sets 這樣的 內容 jniexport opencl href 本文總結在Android Native C++開發中訪問APK中的assets資源的方法 在CMake中添加相關NDK LIB的 依賴 因為我們接下來用到的一些函數實現在NDK庫l

Android系統root破解原理分析

上一篇文章 Android adb 原始碼分析 理論基礎 root破解過程的終極目標是替換掉系統中的su程式。但是要想替換掉系統中su程式本身就是需要root許可權的,怎樣在root破解過程中獲得root許可權,成為我們研究的重點了。下面我們先清點一下我們需要破解系統情況,假設需要破

Android手機root,檢視sqllite資料庫檔案

除錯手機紅米note4 1.自行百度,獲取紅米note4手機root許可權 2.cmd 開啟dos彈窗 3.輸入adb shell  -->  su--->  chmod 7777 /data  ----->  chmod 7777 /data/dat

Linux(Android)系統Root實現原理

root原理 原理概述 1. 系統漏洞方案 主旨思想是查詢系統漏洞,讓本身具有root許可權的程序執行開啟root許可權的操作。 2. 重燒eng boot.img方案 Android版本有user版本和eng版本的區別,其中eng版本可以用於開發除錯,所以本身可以開啟r

手工root你的手機/root原理

本文需要的基礎: 基本windows命令列操作、linux shell操作 =============================== 說到root一個android,很多人連它本身的意思都不清楚 在linux系統中root使用者擁有至同無上的權力,當然也可以把整個系統

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

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

Android:微信授權登入與微信分享解析

前言 在移動網際網路浪潮中,聯網APP已經把單機拍死在沙灘上,很多公司都希望自家應用能夠有一套帳號系統,可是許多使用者卻並不一定買賬:我憑啥註冊你家應用的帳號?微博,微信,QQ幾乎成了每個人手機中的必裝應用,於是微信,微博,QQ說了:來來來,你們都可以用我家的

Android--手機一鍵Root原理分析

Root的由來        什麼是Root?Root本身是指Linux系統的root帳戶,該帳戶擁有整個系統至高無上的權利,系統中的所有物件它都可以操作,對於Android手機使用者來說的Root是指擁有Root許可權,一般情況下,手機廠商出於安全考慮會關閉手機的Root

Android中免Root實現Hook的Dexposed框架實現原理解析以及如何實現應用的熱修復

一、前言 今天我們來看一下阿里的一個開源框架Dexposed,關於這個框架網上已經有很多解析了,但是都是講解原理,而且講的不是很清楚,這裡因為工作中的需要就研究了一下,所以這裡就先講解一下這個框架的原理,然後在通過一個例子來看看他如何使用,最後在用它來實現應用的熱修復問題。 二、知識點準備 首先在講解這個框

Android中免root的hook框架Legend原理解析

一、前言Android中hook框架已經非常多了,最優秀的當屬Xposed和Substrate了,這兩個框架我在之前的文章都詳細介紹過了,不瞭解的同學,可以轉戰這裡:http://www.wjdiank

Android AOP實現原理解析

     前天早晨在公交車上,知乎搜尋了下Android的最新技術,回答還是很多的,我們搞技術的,永遠不能落後,要隨時與市場保持同步,這樣才能跟上市場的步伐。有朋友提到了一個AOP的面向切面的程式設計技術,從這個名字上,大概就可以知道是幹什麼的,也有很多朋友舉例就是在日誌列

Java反射解析(使用、原理、問題、在Android中的應用)

## 前言 今天說Java模組內容:反射。 ## 反射介紹 正常情況下,我們知曉我們要操作的類和物件是什麼,可以直接操作這些物件中的變數和方法,比如一個User類: ```java User user=new User(); user.setName("Bob"); ``` 但是有的場景,我們無法正

Android異步載入解析之開篇瞎扯淡

com des turn pro 能夠 eat launch 卡頓 ring Android異步載入概述 Android異步載入在Android中使用的很廣泛,除了是由於避免在主線程中做網絡操作。更是為了避免在顯示時由於時間太長而造成ANR,添加顯示的流暢性,特別是像Li

Android熱修復技術原理詳解(最新最版本)

總結 核心 桌面圖標 實時 開源 穩定性 安卓 定義 check 本文框架 什麽是熱修復? 熱修復框架分類 技術原理及特點 Tinker框架解析 各框架對比圖 總結 ??通過閱讀本文,你會對熱修復技術有更深的認知,本文會列出各類框架的優缺點以及技術原理,文章末尾簡單描述

Android圖片載入框架最解析(四),玩轉Glide的回撥與監聽(筆記)

參考原文:Android圖片載入框架最全解析(四),玩轉Glide的回撥與監聽 回撥的原始碼實現 的Target物件傳入到GenericRequest當中,而Glide在圖片載入完成之後又會回撥GenericRequest的onResourceReady()方法,onReso

Android圖片載入框架最解析(五),Glide強大的圖片變換功能(筆記)

參考原文:Android圖片載入框架最全解析(五),Glide強大的圖片變換功能 一個問題 百度這張logo圖片的尺寸只有540258畫素,但是我的手機的解析度卻是10801920畫素,而我們將ImageView的寬高設定的都是wrap_content,那麼圖片的寬度應該只有

Android圖片載入框架最解析(三),深入探究Glide的快取機制(筆記)

原文地址:Android圖片載入框架最全解析(三),深入探究Glide的快取機制 筆記: 1.Glide快取簡介 2.快取Key EngineKey 重寫了equals()和hashCode()方法,保證只有傳入EngineKey的所有引數都相同的情況下才認為是

Android圖片載入框架最解析(七),實現帶進度的Glide圖片載入功能(筆記)

參考原文:Android圖片載入框架最全解析(七),實現帶進度的Glide圖片載入功能 擴充套件目標 對Glide進行功能擴充套件,使其支援監聽圖片下載進度的功能 開始 dependencies { compile 'com.github.bumptech.glid