首頁 收藏 QQ群
 網(wǎng)站導(dǎo)航

ZNDS智能電視網(wǎng) 推薦當(dāng)貝市場

TV應(yīng)用下載 / 資源分享區(qū)

軟件下載 | 游戲 | 討論 | 電視計算器

綜合交流 / 評測 / 活動區(qū)

交流區(qū) | 測硬件 | 網(wǎng)站活動 | Z幣中心

新手入門 / 進階 / 社區(qū)互助

新手 | 你問我答 | 免費刷機救磚 | ROM固件

查看: 38540|回復(fù): 6
上一主題 下一主題
[軟件教程分享]

【轉(zhuǎn)帖】Android 獲取ROOT權(quán)限原理解析

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2021-10-7 19:52 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式 | 來自重慶
最近在琢磨獲取機頂盒root權(quán)限的問題,發(fā)現(xiàn)了這篇文章,覺得很好,轉(zhuǎn)到此處。

一、概述

本文介紹了android中獲取root權(quán)限的方法以及原理,讓大家對android玩家中常說的“越獄”有一個更深層次的認識。


二、 Root 的介紹

1.       Root 的目的

可以讓我們擁有掌控手機系統(tǒng)的權(quán)限,比如刪除一些system/app下面的無用軟件,更換開關(guān)機鈴聲和動畫,攔截狀態(tài)欄彈出的廣告等。

2.       Root的原理介紹

谷歌的android系統(tǒng)管理員用戶就叫做root,該帳戶擁有整個系統(tǒng)至高無上的權(quán)利,它可以訪問和修改你手機幾乎所有的文件,只有root才具備最高級別的管理權(quán)限。我們root手機的過程也就是獲得手機最高使用權(quán)限的過程。同時為了防止不良軟件也取得root用戶的權(quán)限,當(dāng)我們在root的過程中,還會給系統(tǒng)裝一個程序,用來作為運行提示,由用戶來決定,是否給予最高權(quán)限。這個程序的名字叫做Superuser.apk。當(dāng)某些程序執(zhí)行su指令想取得系統(tǒng)最高權(quán)限的時候,Superuser就會自動啟動,攔截該動作并作出詢問,當(dāng)用戶認為該程序可以安全使用的時候,那么我們就選擇允許,否則,可以禁止該程序繼續(xù)取得最高權(quán)限。Root的過程其實就是把su文件放到/system/bin/ Superuser.apk 放到system/app下面,還需要設(shè)置/system/bin/su可以讓任意用戶可運行,有set uid和set gid的權(quán)限。即要在android機器上運行命令:adb shell chmod 4755 /system/bin/su。而通常,廠商是不會允許我們隨便這么去做的,我們就需要利用操作系統(tǒng)的各種漏洞,來完成這個過程。

特別說明:我們燒機中的Eng版本并沒有Root權(quán)限

3.       Root的方法

從Root的原理我們了解到,root 過程分三步:

a.        adb push su /system/bin

b.        adb push SuperUser.apk /system/app

c.       adb shell chmod 4755 /system/bin/su

若系統(tǒng)是eng版的,做到以上三步,那么我們Root就大功告成,但實際是不行的。為什么呢?原因有三:

1、user版的/system路徑是只讀權(quán)限,不能簡單寫入

2、 chmod需要Root權(quán)才能運行(死循環(huán)了)

3、有些系統(tǒng)在啟動時會自動將su的4755權(quán)限設(shè)成755,甚至直接刪除su

那么針對這種情況,我們怎么辦呢?非常簡單:燒一個eng版本的boot.img就行了

可以用展訊的燒錄工具,或者用fastboot模式從sd卡燒一個boot.img文件即可

至此,我們Root就成功了,可以用R.E(Root Explorer)在根目錄創(chuàng)建和刪除文件。

superuser.apk這個程序是root成功后,專門用來管理root權(quán)限使用的,防止被惡意程序濫用。

我們有兩點疑問:

1.  superuser是怎么知道誰想用root權(quán)限?

2.  superuser是如何把用戶的選擇告訴su程序的?

即superuser和su程序是如何通訊的,他們倆位于不通的時空,一個在java虛擬中,一個在linux的真實進程中。

superuser共有兩個activity: SuperuserActivity 和 SuperuserRequestActivity ,其中SuperuserActivity 主要是用來管理白名單的,就是記住哪個程序已經(jīng)被允許使用root權(quán)限了,省的每次用時都問用戶。

SuperuserRequestActivity 就是用來詢問用戶目前有個程序想使用root權(quán)限,是否允許,是否一直允許,即放入白名單。

這個白名單比較關(guān)鍵,是一個sqlite數(shù)據(jù)庫文件,位置:

/data/data/com.koushikdutta.superuser/databases/superuser.sqlite

上文說過,root的本質(zhì)就是往 /system/bin/ 下放一個su文件,不檢查調(diào)用者權(quán)限的su文件。普通程序可以調(diào)用該su來運行root權(quán)限的命令。superuser.apk中就自帶了一個這樣的su程序。一開始superuser會檢測/system/bin/su是否存在:

File su = new File("/system/bin/su");

// 檢測su文件是否存在,如果不存在則直接返回

if (!su.exists())  {

Toast toast = Toast.makeText(this, "Unable to find /system/bin/su.", Toast.LENGTH_LONG);

toast.show();

return;

}

//如果大小一樣,則認為su文件正確,直接返回了事。

if (su.length() == suStream.available())

{

  suStream.close();

  return;   //

}



// 如果檢測到/system/bin/su 文件存在,但是不對頭,則把自帶的su先寫到"/data/data/com.koushikdutta.superuser/su"

//再寫到/system/bin/su。

byte[] bytes = new byte[suStream.available()];

DataInputStream dis = new DataInputStream(suStream);

dis.readFully(bytes);

FileOutputStream suOutStream = new FileOutputStream("/data/data/com.koushikdutta.superuser/su");

   suOutStream.write(bytes);

   suOutStream.close();



   Process process = Runtime.getRuntime().exec("su");

   DataOutputStream os = new DataOutputStream(process.getOutputStream());

   os.writeBytes("mount -oremount,rw /dev/block/mtdblock3 /system\n");

   os.writeBytes("busybox cp /data/data/com.koushikdutta.superuser/su /system/bin/su\n");

   os.writeBytes("busybox chown 0:0 /system/bin/su\n");

   os.writeBytes("chmod 4755 /system/bin/su\n");

   os.writeBytes("exit\n");

   os.flush();

有進程使用root權(quán)限,superuser是怎么知道的呢,關(guān)鍵是句:

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.");

   原理是am命令,am的用法:

  usage: am [subcommand] [options]

    start an Activity: am start [-D] [-W] <INTENT>

        -D: enable debugging

        -W: wait for launch to complete

    start a Service: am startservice <INTENT>

    send a broadcast Intent: am broadcast <INTENT>

    start an Instrumentation: am instrument [flags] <COMPONENT>

        -r: print raw results (otherwise decode REPORT_KEY_STREAMRESULT)

        -e <NAME> <VALUE>: set argument <NAME> to <VALUE>

        -p <FILE>: write profiling data to <FILE>

        -w: wait for instrumentation to finish before returning

    start profiling: am profile <PROCESS> start <FILE>

    stop profiling: am profile <PROCESS> stop



    <INTENT> specifications include these flags:

        [-a <ACTION>] [-d <DATA_URI>] [-t <MIME_TYPE>]

        [-c <CATEGORY> [-c <CATEGORY>] ...]

        [-e|--es <EXTRA_KEY> <EXTRA_STRING_VALUE> ...]

        [--esn <EXTRA_KEY> ...]

        [--ez <EXTRA_KEY> <EXTRA_BOOLEAN_VALUE> ...]

        [-e|--ei <EXTRA_KEY> <EXTRA_INT_VALUE> ...]

        [-n <COMPONENT>] [-f <FLAGS>]

        [--grant-read-uri-permission] [--grant-write-uri-permission]

        [--debug-log-resolution]

        [--activity-brought-to-front] [--activity-clear-top]

        [--activity-clear-when-task-reset] [--activity-exclude-from-recents]

        [--activity-launched-from-history] [--activity-multiple-task]

        [--activity-no-animation] [--activity-no-history]

        [--activity-no-user-action] [--activity-previous-is-top]

        [--activity-reorder-to-front] [--activity-reset-task-if-needed]

        [--activity-single-top]

        [--receiver-registered-only] [--receiver-replace-pending]

        [<URI>]



還有個疑點,就是su怎么知道用戶是允許root權(quán)限還是反對呢?原來是上面提到的白名單起來作用,superuser把用戶的選擇放入:

/data/data/com.koushikdutta.superuser/databases/superuser.sqlite    數(shù)據(jù)庫中,然后su進程再去讀該數(shù)據(jù)庫來判斷是否允許。


static int checkWhitelist()

{

sqlite3 *db;

int rc = sqlite3_open_v2(DBPATH, &db, SQLITE_OPEN_READWRITE, NULL);

if (!rc)

{

  char *errorMessage;

  char query[1024];

  sprintf(query, "select * from whitelist where _id=%d limit 1;", g_puid);

  struct whitelistCallInfo callInfo;

  callInfo.count = 0;

  callInfo.db = db;

  rc = sqlite3_exec(db, query, whitelistCallback, &callInfo, &errorMessage);

  if (rc != SQLITE_OK)

  {

   sqlite3_close(db);

   return 0;

  }

  sqlite3_close(db);

  return callInfo.count;

}

sqlite3_close(db);

return 0;

}

四、 資源文件的獲取

從上文的源碼地址獲取源代碼,替換系統(tǒng)的system/extras/su/下面的su.c 和Android.mk文件,使用編譯命令 ./mk td28 u adr system/extras/su/ 編譯成功后會生成out/target/product/hsdroid/system/xbin/su 文件,而Superuser.apk就是普通的apk文件,都在源碼地址里面可以下載,下載后倒入到eclipse即可直接運行。



五、 總結(jié)

在閱讀完本文后,可以站在專業(yè)的角度了解root的真正原理,以及有用戶有需求時我們可以幫助其快速的解決問題。

版權(quán)聲明:本文為博主原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接和本聲明。
本文鏈接:(站外鏈接,已失效)

上一篇:求助會編譯固件的大神
下一篇:【轉(zhuǎn)帖】Android root權(quán)限刷機分析
沙發(fā)
發(fā)表于 2021-10-7 21:06 | 只看該作者 | 來自湖北
前來圍觀,看看是什么
回復(fù) 支持 反對

舉報

板凳
發(fā)表于 2021-10-8 14:41 | 只看該作者 | 未知
感謝樓主分享~
回復(fù) 支持 反對

舉報

地板
發(fā)表于 2021-10-8 14:41 | 只看該作者 | 來自浙江
6666666666666666
回復(fù) 支持 反對

舉報

5#
發(fā)表于 2021-10-8 14:41 | 只看該作者 | 未知
過來學(xué)習(xí)
回復(fù) 支持 反對

舉報

6#
發(fā)表于 2021-10-9 12:19 來自ZNDS手機版 | 只看該作者 | 來自廣東
過來學(xué)習(xí)
回復(fù) 支持 反對

舉報

7#
發(fā)表于 2021-11-27 14:35 來自ZNDS手機版 | 只看該作者 | 來自西藏
看不懂  但是乎有些道理
回復(fù) 支持 反對

舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

Archiver|新帖|標簽|軟件|Sitemap|ZNDS智能電視網(wǎng) ( 蘇ICP備2023012627號 )

網(wǎng)絡(luò)信息服務(wù)信用承諾書 | 增值電信業(yè)務(wù)經(jīng)營許可證:蘇B2-20221768 丨 蘇公網(wǎng)安備 32011402011373號

GMT+8, 2025-1-10 18:22 , Processed in 0.067758 second(s), 13 queries , Redis On.

Powered by Discuz!

監(jiān)督舉報:report#znds.com (請將#替換為@)

© 2007-2024 ZNDS.Com

快速回復(fù) 返回頂部 返回列表