Android手機Root授權原理細節全解析
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指令了:
- try {
- // Preform su to get root privledges
- p = Runtime.getRuntime().exec("su");
- // Attempt to write a file to a root-only
- DataOutputStream os = new DataOutputStream(p.getOutputStream());
- os.writeBytes("echo \"Do I have root?\" >/system/sd/temporary.txt\n");
- // Close the terminal
- os.writeBytes("exit\n");
- 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