由于手上的N7000是欧版,ROM比较干净,自带Google Map/Market等谷歌服务,因此相比行货,root的需求不是那么强烈。不过root仍然是迟早的事情,最重要的一个需求就是伪装运营商。用CMCC的sim卡登录市场,就是一个悲剧,啥都装不了,搜不了。另外系统自带的OTA系统更新功能,需要先向三星注册,如果运营商是CMCC,直接失败。(传说中三月份放出ICS升级,三月之前搞定注册是必须的)
其实在入手N7000前,就已经在论坛下到了root程序了。但是考虑到root权限实在是大,对这种论坛上的东西不太放心,怕夹带私活,加上对神秘的root过程一直不太明白,就没急着去运行,而是分析了一下这堆东西。看明白了真不复杂,其核心就是一个可执行程序,利用了2.2/2.3系统中的一个名为zergRush的漏洞,达到获取root权限的目的。脚本的大致过程是:
- 用adb将zergrush push到/data/local/tmp目录
- 为zergush增加可执行权限,并执行
- zergush将自己复制为boosh,并通过漏洞以root权限执行
boosh
- boosh设置系统属性ro.kernel.qemu=1
- 重启adb,当adb发现
ro.kernel.qemu 属性为1时,以root权限运行
- PC端脚本重新连接上adb时,已经是root权限了
- 将busybox push到
/data/local/tmp,通过busybox的mount功能,将/system remount为可写
- 将busybox安装到/system/xbin
- 将superuser版本的su安装到/system/bin,设置权限为04755
- 安装superuser.apk
由于本人不是安全专业,对缓冲区溢出的原理和试用一窍不通,对作者和分析者只能膜拜了。zergRush的漏洞原理可参考
http://blog.claudxiao.net/2011/10/zergrush/
Root的过程弄清楚了,但是对root包中这几个可执行文件心里可没底。好在发现zergRush竟然是开源的,代码可以直接在github中下载。那么就完全可以使用自己编译的zergrush程序了。而busybox也可以自己编译。至于supserUser.apk和su,虽然免费,但是不开源。最后分析了一下,装这两个程序,主要是为后续需要root权限的apk程序使用。而我所知道的需要SuperUser的程序,主要是用Root Explorer和Market Enabler。前者是收费的,还需要破解,更加危险。其实有了root权限,adb shell+busybox差不多可以替代了,就不需要装了。而Market Enabler,其实功能就是设置几个系统属性,甚至可以用adb shell的setprop来替代。因此大不了superuser.apk我不装了。
分析下来,难的还是编译zergrush,费了不少周折。一开始去研究NDK,还找了本书学习了半天。最后发现路子不对。unix staff需要编译AOSP项目。传说中编译AOSP需要16G内存,25G+6G空间。经过数天的折腾,终于成功编译成功AOSP的模拟器target。之后编译zergrush和busybox就容易了。
zergRush:
源码在
https://github.com/revolutionary/zergRush
在AOSP项目的development下建一个子目录zergrush,将zergRush.c复制进去,建一个Android.mk文件,在当前目录执行mm,可顺利编译出zergrush
busybox:
偷了一把懒,直接用了CyanogenMod版本的busybox,自带Android.mk
源码在
https://github.com/CyanogenMod/android_external_busybox
和上面一样,在development下建一个busybox目录,直接mm,成功编译出busybox。
我的root过程(当时忘记记录了,有些细节可能不太对):
- adb push zergrush /data/local/tmp
- adb shell chmod +x zergrush
- ./zergrush
- adb push busybox /data/local/tmp
- # busybox mount -o remount,rw /system
- # dd if=/data/local/tmp/busybox of=/system/xbin/busybox
- # chmod 04711 busybox
- adb push su /system/bin
- # chmod 04755 su
伪装T Mobile的脚本,在root权限的adb shell中执行:
setprop gsm.sim.operator.numeric "310260"
setprop gsm.operator.numeric "310260"
setprop gsm.sim.operator.iso-country "us"
setprop gsm.operator.iso-country "us"
setprop gsm.sim.operator.alpha "T-Mobile"
setprop gsm.operator.alpha "T-Mobile"
出自:
http://android.modaco.com/topic/304693-market-enabler-workaround/
顺便说一下我手上系统的版本:
Android version
2.3.6
build number
GINGERBREAD.XXKKA