android ROOT 原理

root之所谓称之为root,是因为是使用了root用户权限,或者使用了root用户登陆。
未root时,权限管理是很严格的,很多文件都不能增删改,很多额外功能无法使用。
Root的最大标识便是当程序调用超级权限时,弹出的提示框。

正统的发行版linux中有一个su命令,用于普通用户提权到root。 su本来在linux里是不与其它程序关联

的, 在现在的android中su是与superuser.apk关联的 也就是大家常看到的某某程序在想提权时,弹出的

超级用户授权提示 只要这两个东西在系统里面,那就能让普通程序提权了。

通过执行破解程序,可以临时得到root权限, 在这个权限时把你的su和superuser.apk拷入手机系统 这

样以后就可以随时随地获取root权限,也就是真正地root了你的手机
如果你进行过程序开发,在root过的手机上面获得root权限的代码如下:
 
  1: Process process = Runtime.getRuntime().exec("su");
//创建一个进程执行命令行
   2: DataOutputStream os = new DataOutputStream(process.getOutputStream());
//创建数据输出流
   3: ......
   4: os.writeBytes("exit\n");
//执行linux命令
   5: os.flush();
 //清空缓冲区数据
从上面代码我们可以看到首先要运行su程序,其实root的秘密都在su程序中,默认的su程序只能root和

shell可以用运行su,这个是安全的。如果把这个限制拿掉,就是root破解了!
我们发现su的所有者和所有组都是root,这其实是busybox的软链接,我们查看busybox的属性发现,其设

置了SUID和SGID,并且所有者和所有组都是root。SUID和SGID的作用是什么呢?这样运行busybox的普通

用户,busybox运行过程中获得的是root的有效用户。su程序则是把自己启动一个新的程序,并把自己权

限提升至root(我们前面提到su其实就是busybox,运行期它的权限是root,当然也有权限来提升自己的

权限)。
我们发现su也设置了SUID位,这样普通用户也可以运行su程序,su程序会验证root密码,如果正确su程序

可以把用户权限提高的root(因为其设置SUID位,运行期是root权限,这样其有权限提升自己的权限)。

这样我们就可以看出其实Android系统的破解的根本原理就是替换掉系统中的su程序,因为系统中的默认

su程序需要验证实际用户权限(只有root和 shell用户才有权运行系统默认的su程序,其他用户运行都会

返回错误)。而破解后的su将不检查实际用户权限,这样普通的用户也将可以运行su程序, 也可以通过

su程序将自己的权限提升。

root 破解就是在你系统中植入“木马su”,说它是“木马”一点儿都不为过,假如恶意程序在系统中运

行也可以通过su来提升自己的权限的这样的结果将会是灾难性的。
所以一般情况下root过手机都会有一个SuperUser应用程序来让用户管理允许谁获得root权限,也算是给

系统加了一层保险吧!

我们来介绍一种最传统的ROOT方法。
下面的代码是android系统原版的su中的部分代码,可以看出只允许getuid()为AID_ROOT和AID_SHELL的进

程可以使用su进行登陆。
/* 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;
}

下面我们先清点一下我们需要破解系统情况,假设需要破解的Android系统具备如下条件:
1、可以通过adb连接到设备,一般意味着驱动程序已经安装。       
2、但是adb获得用户权限是shell用户,而不是root。

要想理解root破解过程我们首先需要了解一下adb工具,SDK中包含adb工具,设备端有adbd服务程序后台

运行,为开发机的adb程序提供服务,adbd的权限,决定了adb的权限。具体用户可查看/system/core/adb

下的源码,查看Android.mk你将会发现adb和adbd其实是一份代码,然后通过宏来编译。

查看adb.c的adb_main函数你将会发现adbd中有如下代码:
   1: int adb_main(int is_daemon)
   2: {
   3:     ......
  //执行若干程序后,提升权限为root权限
   4:     property_get("ro.secure", value, "");
   5:     if (strcmp(value, "1") == 0) {
   6:         // don't run as root if ro.secure is set...
   7:         secure = 1;
   8:         ......
   9:     }
  10:
//setgid、setuid决定是否为root权限,一旦secure为1,则降级用户权限。
  11:     if (secure) {
  12:         ......
  13:         setgid(AID_SHELL);
  14:         setuid(AID_SHELL);
  15:         ......
  16:     }
  17: }

从中我们可以看到adbd会检测系统的ro.secure属性,如果该属性为1则将会把自己的用户权限降级成

shell用户。一般设备出厂的时候在/default.prop文件中都会有:
   1: ro.secure=1

这样将会使adbd启动的时候自动降级成shell用户。
然后我们再介绍一下adbd在什么时候启动的呢?答案是在init.rc中配置的系统服务,由init进程启动。

我们查看init.rc中有如下内容:
   1: # adbd is controlled by the persist.service.adb.enable system property
   2: service adbd /sbin/adbd
   3:     disabled

对Android系统属性有了解的朋友将会知道,在init.rc中配置的系统服务启动的时候都是root权限(因为

init进行是root权限,其子程序也是root)。由此我们可以知道在adbd程序在执行:
   1: /* then switch user and group to "shell" */
   2: setgid(AID_SHELL);
   3: setuid(AID_SHELL);
/*setgid和setuid是降级命令,执行此语句之后,用户权限被降级为普通权限,没有root功能*/

代码之前都是root权限,只有执行这两句之后才变成shell权限的。
这样我们就可以引出root破解过程中获得root权限的方法了,那就是让以上面setgid和setuid函数执行失

败,也就是降级失败,那就继续在root权限下面运行了。
这其实利用了一个RageAgainstTheCage漏洞,具体分析请参考《Android adb setuid提权漏洞的分析》和

《RageAgainstTheCage》。

这里做一个简单说明:
1、出厂设置的ro.secure属性为1,则adbd也将运行在shell用户权限下;
2、adb工具创建的进程ratc也运行在shell用户权限下;
3、ratc一直创建子进程(ratc创建的子程序也将会运行在shell用户权限下),紧接着子程序退出,形成

僵尸进程,占用shell用户的进程资源,直到到达shell用户的进程数为RLIMIT_NPROC的时候(包括adbd、

ratc及其子程序),这是ratc将会创建子进程失败。这时候杀掉adbd,adbd进程因为是Android系统服务

,将会被Android系统自动重启,这时候ratc也在竞争产生子程序。在adbd程序执行上面setgid和setuid

之前,ratc已经创建了一个新的子进程,那么shell用户的进程限额已经达到,则adbd进程执行setgid和

setuid将会失败。根据代码我们发现失败之后adbd将会继续执行。这样adbd进程将会运行在root权限下面

了。
4、这时重新用adb连接设备,则adb将会运行在root权限下面了。
(UID 和 GUI溢出返回为0)

如果发现setgid和setuid函数执行失败,则adbd进程异常退出,就把这个漏洞给堵上了。为什么这么多设

备都没有堵上这个漏洞呢?我觉得是设备厂商的策略(不排除傻X的厂商存在哦),虽然知道怎么封堵漏

洞但是就是留着个后门给大家,让第三方给自己定制rom,提高自己系统的易用性。


源生的ROM一般都比较容易ROOT,而定制的手机,电信运营商为了保护自己的ROM不容易被擦写,保护自己

APP不被轻易去除,都会修改内核加锁等措施预防。所以遇到这种情况最好去厂家下载一个源生ROM,利用

SD卡刷升级后,再进行ROOT

root后能干什么?
1、超级用户权限管理器管理APP权限(一般ROOT后自带)
2、备份/恢复系统(在安卓系统中,不需要busybox)(Titanium )
3、截图(ShootMe)
4、任意视觉主题(Metamorph)
5、屏蔽所有广告(Adfree)
6、把你手机变成热点WIFI(4.0以上系统自带此功能)
7、管理进程(Tasker)
8、在安卓系统运行Linux命令(Busybox)
9、刷ROM
10、文件权限操作(Root Explorer)

当uboot(fastboot)被装载后便开始运行,它一般会先检测用户是否按下了某些特别按键,这些特别按键

是uboot编译时预先约定好的,用于进入调试模式。如果用户没有按这些特别的按键,则uboot会从NAND

Flash中装载Liunx内核,装载的地址是在编译uboot时预先约定好的。(安卓内核)
所以现在安卓手机开机时,有三种选择,一是直接进入安卓系统,二是进入线刷(PC机),三是进入

recovery。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值