android root权限破解分析

许多机友新购来的Android机器没有破解过Root权限,无法使用一些需要高权限的软件,以及进行一些高权限



的操作,其实破解手机Root权限是比较简单



及安全的,破解Root权限的原理就是在手机的/system/bin/或/system/xbin/目录下放置一个可执行文



件“su”,这是一个二进制文件,相当于电脑上的exe文



件,仅仅在系统中置入这个“su”文件是不会给手机的软件或硬件造成任何故障。



下面的代码是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;}


面在Superuser这个android程序中的su不再有上面的一部分,这样任何进程都可以使用su进行登陆了,有一部



分android程序要使用root权限可能的用法类似



于(这个也是Superuser中的一部分代码):


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();

而在上面提到的Superuser和android程序中的su源码中都有这部分代码:


if(setgid(gid) || setuid(uid)) {fprintf(stderr,"su: permission denied\n");return 1;}


看上去这里就是进行权限切换的地方了。面普通用户要能使用su,su的权限要是这样:


-rwsr-xr-x. 1 root root 34904 11月 3 2010 /bin/su


这个和电脑版的su上是一样的。

从出上面的分析可以认为破解android的root权限的实质是:在系统中加入一个任何用户都可能用于登陆的su命



令。当然这首先要取得root权限才能做



到。在z4root这个android下的破解android的root权限的程序中有一个rageagainstthecage,可能就是设法得


到root权限的程序。



第二篇文章:

如果你进行过程序开发,在root过的手机上面获得root权限的代码如下:
Process process = Runtime.getRuntime().exec("su");DataOutputStream os = new DataOutputStream(process.getOutputStream());......os.writeBytes("exit\n");os.flush();

从上面代码我们可以看到首先要运行su程序,其实root的秘密都在su程序中,《android root权限破解分析》中讲到Android系统默认的su程序只能root和shell可以用运行su,这个是安全的。如果把这个限制拿掉,就是root破解了!

下面我们仔细分析一下程序是怎样获得root权限的,如果对Linux的su命令熟悉的朋友可能知道su程序都设置SUID位,我们查看一下我的手机(已经root破解)上的su权限设置,

我们发现su的所有者和所有组都是root,是其实是busybox的软链接,我们查看busybox的属性发现,其设置了SUID和SGID,并且所有者和所有组都是root。SUID和SGID的作用是什么呢?如果你不太清楚,请参考《Linux进程的实际用户ID和有效用户ID》,这样运行busybox的普通用户,busybox运行过程中获得的是root的有效用户。su程序则是把自己启动一个新的程序,并把自己权限提升至root(我们前面提到su其实就是busybox,运行期它的权限是root,当然也有权限来提升自己的权限)。

再强调一下不光root手机上su需要设置SUID,所有的Linux系统上的su程序都需要设置SUID位。请参考一下UC服务器的su的权限情况:

我们发现su也设置了SUID位,这样普通用户也可以运行su程序,su程序会验证root密码,如果正确su程序可以把用户权限提高的root(因为其设置SUID位,运行期是root权限,这样其有权限提升自己的权限)。

这样我们就可以看出其实Android系统的破解的根本原理就是替换掉系统中的su程序,因为系统中的默认su程序需要验证实际用户权限(只有root和 shell用户才有权运行系统默认的su程序,其他用户运行都会返回错误)。而破解后的su将不检查实际用户权限,这样普通的用户也将可以运行su程序, 也可以通过su程序将自己的权限提升。

到这里大家对root破解不感到神秘了吧。root破解没有利用什么Linux内核漏洞(Linux内核不可能有这么大的漏洞存在),可以理解成root 破解就是在你系统中植入“木马su”,说它是“木马”一点儿都不为过,假如恶意程序在系统中运行也可以通过su来提升自己的权限的这样的结果将会是灾难性 的。所以一般情况下root过手机都会有一个SuperUser应用程序来让用户管理允许谁获得root权限,也算是给系统加了一层保险吧!

通过上文《Android系统root破解原理分析》 的介绍大家应该明白了root破解过程的终极目标是替换掉系统中的su程序。但是要想替换掉系统中su程序本身就是需要root权限的,怎样在root破 解过程中获得root权限,成为我们研究的重点了。下面我们先清点一下我们需要破解系统情况,假设需要破解的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中有如下代码:

int adb_main(int is_daemon){    ......    property_get("ro.secure", value, "");    if (strcmp(value, "1") == 0) {        // don't run as root if ro.secure is set...        secure = 1;        ......    }    if (secure) {        ......

从中我们可以看到adbd会检测系统的ro.secure属性,如果该属性为1则将会把自己的用户权限降级成shell用户。一般设备出厂的时候在/default.prop文件中都会有:

ro.secure=1

这样将会使adbd启动的时候自动降级成shell用户。

然后我们再介绍一下adbd在什么时候启动的呢?答案是在init.rc中配置的系统服务,由init进程启动。我们查看init.rc中有如下内容:

# adbd is controlled by the persist.service.adb.enable system propertyservice adbd /sbin/adbd   disabled

对Android属性系统少有了解的朋友将会知道,在init.rc中配置的系统服务启动的时候都是root权限(因为init进行是root权限,其子程序也是root)。由此我们可以知道在adbd程序在执行:

/* then switch user and group to "shell" */setgid(AID_SHELL);setuid(AID_SHELL);

代码之前都是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权限下面了。3、这是重新用adb连接设备,则adb将会运行在root权限下面了。

通过上面的介绍我们发现利用RageAgainstTheCage漏洞,可以使adbd获得root权限,也就是adb获得了root权限。拿到root权限剩下的问题就好办了,复制破解之后的su程序到系统中(见上文《Android系统root破解原理分析》的介绍),都是没有什么技术含量的事情了。

其实堵住adbd的这个漏洞其实也挺简单的:

/* then switch user and group to "shell" */if (setgid(AID_SHELL) != 0) {    exit(1);}if (setuid(AID_SHELL) != 0) {    exit(1);}

如果发现setgid和setuid函数执行失败,则adbd进程异常退出,就把这个漏洞给堵上了。为什么这么多设 备都没有堵上这个漏洞呢?我觉得是设备厂商的策略(不排除傻X的厂商存在哦),虽然知道怎么封堵漏洞但是就是留着个后门给大家,让第三方给自己定制 rom,提高自己系统的易用性。

至此我们把root的过程和root之后系统情况都进行了介绍,相信你也不会对root破解再神秘了吧!

以上两篇文章分别转自:
http://hi.baidu.com/mylzol/item/2c8af608912406ebf45ba694
http://www.oschina.net/question/12_58383

Android 操作系统 获取Root权限 原理解析相关推荐

  1. Android 获取ROOT权限原理解析

    一. 概述 本文介绍了android中获取root权限的方法以及原理,让大家对android玩家中常说的"越狱"有一个更深层次的认识. 二. Root的介绍 1.       Ro ...

  2. android编译系统root权限,Android系统获取ROOT权限后能做些什么?

    Android的设备Root了以后可以做些什么特别的操作呢?今天刷机之家小编为大家简述Root以后最实用的几种用途. 在了解Root的用途之前,我们先来简单看看Android的Root是什么. And ...

  3. android 手机获取 root 权限

    为了让android 手机获取root权限,需要经历以下几个步骤. 手机解锁 现在大部分的手机在出厂时都锁定了bootloader,需要在官网上申请解锁,以小米为例,解锁网址.解锁的具体教程不在此详述 ...

  4. Android程序获取root权限问题的最终解决与分析

          为了方便给出上一篇上一篇地址:  http://blog.csdn.net/up1up2up3/article/details/7380651,调了几天这个root权限获取问题终于搞定了, ...

  5. android apk获取root权限执行相应的操作 demo调试

    在apk中,有时候需要root权限,例如通过apk更新系统库等system的文件等,避免升级固件,或者在apk中需要直接访问某些设备等.下面是在apk中获取root权限的方法,前提是设备已经root过 ...

  6. android 执行shell root权限,Android App 获取root权限后,执行shell命令

    背景: 做一个应用,需求是获取root权限后可以停用/启用某些应用,包括系统应用!停用的应用将不在设置-->应用中展示,大部分系统自带的桌面应该也不会再显示! 如果是用menifest.xml中 ...

  7. Android 获取ROOT权限原理介绍和签名验证原理及反编译学习

     Root 的介绍 1.       Root 的目的 可以让我们拥有掌控手机系统的权限,比如删除一些system/app下面的无用软件,更换开关机铃声和动画,拦截状态栏弹出的广告等. 2.      ...

  8. Android 文件系统获取root权限和重新挂载根目录为可读写

    http://blog.chinaunix.net/uid-24856020-id-3389654.html 最近在移植android2.3到s3c6410平台,文件系统成功挂载后,在超级终端执行一些 ...

  9. android 模拟器获取root权限

    启动一个模拟器,开始-运行-输入cmd,打开dos,依次输入 adb shell mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system ...

最新文章

  1. Spring AOP与IOC以及自定义注解
  2. easyui datagrid 表头固定(垂直滚动条)、列固定(水平滚动条)
  3. 云上如何做冷热数据分离
  4. 小说中人称转换作用_长篇儿童小说《合欢》:一树红绒落马缨
  5. eclipse创建第一个golang项目
  6. 企业如何预防数据外泄?
  7. 若何在嵌入式Linux及下建造QPF字库
  8. javascript--方法(函数)
  9. 怪事:两台linux的samba共享目录,一个能访问一个不能访问
  10. 【边缘检测】基于matlab蚁群算法图像边缘检测【含Matlab源码 1189期】
  11. 控制系统状态空间表达式的解(3)——求解线性定常系统零状态响应
  12. 电脑课学生端密码查看
  13. 在抖音追剧要付费了,微短剧能成字节新财富密码吗?
  14. 美通企业日报 | 拜耳健康消费品中国研发中心开幕;TCL上半年电视机销量稳居全球第二...
  15. Uniapp微信小程序视频全屏播放功能极简实现法
  16. BZOJ2069 POI2004ZAW(最短路)
  17. 浅谈PCA到PCANet
  18. 百度SEO花生壳动态域名解析软件 v5.3.0.34889
  19. 京东商城的商品分类代码
  20. vscode 函数定义跳转与回退

热门文章

  1. android p 华为p10,华为P10测评:市场上真心没有比华为更强劲的安卓机了
  2. 盘点:阿里云上8款免费的开发者工具
  3. 达达京东java面试_京东Java面试被虐总结
  4. 基于VS2019 C++的跨平台(Linux)开发(1.2.2)——设备管理及文件IO
  5. LaTeX 改变表格序号 1, 2(a), 2(b), 3
  6. httpd服务器的守护程序级别如何修改,apachectl 和 httpd的关系
  7. A - 卿学姐与公主(线段树+单点更新+区间极值)
  8. 百无聊赖时对java类初始化先后顺序的测试
  9. AutoEventWireup属性的确切含义
  10. 小程序web-view跳转H5页面,H5页面通过事件返回小程序页面