Android root 详解
第一篇
===================================================================
Android 系统 root 破解原理分析
现在Android系统的root破解基本上成为大家的必备技能!网上也有很多中一键破解的软件,使root破解越来越容易。但是你思考过root破解的 原理吗?root破解的本质是什么呢?难道是利用了Linux kernal的漏洞吗?本文将简单对root的破解原理进行分析。
网上有一篇文章已经对root破解的基本原理进行了简单介绍,大家可以先参考一下《android 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 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权限,也算是给系统加了一层保险吧!
如上是Simon的个人对root破解的一些认识,如果有错误的地方,欢迎朋友们指正。
----------------------------------------------------------------------------------------------------
上文《Android系统root破解原理分析》介绍了Android系统root破解之后,应用程序获得root权限的原理。有一些网友提出对于root破解过程比较感兴趣,也提出了疑问。本文将会对这个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中有如下代码:
01
|
int adb_main( int is_daemon)
|
02
|
{
|
03
|
......
|
04
|
property_get( "ro.secure" , value, "" );
|
05
|
if ( strcmp (value, "1" ) == 0) {
|
06
|
// don't run as root if ro.secure is set...
|
07
|
secure = 1;
|
08
|
......
|
09
|
}
|
10
|
11
|
if (secure) {
|
12
|
......
|
从中我们可以看到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);
|
代码之前都是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的这个漏洞其实也挺简单的:
1
|
/* then switch user and group to "shell" */
|
2
|
if (setgid(AID_SHELL) != 0) {
|
3
|
exit (1);
|
4
|
}
|
5
|
6
|
if (setuid(AID_SHELL) != 0) {
|
7
|
exit (1);
|
8
|
}
|
如果发现setgid和setuid函数执行失败,则adbd进程异常退出,就把这个漏洞给堵上了。为什么这么多设 备都没有堵上这个漏洞呢?我觉得是设备厂商的策略(不排除傻X的厂商存在哦),虽然知道怎么封堵漏洞但是就是留着个后门给大家,让第三方给自己定制 rom,提高自己系统的易用性。
至此我们把root的过程和root之后系统情况都进行了介绍,相信你也不会对root破解再神秘了吧!
第二篇
=================================================================================
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权限的程序。
第三篇
=================================================================================
绕过身份检测,破解Android SU(源码方式)
由于Android底层是Linux内核,故了解了Linux的权限管理后就可以知道ROOT的原理,具体可以访问《Android系统权限和root权限》一文,而一般的Androd下的su命令只支持在ROOT用户和SHELL用户下才有权限让程序以root用户身份运行,其实看完Android源码下的system/extras/su/su.c代码即可清楚,而我们绕过了其中的当前运行用户判断来让所有的用户都可以将以自己身份运行的程序尝试去设置以root用户身份运行,即运行su命令不需判断运行程序的当前用户的uid,直接可以设置相应的uid和gid,而我们所做的只是修改su.c文件,把如下代码屏蔽即可。
Android root 详解相关推荐
- Android LayoutInflater详解
Android LayoutInflater详解 在实际开发中LayoutInflater这个类还是非常有用的,它的作用类 似于findViewById().不同点是LayoutInflater是用来 ...
- Android SharedFlow详解
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/121911675 本文出自[赵彦军的博客] 文章目录 系列文章 什么是SharedF ...
- android rotate 动画,Android RotateAnimation详解
RotateAnimation旋转坐标系为以旋转点为坐标系(0,0)点.x轴为0度,顺时针方向旋转一定的角度. 1.RotateAnimation(fromDegrees, toDegrees) [默 ...
- Android touch详解(2) touch bringup
Android touch详解(2) touch bringup 前言 了解需求 电路图 驱动移植 1. 添加touch driver 2. 修改Makefile 3. kconfig 4. .ini ...
- 【转】Android菜单详解——理解android中的Menu--不错
原文网址:http://www.cnblogs.com/qingblog/archive/2012/06/08/2541709.html 前言 今天看了pro android 3中menu这一章,对A ...
- Android菜单详解——理解android中的Menu
前言 今天看了pro android 3中menu这一章,对Android的整个menu体系有了进一步的了解,故整理下笔记与大家分享. PS:强烈推荐<Pro Android 3>,是我至 ...
- android Fragments详解
android Fragments详解一:概述 android Fragments详解二:创建Fragment 转载于:https://my.oschina.net/liangzhenghui/blo ...
- android WebView详解,常见漏洞详解和安全源码(下)
上篇博客主要分析了 WebView 的详细使用,这篇来分析 WebView 的常见漏洞和使用的坑. 上篇:android WebView详解,常见漏洞详解和安全源码(上) 转载请注明出处:http ...
- android WebView详解,常见漏洞详解和安全源码(上)
这篇博客主要来介绍 WebView 的相关使用方法,常见的几个漏洞,开发中可能遇到的坑和最后解决相应漏洞的源码,以及针对该源码的解析. 由于博客内容长度,这次将分为上下两篇,上篇详解 WebView ...
最新文章
- svn删除用户名及密码
- PC厂商如何演化移动互联网市场格局?
- python软件包自带的集成开发环境-Python的10大集成开发环境和代码编辑器(指南)...
- PowerMock 简介--转载
- 打开高效文本编辑之门_Linux Awk之条件判断与循环
- web性能测试分析-工具篇 (转载)
- php 代码符号,网站开发编程中的特殊符号处理_php
- CPU上跑深度学习模型,FPS也可以达100帧
- php retoken,laravel 5.5 关闭token的3种实现方式
- 数据结构实验 寻找数组主元素(2013考研题)
- javaweb项目遇到错误
- 如何在 Ubuntu 上转换图像、音频和视频格式
- 软件质量因素 6个_影响软件质量管理的主要因素
- 【历史上的今天】11 月 21 日:第一个阿帕网连接建立;乐视网成立;爱迪生发明留声机
- 横版闯关手游【觉醒大陆90装备版】5月最新整理商业Linux手工服务端+吃鸡+组队PK+运营后台+CDK清包后台+GM授权后台+安卓苹果双端+视频教程+详细搭建教程
- 寒江独钓-Windows内核安全编程笔记-第3章代码和笔记
- 柳比歇夫的时间管理法—《可以量化的管理学》
- Dubbo 3.0新特性记录
- “哥德尔不完备定理”到底说了些什么?
- linux ll命令是什么
热门文章
- kaggle_Titanic练习经验
- 【GAMES104】现代游戏引擎笔记目录(更新中……)
- VidMobie Blu-ray Ripper for Mac(蓝光DVD转换器)
- 【有利可图网】PS实战教程56:用PS制作瑰丽的波普风格艺术类型海报
- 关于小程序上传图片到七牛的总结
- iOS耗电测试工具--batterydetective
- java执行jar包
- 领峰:现货黄金价格走势图的分析要怎样正确的进行?
- python turtle画小兔子图片_如何用Python画一只兔子——turtle库circle()画圆函数的详细用法介绍...
- 4岁的儿子还不会写红黑树,我是不是应该去做一下亲子鉴定?