?Superuser?這是一款可以管理?root?權(quán)限的程序狡耻,可以在?Android?手機(jī)上操作使用儿倒,常常被用來判斷你的手機(jī)是否?root?過,因?yàn)樾薷倪^的?su?版本都是搭配此程序使用的,故一般有?root?過的手機(jī)應(yīng)該都會(huì)裝?Superuser 總結(jié)流程:
設(shè)法拿到?root?權(quán)限?->?更改系統(tǒng)為可讀寫狀態(tài)?->?把修改版的?su?放進(jìn)?/system/bin?->?安裝?Superuser.apk?(擺進(jìn)?/system/app?里)?->?回復(fù)系統(tǒng)狀態(tài)?->?收工Root?方式:手動(dòng)處理使用?Android?SDK?之?adb?程序炮温,透過?adb?push?把檔案移到手機(jī)內(nèi),并透過?adb?shell?連進(jìn)手機(jī)牵舵,后續(xù)動(dòng)作如?root?原理流程透過?SuperOneClick.exe?代勞實(shí)例參考:[Android]?Sony?Ericsson?XPERIA?X8?-?Root?教學(xué)柒啤、關(guān)閉拍照聲音,仔細(xì)看程序的輸出的每一步畸颅,就是上述?root?原理的流程啦透過安裝某個(gè)程序?(*.apk)透過他搶到執(zhí)行權(quán)限担巩,接著把程序內(nèi)偽裝成圖檔的程序執(zhí)行(副檔名皆為?png?或?jpg?類的),如此一來也能搞定透過?update.zip?進(jìn)行系統(tǒng)回復(fù)仔細(xì)去看?script?就可以看到?root?原理的流程喔在此以?Nexus?One?with?Android?2.3.3?為例没炒,在?Ubuntu?10.04?進(jìn)行手動(dòng)?root?流程:以下是以?Nexus?One?with?Android?2.3.3?進(jìn)行測(cè)試的涛癌,不確定是否適用于其他手機(jī)環(huán)境,并且?root?手機(jī)存在風(fēng)險(xiǎn),其自行評(píng)估負(fù)責(zé)拳话,在此僅供個(gè)人筆記使用Step?0:取得?Android?SDK?(此步驟可以跳過先匪,因?yàn)榻酉聛硭璧臋n案都在?GingerBreak.zip?里都有)只需從?Android?SDK?-?http://developer.android.com/sdk/index.html?下載?Android?SDK?后,并更新?SDK?即可弃衍。(執(zhí)行?Android?SDK?需要?Java?執(zhí)行環(huán)境呀非,別忘了抓一下?Java?SDK?啦)若在?Windows?XP?則需要更新?Android?SDK?以取得驅(qū)動(dòng)程序,驅(qū)動(dòng)程序擺在?C:\Program?Files\android-sdk\extras\google\usb_driver\?里镜盯,記得?Nexus?One?有普通模式(Google,?Inc.?Nexus?One)和?fastboot?模式(htc,?Inc.?Android?1.0)岸裙,兩者所使用的驅(qū)動(dòng)程序不同,但資料都在上述的目錄中速缆。Step?1:使用?GingerBreak.zip?為例降允,在?Simple?SDK?setup?and?manual?root?guide?(Windows)?下載里頭有兩個(gè)目錄,一個(gè)是有?adb?程序艺糜,另一個(gè)有?Nexus?One?之?Windows?上的驅(qū)動(dòng)程序拟糕。Step?2:在?Ubuntu?10.04?上,設(shè)定?USB?對(duì)應(yīng)倦踢;在?Windows?上送滞,則是安裝驅(qū)動(dòng)程序(當(dāng)設(shè)備接時(shí),透過指定驅(qū)動(dòng)程序的目錄來安裝)此為?Ubuntu?10.04?的設(shè)置辱挥,若是?Windows?可跳過$?sudo?vim?/etc/udev/rules.d/51-android.rules#?adb?protocol?on?passion?(Nexus?One)SUBSYSTEM=="usb",?ATTR{idVendor}=="18d1",?ATTR{idProduct}=="4e12",?MODE="0600",?OWNER=""#?fastboot?protocol?on?passion?(Nexus?One)SUBSYSTEM=="usb",?ATTR{idVendor}=="0bb4",?ATTR{idProduct}=="0fff",?MODE="0600",?OWNER=""#?adb?protocol?on?crespo?(Nexus?S)SUBSYSTEM=="usb",?ATTR{idVendor}=="18d1",?ATTR{idProduct}=="4e22",?MODE="0600",?OWNER=""#?fastboot?protocol?on?crespo?(Nexus?S)SUBSYSTEM=="usb",?ATTR{idVendor}=="18d1",?ATTR{idProduct}=="4e20",?MODE="0600",?OWNER=""別忘了將??替換掉犁嗅。$?sudo?service?udev?restartStep?3:正式進(jìn)入?root?流程,使用?adb?指令與?Nexus?One?互動(dòng)首先晤碘,將?Nexus?One?啟動(dòng)?USB?Debug?模式褂微,在?[設(shè)定]?->?[應(yīng)用程序]?->?[開發(fā)]?->?[USB?偵錯(cuò)]?后,并使用?micro?usb?與?PC?連接使用?adb?devices?確認(rèn)是否有連到機(jī)器园爷,應(yīng)該要可以看到?HT#####?的東西:
$?adb?devices使用?adb?push?將?GingerBreak.zip?里的?su?宠蚂、?Superuser.apk?、GingerBreak?和?busybox?復(fù)制到?/data/local/tmp?中:
$?adb?/path/GingerBreak/su?/data/local/tmp/
$?adb?/path/GingerBreak/Superuser.apk?/data/local/tmp/
$?adb?/path/GingerBreak/GingerBreak?/data/local/tmp/
$?adb?/path/GingerBreak/busybox?/data/local/tmp/
關(guān)于?busybox?的東西童社,其實(shí)求厕,主因是?Android?手機(jī)內(nèi)的環(huán)境沒有?cp?指令,所以上述作者透過?busybox?來做?copy?的動(dòng)作扰楼。使用?adb?shell?連進(jìn)手機(jī)查看:
$?adb?shell
$?cd?/data/local/tmp
$?ls?-lbusyboxSuperuser.apkGingerBreaksu透過?GingerBreak?取得?root?權(quán)限:
$?cd?/data/local/tmp$?chmod?755?GingerBreak
$?./GingerBreak[**]?Gingerbreak/Honeybomb?--?android?2.[2,3],?3.0?softbreak[**]?(C)?2010-2011?The?Android?Exploid?Crew.?All?rights?reserved.[**]?Kudos?to?jenzi,?the?#brownpants-party,?the?Open?Source?folks,[**]?Zynamics?for?ARM?skills?and?Onkel?Budi[**]?donate?to?7-4-3-C@web.de?if?you?like[**]?Exploit?may?take?a?while![+]?Plain?Gingerbread?mode![+]?Found?system:?0x########?strcmp:?0x########[+]?Found?PT_DYNAMIC?of?size?232?(29?entries)[+]?Found?GOT:?0x########[+]?Using?device?/devices/platform/goldfish_mmc.0
·vold:?0063?GOT?start:?0x########?GOT?end:?0x########
·vold:?0063?idx:?-####?fault?addr:?0x########
[+]?fault?address?in?range?(0x########,idx=-####)[+]?Calculated?idx:?-####
·vold:?0635?idx:?-000####
·vold:?0635?idx:?-000####
·vold:?0635?idx:?-000####
·vold:?0635?idx:?-000####
·vold:?0635?idx:?-000####
·vold:?0635?idx:?-000####
·vold:?0635?idx:?-000####
·vold:?0635?idx:?-000####
·vold:?0635?idx:?-000####
·vold:?0635?idx:?-000####
[!]?dance?forever?my?only?one#當(dāng)看到?"dance?forever?my?only?one"?以及提示符號(hào)從?"$"?換成?"#"?時(shí)呀癣,代表取得"暫時(shí)性"的?root?權(quán)限了。依照?GingerBreak?的執(zhí)行過程弦赖,感覺有點(diǎn)類似透過?Buffer?Overflow?去取的?root?權(quán)限项栏,但細(xì)節(jié)不清楚還需研究。趁著?root?權(quán)限時(shí)蹬竖,將系統(tǒng)設(shè)定為可讀寫:
#?mount.../dev/block/mtdblock3?/system?yaffs2?ro,relatime?0?0...
#?mount?-oremount,rw?/dev/block/mtdblock3?/system
#?mount.../dev/block/mtdblock3?/system?yaffs2?rw,relatime?0?0...將?su?和?Superuser.apk?移到特定位置:
#?cd?/data/local/tmp#?chmod?755?busybox
#?chmod?777?/system/bin?/system/app
#?./busybox?cp?/data/local/tmp/su??/system/bin/
#?./busybox?cp?/data/local/tmp/busybox??/system/bin/
#?./busybox?cp?/data/local/tmp/Superuser.apk?/system/app
#?chown?root?/system/bin/su?/system/bin/busybox
#?chmod?4755?/system/bin/su
#?chmod?755?/system/bin?/system/app回復(fù)系統(tǒng)狀態(tài):
#?mount.../dev/block/mtdblock3?/system?yaffs2?rw,relatime?0?0...
#?mount?-oremount,ro?/dev/block/mtdblock3?/system#?mount.../dev/block/mtdblock3?/system?yaffs2?ro,relatime?0?0...清除垃圾:
#?cd?/data/local/tmp
#?lsbusyboxshboomshSuperuser.apkGingerBreaksu
#?rm?busybox?sh?boomsh?Superuser.apk?GingerBreak?su
#?ls
#
收工沼沈!此時(shí)可以在手機(jī)上看到?Superuser?程序流酬,接著離開?root?環(huán)境、adb?shell:#?exit$?exit別忘了把手機(jī)重開列另,就完成?root?動(dòng)作康吵!以?adb?shell?測(cè)試?root:重開機(jī)后,使用?adb?shell?與手機(jī)連線访递,并使用?su?指令切換成?root晦嵌,可以看見手機(jī)畫面有訊息:$?adb?shell$?su如果沒有動(dòng)作,隨著倒數(shù)時(shí)間一樣會(huì)被拒絕拷姿,而按下拒絕的結(jié)果惭载,那就是熟悉的拒絕句子:su:?permission?denied若按下允許,自然就會(huì)從?"$"?換成?"#"?并取得?root?權(quán)限响巢。
以?app?測(cè)試?root:從?Android?Market?安裝?SSHDroid?這程序描滔,這是?SSH?Server?,把他的預(yù)設(shè)開啟的?port?調(diào)到?22?(<1024也可)踪古,接著選?Start?后含长,可以看到詢問頁面:一樣按下拒絕程序就會(huì)顯示相關(guān)錯(cuò)誤訊息,若按下允許伏穆,那就會(huì)正常執(zhí)行拘泞,并可以看到服務(wù)成功綁在?22?port:接著可以透過?ssh?root@10.0.2.3?的方式登入?Android?手機(jī),此時(shí)就是以?root?權(quán)限執(zhí)行任何動(dòng)作囉枕扫!最后陪腌,來提提上述重要程序的細(xì)節(jié),先來說說?GingerBreak?這只程序烟瞧,總共才?550?行上下诗鸭,但使用的系統(tǒng)觀念很多,我也還不太了解参滴,稍微筆記:復(fù)制一份?/proc/self/exe?和?/system/bin/sh?擺在?/data/local/tmp?中强岸,分別為?boomsh?和?sh依照系統(tǒng)編譯的版本,決定等會(huì)要使用的策略從?/proc/net/netlink?中砾赔,取出執(zhí)行中的?vold?信息(pid)從?/system/libc/libc.so?找尋?system?和?strcmp?相關(guān)的特征從?/system/bin/vold?中蝌箍,找尋相關(guān)信息(還不太懂,晚點(diǎn)再看)從?/etc/vold.fstab过蹂、/system/etc/vold.fstab?中十绑,找尋一個(gè)?dev_mount?裝置聚至,若都找不到改用?/devices/platform/msm_sdcc.2/mmc_host/mmc1?酷勺。透過?socket?不斷寫信息給執(zhí)行中的?vold?(在?vold?src?中可看到?process_config函數(shù)),類似請(qǐng)他掛載裝置扳躬。一直重復(fù)動(dòng)作?7?直到系統(tǒng)出錯(cuò)而拿到?root?權(quán)限脆诉。關(guān)于?GingerBreak?的部分還不太懂甚亭,上述極可能有誤,有空再仔細(xì)查看击胜。接著提提?su?的部分亏狰,原版?su?部份,在?http://android.git.kernel.org/?p=platform/system/extras.git;a=blob;f=su/su.c?可看到?line?60?的片段:/*?Until?we?have?something?better,?only?root?and?the?shell?can?use?su.?*/myuid?=?getuid();if?(myuid?!=?AID_ROOT?&&?myuid?!=?AID_SHELL)?{fprintf(stderr,"su:?uid?%d?not?allowed?to?su\n",?myuid);return?1;}可知當(dāng)執(zhí)行的?uid?必須是?AID_ROOT?或?AID_SHELL?時(shí)偶摔,才能取得權(quán)限暇唾。看看修改后的?su辰斋,在?https://github.com/ChainsDD/su-binary?可取得?su.c策州、su.h?和?activity.cpp?三程序,其中?main?寫在?su.c宫仗,稍微研究一下流程:取得等待使用?root?權(quán)限的程序指令如果運(yùn)行身份是?AID_ROOT?就讓他通過够挂,結(jié)束A從數(shù)據(jù)庫的紀(jì)錄中,判斷該程序指令是否已經(jīng)被設(shè)定成允許或拒絕藕夫,如果數(shù)據(jù)庫里有資料孽糖,那馬上回應(yīng)?allow?或?deny,結(jié)束B如果數(shù)據(jù)庫中沒資料毅贮,接著開啟一個(gè)?socket?連線办悟,并且隨后叫起?Superuser?管理界面,詢問使用者是否要允許或拒絕從?Superuser?界面得知使用者的回應(yīng)滩褥,透過?sockect?回傳誉尖,而?su?將依照結(jié)果給予?allow?或?deny,結(jié)束C上述共有?3?種正常的結(jié)束方式铸题,不正常的結(jié)束就不多提铡恕。因此,這個(gè)?su?程序丢间,整體上須搭配?Superuser.apk?來使用探熔,依需求叫起?com.noshufou.android.su.REQUEST?或?com.noshufou.android.su.NOTIFICATION?出來,并把使用者決定的結(jié)果回傳至?socket?連線烘挫。除此之外诀艰,若使用者勾選記憶目前的設(shè)定,代表以后將默認(rèn)為允許或拒絕饮六,那?Superuser?界面上還會(huì)把允許或拒絕的結(jié)果一同紀(jì)錄到?databases?中其垄。那?root?的安全問題?Q1:惡意程序若直接先改寫數(shù)據(jù)庫資料卤橄,不就可以安然通行绿满?由?su.h?中得知,數(shù)據(jù)庫擺在?/data/data/com.noshufou.android.su/databases/permissions.sqlite?位置窟扑,該路徑上的存取是需要?root?權(quán)限喇颁,因?yàn)閻阂獬绦蜻€沒取得?root?權(quán)限漏健,所以無法變更數(shù)據(jù)庫內(nèi)容。但他也還是可以走?GingerBreak?流程橘霎,透過漏洞取得?root?權(quán)限蔫浆。Q2:只要都透過?Superuser?管理,這樣就十分安全嗎姐叁?不瓦盛。假設(shè)有?A,?B?兩個(gè)程序,其中?A?是界面上看起來超贊超方便的便利程序外潜,但他在使用時(shí)需要?root?權(quán)限谭溉,而使用者也給予并默認(rèn)后,以后他就用?root?權(quán)限一直運(yùn)行橡卤。結(jié)果?B?是惡意程序扮念,雖然他無法拿到?root?權(quán)限,但?A?可以幫他啊(幫?B?更新資料至數(shù)據(jù)庫中)碧库,所以柜与,一只惡意程序無法自行運(yùn)行,但如果有搭配套餐的模式嵌灰,那么?B?就有機(jī)會(huì)取得弄匕。整體上這個(gè)權(quán)限機(jī)制并非十分安全,但對(duì)一般情況來說沽瞭,算是夠了迁匠。Q3:如何安全使用?定期去查看?Superuser?上的紀(jì)錄驹溃,請(qǐng)盡可能搞懂給予?root?權(quán)限的程序到底做了什么事城丧。隨意下載的程序,沒有使用要記得移除豌鹤。結(jié)論:記得去年就看?iOS?app?相關(guān)文章亡哄,隨著?app?的量大,就曾聽到別人提過布疙,以后使用者可能都只使用大廠軟件蚊惯,就像現(xiàn)實(shí)生活中,人會(huì)有追求名牌的行為灵临,這個(gè)現(xiàn)象將導(dǎo)致名牌廠會(huì)越做越好越大截型,在加上商譽(yù)影響,名牌廠就比較不會(huì)有惡意程序的行為儒溉,雖然仍不可保證就絕對(duì)不會(huì)有惡意宦焦。此外,其他無名程序,依舊存在惡意程序的機(jī)會(huì)赶诊,為了降低風(fēng)險(xiǎn)笼平,資安意識(shí)下园骆,就比較會(huì)去用?open?source?或原廠軟件舔痪,以通訊軟件來說,有?MSN锌唾、Mail?等類锄码,與賬號(hào)、隱私有高度相關(guān)性晌涕,雖然原廠不見得做的好或方便操作等滋捶,但基于資安方面,還是建議安裝原廠程序余黎,不然就是使用有用原廠公開?API?的開發(fā)程序重窟。
參考資料:https://github.com/ChainsDD/su-binary/blob/master/su.h
https://github.com/ChainsDD/su-binary/blob/master/su.c
https://github.com/ChainsDD/su-binary/blob/master/activity.cpp
https://github.com/ChainsDD/Superuser/blob/master/AndroidManifest.xml
https://github.com/ChainsDD/Superuser/blob/master/src/com/noshufou/android/su/SuRequest.java
https://github.com/ChainsDD/Superuser/blob/master/src/com/noshufou/android/su/SuNotificationReceiver.java
http://rootzwiki.com/wiki/index.php/Gingerbreak
http://wikifilez.com/Root%20Files/gbreak/GingerBreak.tgz
http://wikifilez.com/Root%20Files/gbreak/GingerBreak-v1.00.apk
http://wikifilez.com/Root%20Files/gbreak/GingerBreak-v1.10.apk
http://android.git.kernel.org/?p=platform/system/vold.git;a=tree
http://android.git.kernel.org/?p=platform/system/vold.git;a=blob;f=main.cpp