获取root权限及破解原理分析

 

2012-03-18 17:58:45|  分类: android |字号 订阅

现在Android系统的root破解基本上成为大家的必备技能!网上也有很多中一键破解的软件,使root破解越来越容易。但是你思考过root破解的原理吗?root破解的本质是什么呢?难道是利用了Linux kernal的漏洞吗?本文将简单对root的破解原理进行分析。

网上很多root教程所使用的都是rageagainstthecage程序,今天下载了rageagainstthecage.c源程序看了一下,大致理解了获取root权限的基本过程和原理。
首先简单解释一下什么是root过的手机(Android系统),所谓root过的手机就是我们可以以root的权限运行各种程序,进而完全控制系统。
因为官方系统基于安全原因,默认程序的运行都是以非root用户运行的,包括adbd进程。adbd进程是手机中运行的一个守护进程,他负责解释并运行PC传送过来的命令,
该进程由init进程创建,但是创建后自身通过调用setuid()系统调用设置运行的用户为shell用户。所以我们在手机中执行ps命令看到的adbd进程都是以shell用户身份运行的。
获取root权限的关键是想办法让adbd进程重新以root身份运行,这样通过电脑传送过来的命令也就能够以root身份运行了。
众所周知,Android系统用的是linux的内核,在linux中,对于用户最大允许运行的进程数有限制,所以rageagainstthecage程序在运行后先结束当前的adbd进程,
然后init进程会重新启动新的adbd进程。但是rageagainstthecage程序同时会创建大量的子进程,这些子进程默认都是shell用户身份,从而使得shell用户拥有的进程数达到最大值,这就使得新启动的adbd进程调用setuid()系统调用失败,因为shell用户的进程数已满,adbd无法把自己运行的用户设置为shell用户,从而保持在刚创建时的root用户身份中运行。
这时候我们在电脑中执行adb shell命令时发现已经进入root shell了。
从上面的分析我们可以知道:要能够root成功必须满足两点:
1、系统必须已经设置每个用户允许运行的最大进程数(官方的Android2.1、2.2好像都已经设置,2.3的不是很清楚)。
2、必须要在新启动的adbd进程调用setuid()系统调用前创建足够多的进程数。但是因为系统进程调度的随机性,并不能保证每一次都能满足这个要求,这也就是为什么网上说多试几次就会成功。
执行完rageagainstthecage程序后其实已经获得了root权限,但是每次这么做非常麻烦,所以还应该设置一些永久性的东西,主要是上传几个程序到系统并设置相应权限,这几个程序分别是:
su--使得非root用户能够以root身份运行程序。
busybox--系统工具包,包含很多的系统使用工具。
SuperUser.apk--授权管理软件包,为需要root身份运行的程序授权。

网上下的一键root包其实也就是把上面的工作制作成脚本让它自动执行罢了。

 

网上有一篇文章已经对root破解的基本原理进行了简单介绍,大家可以先参考一下《》,本文只能说对root原理进行了方向性的描述,但是在一些具体的方面没有描述清楚。本文将会对其进行一些必要的扩展和补充。

     如果你进行过程序开发,在root过的手机上面获得root权限的代码如下:

   1: Process process = Runtime.getRuntime().exec("su");
   2: DataOutputStream os = new DataOutputStream(process.getOutputStream());
   3: ......
   4: os.writeBytes("exit\n");
   5: os.flush();

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

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

获取root权限及破解原理分析 - KidGeek - 等待机遇

      我们发现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的权限情况:

获取root权限及破解原理分析 - KidGeek - 等待机遇

     我们发现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的应用程序入口肯定是Java程序。应用程序的启动者是由系统临时根据Androidmanifest.xml中定义的权限而创建的临时用户。而不像linux那样是使用登陆者的身份启动,从而使得进程具有登陆者的所有权限。这也是Android的安全机制之一。新的权限机制也带来新的问题,Android给应用程序的权限是按功能来分,java虽然可以访问文件系统。但由于应用程序本身是临时用户启动,这个临时用户权限十分有限。因此诞生了<越狱/root机器>这样的产物其实root机器不是真正能让你的应用程序具有ro

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值