读书人

『转从墙外』 [Android] Root 原理手

发布时间: 2012-07-01 13:15:00 作者: rapoo

『转自墙外』 [Android] Root 原理手 Root 程 @ Nexus One、Android 2.3.3、Ubuntu 10.04
前 SE X8 with Android 2.1 做一次 root ([Android] Sony Ericsson XPERIA X8 - Root 教、拍照音),使用的是 SuperOneClick,需抓一下手程式、接好 micro usb ,行程式按下按,整程就束了。後我始研究到底 root 做了啥事,因我得好像只要把 su 程式 Android 系中 ( /system/bin 和 /system/xbin ) ,似乎就完成作了??

番研究後,追了一些文章,其中看到篇得仔的:Simple SDK setup and manual root guide (Windows),也算正常 work 啦,不有一些程不一,就手一下好了。除此之外,篇的操作,稍微明也修正一些念:

重灌:

在 [Android] 第一次使用手 + 清乾 + 重系 @ Nexus One 中,自以透 "重原定" 和 "Recovery from update.zip" 可以回到最乾的系,事後我我把手 root 後安 Superuser 後,上述者不移除 Superuser 程式,也我想起看到 update.zip 的 script 事情,是的,上述者只能依照 script 去做事,所以 script 上提到的就不做。所以真正要清乾系的方式,是要透 flashboot 去重刷整系,如 [Android] Building AOSP & Back to Original Shipping Image @ Nexus One 、Ubuntu 10.04 x86 & Mac OSX 10.6.7 篇中所提到,完整清除料刷回原等作。也就很清楚啥想要回到原需要 "原 ROM" 。

Root 原理:

整流程目的是修改後的 su 指令 /system/bin 目中(有的提到 /system/xbin),然而,系是 Read Only 的,所以想法取得 root 限,接著系弄成 Writable 後,把修改的 su 好位置,除此之外,是 Superuser.apk /system/app , /system/app 目行作,等於安一套,同理把程式移出去就代表移除,例子可考 [Android] Sony Ericsson XPERIA X8 - 除建程式。而 Superuser 是一款可以管理 root 限的程式,可以在 Android 手上操作使用,常常被用判你的手是否 root ,因修改的 su 版本都是搭配此程式使用的,故一般有 root 的手都 Superuser

流程:

法拿到 root 限 -> 更改系可 -> 把修改版的 su 放 /system/bin -> 安 Superuser.apk ( /system/app ) -> 回系 -> 收工

Root 方式:

手理

使用 Android SDK 之 adb 程式,透 adb push 把案移到手,透 adb shell 手,後作如 root 原理流程

透 SuperOneClick.exe 代

例考:[Android] Sony Ericsson XPERIA X8 - Root 教、拍照音,仔看程式的出的每一步,就是上述 root 原理的流程啦

透安某程式 (*.apk)

透他到行限,接著把程式成的程式行(副名皆 png 或 jpg 的),如此一也能搞定

透 update.zip 行系回

仔去看 script 就可以看到 root 原理的流程喔

在此以 Nexus One with Android 2.3.3 例,在 Ubuntu 10.04 行手 root 流程:

以下是以 Nexus One with Android 2.3.3 行的,不定是否用於其他手境,且 root 手存在,其自行估,在此供人使用

Step 0:取得 Android SDK (此步可以跳,因接下所需的案都在 GingerBreak.zip 都有)

只需 Android SDK - http://developer.android.com/sdk/index.html 下 Android SDK 後,更新 SDK 即可。(行 Android SDK 需要 Java 行境,忘了抓一下 Java SDK 啦)

若在 Windows XP 需要更新 Android SDK 以取得程式,程式在 C:\Program Files\android-sdk\extras\google\usb_driver\ ,得 Nexus One 有普通模式(Google, Inc. Nexus One)和 fastboot 模式(htc, Inc. Android 1.0),者所使用的程式不同,但料都在上述的目中。

Step 1:使用 GingerBreak.zip 例,在 Simple SDK setup and manual root guide (Windows) 下

有目,一是有 adb 程式,另一有 Nexus One 之 Windows 上的程式。

Step 2:在 Ubuntu 10.04 上,定 USB ;在 Windows 上,是安程式(接,透指定程式的目安)

此 Ubuntu 10.04 的置,若是 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="<username>"
# fastboot protocol on passion (Nexus One)
SUBSYSTEM=="usb", ATTR{idVendor}=="0bb4", ATTR{idProduct}=="0fff", MODE="0600", OWNER="<username>"
# adb protocol on crespo (Nexus S)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e22", MODE="0600", OWNER="<username>"
# fastboot protocol on crespo (Nexus S)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e20", MODE="0600", OWNER="<username>"

忘了 <username> 替掉。

$ sudo service udev restart

Step 3:正式入 root 流程,使用 adb 指令 Nexus One 互

首先, Nexus One USB Debug 模式,在 [定] -> [用程式] -> [] -> [USB ] 後,使用 micro usb PC 接

使用 adb devices 是否有到器,要可以看到 HT##### 的西:

$ adb devices

使用 adb push GingerBreak.zip 的 su 、 Superuser.apk 、GingerBreak 和 busybox 到 /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/

於 busybox 的西,其,主因是 Android 手的境有 cp 指令,所以上述作者透 busybox 做 copy 的作。

使用 adb shell 手查看:

$ adb shell
$ cd /data/local/tmp
$ ls -l
busybox
Superuser.apk
GingerBreak
su

透 GingerBreak 取得 root 限:

$ 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
#

看到 "dance forever my only one" 以及提示符 "$" 成 "#" ,代表取得"性"的 root 限了。依照 GingerBreak 的行程,感有似透 Buffer Overflow 去取的 root 限,但不清楚需研究。

趁著 root 限,系定可:

# 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

回系:

# 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
# ls
busybox
sh
boomsh
Superuser.apk
GingerBreak
su
# rm busybox sh boomsh Superuser.apk GingerBreak su
# ls
#

收工!此可以在手上看到 Superuser 程式,接著 root 境、adb shell:

# exit
$ exit

忘了把手重,就完成 root 作!

以 adb shell root:

重後,使用 adb shell 手,使用 su 指令切成 root,可以看手面有息:

$ adb shell
$ su



如果有作,著倒一被拒,而按下拒的果,那就是熟悉的拒句子:

su: permission denied

若按下允,自然就 "$" 成 "#" 取得 root 限。

以 app root:

Android Market 安 SSHDroid 程式,是 SSH Server ,把他的的 port 到 22 (<1024也可),接著 Start 後,可以看到面:



一按下拒程式就示相息,若按下允,那就正常行,可以看到服成功在 22 port:



接著可以透 ssh root@10.0.2.3 的方式登入 Android 手,此就是以 root 限行任何作!





最後,提提上述重要程式的,先 GingerBreak 程式,共才 550 行上下,但使用的系念很多,我也不太了解,稍微:

一份 /proc/self/exe 和 /system/bin/sh 在 /data/local/tmp 中,分 boomsh 和 sh
依照系的版本,定等要使用的策略
/proc/net/netlink 中,取出行中的 vold (pid)
/system/libc/libc.so 找 system 和 strcmp 相的特徵
/system/bin/vold 中,找相(不太懂,晚再看)
/etc/vold.fstab、/system/etc/vold.fstab 中,找一 dev_mount 置,若都找不到改用 /devices/platform/msm_sdcc.2/mmc_host/mmc1 。
透 socket 不行中的 vold (在 vold src 中可看到 process_config函),似他置。
一直重作 7 直到系出而拿到 root 限。
於 GingerBreak 的部分不太懂,上述可能有,有空再仔查看。

接著提提 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;
}

可知行的 uid 必是 AID_ROOT 或 AID_SHELL ,才能取得限。看看修改後的 su,在 https://github.com/ChainsDD/su-binary 可取得 su.c、su.h 和 activity.cpp 三程式,其中 main 在 su.c,稍微研究一下流程:

取得等待使用 root 限的程式指令
如果行身份是 AID_ROOT 就他通,束A
料的中,判程式指令是否已被定成允或拒,如果料有料,那上回 allow 或 deny,束B
如果料中料,接著一 socket ,且後叫起 Superuser 管理介面,使用者是否要允或拒
Superuser 介面得知使用者的回,透 sockect 回,而 su 依照果予 allow 或 deny,束C
上述共有 3 正常的束方式,不正常的束就不多提。因此, su 程式,整上搭配 Superuser.apk 使用,依需求叫起 com.noshufou.android.su.REQUEST 或 com.noshufou.android.su.NOTIFICATION 出,把使用者定的果回至 socket 。除此之外,若使用者勾目前的定,代表以後默允或拒,那 Superuser 介面上把允或拒的果一同到 databases 中。

那 root 的安全?

Q1:意程式若直接先改料料,不就可以安然通行?

由 su.h 中得知,料在 /data/data/com.noshufou.android.su/databases/permissions.sqlite 位置,路上的存取是需要 root 限,因意程式取得 root 限,所以法更料容。但他也是可以走 GingerBreak 流程,透漏洞取得 root 限。

Q2:只要都透 Superuser 管理,就十分安全?

不。假有 A, B 程式,其中 A 是介面上看起超超方便的便利程式,但他在使用需要 root 限,而使用者也予默後,以後他就用 root 限一直行。果 B 是意程式,然他法拿到 root 限,但 A 可以他啊( B 更新料至料中),所以,一意程式法自行行,但如果有搭配套餐的模式,那 B 就有取得。整上限制非十分安全,但一般情,算是了。

Q3:如何安全使用?

定期去查看 Superuser 上的,可能搞懂予 root 限的程式到底做了什事。意下的程式,有使用要得移除。



得去年就看 iOS app 相文章,著 app 的量大,就曾到人提,以後使用者可能都只使用大,就像生活中,人有追求名牌的行,象致名牌越做越好越大,在加上商影,名牌就比不有意程式的行,然仍不可保就不有意。此外,其他名程式,依存在意程式的,了降低,安意下,就比去用 open source 或原,以通,有 MSN、Mail 等,、私有高度相性,然原不得做的好或方便操作等,但基於安方面,是建安原程式,不然就是使用有用原公 API 的程式。

考料:

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

读书人网 >Android

热点推荐