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

 

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

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

网上很是多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成功必须知足两点:
一、系统必须已经设置每个用户赞成执行的最大进程数(官方的Android2.一、2.2好像都已经设置,2.3的不是很是清楚)。
二、必须要在新启动的adbd进程调用setuid()系统调用前建立足够多的进程数。但是因为系统进程调度的随机性,并不能保证每一次都能知足这个要求,这也就是为何网上说多试几回就会成功。
运行完rageagainstthecage程序后事实上已经得到了root权限,但是每次这么作很麻烦,因此还应该设置一些永久性的东西,主要是上传几个程序到系统并设置对应权限,这几个程序各自是:
su--使得非root用户能够以root身份执行程序。
busybox--系统工具包,包括很是多的系统使用工具。
SuperUser.apk--受权管理软件包,为需要root身份执行的程序受权。

网上下的一键root包事实上也就是把上面的工做制做成脚本让它本身主动运行罢了。
java

 

网上有一篇文章已经对root破解的基本原理进行了简介,你们可以先參考一下《》,本文仅仅能说对root原理进行了方向性的描写叙述,但是在一些详细的方面没有描写叙述清楚。本文将会对其进行一些必要的扩展和补充。linux

     假设你进行过程序开发,在root过的手机上面得到root权限的代码例如如下:android

   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破解了!ios

     如下咱们细致分析一下程序是如何得到root权限的,假设对Linux的su命令熟悉的朋友可能知道su程序都设置SUID位,咱们查看一下个人手机(已经root破解)上的su权限设置,c++

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

      咱们发现su的所有者和所有组都是root,是事实上是busybox的软连接,咱们查看busybox的属性发现,其设置了SUID和SGID,并且所有者和所有组都是root。SUID和SGID的做用是什么呢?假设你不太清楚,请參考《Linux进程的实际用户ID和有效用户ID》,这样执行busybox的普通用户,busybox执行过程当中得到的是root的有效用户。su程序则是把本身启动一个新的程序,并把本身权限提高至root(咱们前面提到su事实上就是busybox,执行期它的权限是root,固然也有权限来提高本身的权限)。web

     再强调一下不光root手机上su需要设置SUID,所有的Linux系统上的su程序都需要设置SUID位。请參考一下UCserver的su的权限状况:sql

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

     咱们发现su也设置了SUID位,这样普通用户也可以执行su程序,su程序会验证rootpassword,假设正确su程序可以把用户权限提升的root(因为其设置SUID位,执行期是root权限,这样其有权限提高本身的权限)。shell

     这样咱们就可以看出事实上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机器不是真正能让你的应用程序具备root权限。它原理就跟linux下的像sudo这种命令。在系统的bin文件夹下放个su程序并属主是root并有suid权限。则经过su运行的命令都具备Android root权限。
Su的源码网上也有,有兴趣的同窗去google下。
固然使用暂时用户权限想把su拷贝的/system/bin文件夹并改属性并不是一件easy的事情。这里用到2个工具跟2个命令。工具就是busybox。不熟悉的同窗可以去网上google下。这个太有名了我就不说了。把busybox复制到你有权限訪问的文件夹而后给他赋予4755权限,你就可以用它作很是多事了。固然busybox仅仅能不能提高权限,真正提高权限的是ratc这个程序,这个程序中一键root包里面可以找到,做用是rooting在adb的shell。
网上介绍Ratc的文章很少,它是rage against the cage 的缩写。是真正的提高权限的破解程序。尽管我没看过源码,但预计是利用adb源码部份内容来实现的,原理预计跟模拟器使用adb shell登录可以得到root shell差点儿相同。(因为它执行需要adb链接才会成功)。使用busybox前先执行ratc,这样执行busybox的UID将是0,也就是root。首先把system文件夹改为可读性的:busybox mount -o remount,rw /system,固然你还不能改如下的文件,因为system下文件的所有者都不是你。但你可以偷梁换柱把system下的文件夹给换掉。使用命令Busybox mount -t tmpfs none /system/xbin,呵呵这下xbin文件夹你随便写了。
将su跟busybox弄过去cp /data/data/xxx/su /system/xbin。而后赋权限chmod 4755 /system/xbin/su。/而后使文件夹生效busybox --install -s /system/xbin,
别忘善后busybox mount -o remount,ro /system去掉system可写。这样仅仅是暂时的,仅仅能用su跟busybox能运行一些原来系统没有权限运行的命令而已。当系统从新启动后/system/xbin又变为原来的文件。真正要改系统的话需要本身写内核代码(至关于windows的驱动程序)。内核文件拥有所有权限。使用busybox命令insmod /data/data/xxx/xxx.ko装载内核文件,你想干吗就可以干吗了。
固然咱们不是搞破解的不是必需去改别人的机器,咱们仅仅是想让本身应用程序具备root权限而已。因此暂时的su就可以了。咱们用c++写一个可运行文件。使用socket可以跟java的程序通信。而后将需要使用root权限才干运行的代码放在c++程序里,而后java程序中建立新的su进程,将c++程序带全路径做为參数1。启动后就可以经过socket调用c++函数去运行你想干的事了。
最后程序运行完了别忘了善后busybox umount /system/xbin。
最后说说要注意的事情,假设机器已经拥有Android root权限的话就不需要作这些事情了,但root过的机器都有装有个权限管理的程序。会弹出对话框。但这个程序管理能力有限,假设不想让他弹出的话。或许可以经过改su文件名称来解决。有兴趣的同窗最好仍是试试。

SuperOneClick 获取 Root 权限的原理

转贴自:http://blog.csdn.net/liwei_cmg/article/details/6313944

1、前言

通过笔者本身測试与分析,得出结论:因此Android手机获取Root权限,最直观
最有效,最简便的就是SuperOneClick方法!
与i9000基带版本号的什么JPE,JPD,JP8等等,没有关系
与i9000Android软件版本号的什么2.0,2.1,2.2等等,没有关系
与详细的什么Android手机也没有关系
管你是三星的,仍是MOTO的,仍是HTC……

究竟与什么有关呢,我理解是Linux的内核版本号!固然普通用户根本没必要关心!
兴许的文章会提到有关破解Root的底层概念,固然也超出普通用户的理解范围。

这里,我仅仅想介绍一下SuperOneClick获取Root权限的简单原理!

2、提示

有关Root权限的获取方法可參考
《Android应用.三星i9000系列(3).无需刷机轻松获取Root权限》
本系列文章:http://blog.csdn.net/liwei_cmg/category/241839.aspx
3、原理简单介绍

咱们已经知道adb(Android Debug Bridge)这个概念,不管是Moto的,仍是Samsung
的,Android手机经过USB链接电脑后,安装好驱动,在设备管理器里都会看到Android
Composite ADB Interface这种东东。SuperOneClick就是调用的adb这种接口。
相同豌豆荚,91手机助手这种软件也是使用了adb。

关于Android手机USB链接电脑的相关内容,可參考:
《Android应用.三星i9000系列(1).版本号选择与USB链接电脑》

4、SuperOneClick提取Root权限的基本步骤

F:/Own/Phone/Samsung/Tools/SuperOneClick 的文件夹下所有文件

2010/10/16  22:04           577,335 adb.exe
2010/10/18  11:27           339,885 adblinux
2010/10/18  11:26           171,656 adbmac
2010/10/16  22:04            96,256 AdbWinApi.dll
2010/10/16  22:04            60,928 AdbWinUsbApi.dll
2010/10/16  23:29         1,062,992 busybox
2010/10/16  22:04             5,392 rageagainstthecage  //步骤一
2010/10/16  22:04            24,120 sqlite3
2010/10/16  22:04            26,264 su                  //步骤二
2010/11/04  21:21           379,392 SuperOneClick.exe
2010/10/16  22:04           196,521 Superuser.apk       //步骤三

手机USB调试方法链接好电脑后,在电脑上执行SuperOneClick.exe,在弹出的
界面上,点击Rootbutton,便開始了Root权限提取的本身主动操做!

事实上它的步骤是这种:

步骤一:将rageagainstthecage文件存放在手机/data/local/tmp下,并运行
——————————————————————————–

1) 将文件放在/data/local/tmp下,其它文件夹没法运行。命令例如如下:
F:/Own/Phone/Samsung/Tools/SuperOneClick>adb push rageagainstthecage /data/local/tmp

2) 使用adb shell,改动rageagainstthecage文件权限
F:/Own/Phone/Samsung/Tools/SuperOneClick>adb shell
$ cd /data/local/tmp
cd /data/local/tmp
$ chmod 777 rageagainstthecage

3) 使用adb shell,执行rageagainstthecage
$ ./rageagainstthecage

[*] CVE-2010-EASY Android local root exploit (C) 2010 by 743C

[*] checking NPROC limit …
[+] RLIMIT_NPROC={2410, 2410}
[*] Searching for adb …
[+] Found adb as PID 19374
[*] Spawning children. Dont type anything and wait for reset!
[*]
[*] If you like what we are doing you can send us PayPal money to
[*] 7-4-3-C@web.de so we can compensate time, effort and HW costs.
[*] If you are a company and feel like you profit from our work,
[*] we also accept donations > 1000 USD!
[*]
[*] adb connection will be reset. restart adb server on desktop and re-login.
$

此时退出shell,再次使用adb shell,会发现提示符为#,已经在电脑Shell
上获取了Root权限。假设不是#,反复运行(./rageagainstthecage),
直到提示#。

F:/Own/Phone/Samsung/Tools/SuperOneClick>adb shell
#

步骤二:将/system改动为可读写,把su拷贝到/system/bin/
——————————————————————————–

1)上步骤一成功出现的#号提示符下,改动/system
# mount -o remount rw /system
#

2)另开一个命令行窗体,复制su至/system/bin
F:/Own/Phone/Samsung/Tools/SuperOneClick>adb push su /system/bin

su这个文件的功能,即是实现:普通用户至root超级用户的权限切换!

步骤三:将受权管理的标准Android软件包(Superuser.apk)拷贝到手机并安装
——————————————————————————–

这个过程很是easy,再也不赘述,就是adb push与adb install。受权管理事实上
就是管理哪些程序可使用su。也就意味着对超级用户权限的使用进行管理。

步骤四:从新启动手机
——————————————————————————–

事实上就是从新启动測试一下。

 

5、总结
在提取Root权限过程当中,仅仅有两个关键的文件:

rageagainstthecage
su

rageagainstthecage负责直接破解获取Root权限,而后才干改动/system/。
su假设仅仅放在/data/local/tmp文件夹下,是没有权限执行的。

$ ls -l su
ls -l su
-rwxrwxrwx shell    shell       26264 2010-10-16 22:04 su
$ ./su
./su
Permission denied
$

因此需要把su放在/system/bin文件夹下。以供之后的手机应用程序使用!
至于rageagainstthecage,su的执行原理,就不是本文现在讨论的问题了。

This entry was written by sense, posted on August 5, 2011 at 20:43, filed under Android and tagged Android. Bookmark the permalink. Follow any comments here with the RSS feed for this post. Post a comment or leave a trackback: Trackback URL.
 

android 手机/平板大行其道的今天,得到 root 权限成了你们关注的话题。

据我所知,需要得到 root 权限的嵌入式操做系统,仅仅有 ios 和 android。当中 ios 称为越狱,随着 ios 的公布,有众多高手开发了对应的傻瓜越狱工具。但是 android 应用很是普遍,却没有统一的技术支持,因此仅仅能由用户本身进行权限破解。因为 android 的内核是 linux,而 linux 中 root 拥有至高无上的权限,因此一时间获取 root 权限也成了很是多非 linuxer 关注的话题。
一键获取 android root 权限: Unviersal Androod (不适用所有机型)

为何要得到 root 权限呢?

事实上平常应用并不需要 root 权限,但是由于一些 android 的限制,咱们必须拥有 root 权限才干:

  • 下载收费软件
  • 改动系统文件
  • 替换 hosts 文件
  • 截图
  • 等等 …

连截图都要 root 权限……(记得 ios 是 home+power 吧?)

消歧

使用 adb 链接到设备得到的 root 权限并不是 设备所拥有的 root。

也就是说,链接设备成功后,咱们对设备的系统具备了 root 权限,而设备系统自身并无 root 权限。好比您在 market 看到 need rooted device 字样,那就是意味着您的设备系统也具备 root 权限。一般来讲,root 指设备自身可以运行 su 并得到 root 权限。

原理

adb ( android debug bridge ) 连接设备,并使用具备 root 权限的 adb 改动/替换设备 su 文件,从而具备 root 权限。

前期准备

  • 开启您的 android 设备,并运行例如如下操做: settings — application — development, 勾选usb debugging;

  • 建立 DE>/etc/udev/rules.d/51-android.rules 文件,内容例如如下:DE>

ubuntu:

1
2
DE> SUBSYSTEM==&amp;amp;amp;quot;usb&amp;amp;amp;quot;, SYSFS{idVendor}==&amp;amp;amp;quot;0bb4&amp;amp;amp;quot;,             MODE=&amp;amp;amp;quot;0666&amp;amp;amp;quot; DE>
DE> SUBSYSTEM==&amp;amp;amp;quot;usb_device&amp;amp;amp;quot;, SYSFS{idVendor}==&amp;amp;amp;quot;0bb4&amp;amp;amp;quot;,             MODE=&amp;amp;amp;quot;0666&amp;amp;amp;quot; DE>

arch:

1
2
3
DE> SUBSYSTEM==”usb”, SYSFS{idVendor}==”0bb4″, MODE=”0666″ DE>
DE> SUBSYSTEM==”usb”,ATTR{idVendor}==”0bb4″,ATTR{idProduct}==”0c02″,SYMLINK+=”android_adb” DE>
DE> SUBSYSTEM==”usb”,ATTR{idVendor}==”0bb4″,ATTR{idProduct}==”0c01″,SYMLINK+=”android_fastboot” DE>

当中 USB Vendor IDs 可以在 这里 查到。

更改文件权限:

1
DE> chmod DE>   DE>a+rx DE>DE>/etc/udev/rulesDE>DE>.dDE>DE>/50-androidDE>DE>.rulesDE>

又一次载入 udev 规则:

1
DE> udevadm control –reload-rules DE>
  • 下载越狱软件包,并把 su 复制到 adb/tools 内

    開始~

    插入 usb 数据线,而后打开终端,进入 adb/tools 文件夹,运行

    1
    DE> adb devices DE>

    Android adb devices显示 ????????????    no permissions怎么办?

    Windows:执行adb root

    Linux:
    adb kill-server
    sudo adb root

    此时显示为:

    List of devices attached 0123456789ABCDEF    device

    成功列出已链接的设备后,运行

    1
    2
    3
    4
    5
    6
    7
    DE>adb shell DE>DE>mvDE>   DE> /system/xbin/su DE>   DE> /system/xbin/osu DE>        DE> # 备份原 su 文件 DE>
    DE>adb push DE>DE>suDE>   DE> /system/xbin DE>        DE> # 把 adb/tools 的 su 文件 推送到 android设备 /system/xbin DE>
    DE>adb shell DE>DE>rmDE>   DE> /system/bin/su DE>        DE> # 移除其它的 su 文件 DE>
    DE>adb shell DE>DE>lnDE>   DE>-s DE>DE>/system/xbin/suDE>   DE> /system/bin/su DE>        DE> # 软链 su DE>
    DE>adb shell DE>DE>chmodDE>   DE>6755 DE>DE>/system/xbin/suDE>         DE> # 变动权限 DE>
    DE>adb shell DE>DE>syncDE>        DE> # 同步所有缓存中的文件 DE>
    DE>adb shell reboot      DE>DE># 从新启动 android 设备DE>

    (您需要依据您的设备和设置变动运行的路径)

    等待设备从新启动完毕后,可以在 adb shell 模式输入:su(回车),会出现su: access granted, courtesy of www.magicandroidapps.com #等提示,表明成功了。

    现在您可以使用root explorer,蓝牙上网,截图,martket enabler等工具啦~

    为何我不需要 root

    网上超多的 root 教程会让你惊奇的发现,ROOT好简单哦。但是看到新手一拿到手机就当即刷ROOT,而后再问:取了ROOT有什么用?
    咱们不能全然责备用户,因为很是多教程都没有强调刷ROOT可能致使的严重后果,会危及到你手上设备的安全性。实际上,很是多用户根本不需要ROOT权限!

    在開始以前,请先问你本身下面2个问题:
    1.你有几回细读过菜市场里下载的软件或者游戏的使用协议?
    2. 你有几回看了软件使用协议中的权限要求(full internet, gps location, read contacts等等)后会问“嗯,为何这个游戏需要这些权限呢?”
    你是否是仍是照安装不误呢?

    事实是,绝大多数的用户根本不会理会 程序所 请求 的这些权限,他们会照安装不误。

    尽管 market 已经通知了用户软件所需的权限,但这远远不够。 因为用户仍是不知道这些权限和安全有什么关系。有些软件或许没有什么恶意,但设计的却极其的烂。因为开发人员也是人,也会犯错。有时,程序猿会选择一个他们以为安全的协议,但实际上倒是很是危急的。又或者有些恶意软件,可以让别人远程清空你的手机,或者将你手机里的信息传送回指定server后再清空你的手机(或许已经有这种软件了)。我以上所说的这些样例代表,即使是非ROOT权限的程序都有可能很是危急,况且那些得到ROOT权限的程序呢?

    事实上,有些功能事实上全然不该该需要ROOT权限的。很是多用户取得ROOT权限仅仅是为了加入一些本身的主题,为了一些小众的需求而已。

    老实的说,看到愈来愈多的ANDROID新手以为不ROOT就不能正常工做,让我感到很是沮丧。(via

    參考资料

    http://developer.android.com/guide/developing/device.html

    http://www.kunli.info/2009/08/22/archlinux-android-adb-recognize-device/

    http://henryh.cn/blog/android_cupcake_root.html

    http://bbs.hiapk.com/thread-652917-1-1.html

     https://www.deleak.com/blog/2010/12/17/android-root-on-linux/

  • 相关文章
    相关标签/搜索