Android中典型的ROOT原理(5)
ROOT的作用
- Customization
用户的个人定制,如删除一些预安装,定制开机动画等. - 特权操作
所有需要特权操作的基本都是要通过ROOT,这也是ROOT的初衷.
ROOT的第一步:寻找漏洞并安装特权文件
- Hacker会寻找漏洞,如UID设置失败(ADB)
- 手机ROOT后,最重要的是,给手机安装su程序和superuser apk.
- su: 一般都被安装在
/system/xbin 或者 /system/bin
- superuser: 这个程序主要是用于管理需要特权的应用,在管理界面内可以对需要特权程序进行
拒绝/允许
- su: 一般都被安装在
SU的sUID特性
那么拷进手机内的这个su程序到底有什么功能呢?
先看下面一段代码.
# ls su -l
ls su -l
-rwsr-sr-x 1 root root 26334 Aug 1 2008 su
这里可以看到,su的Owner和Group分别为Root:Root. Other用户具有execute权限,另外,su设置了suid和sgid,这个非常重要,使得su进程可以提升自身的EUID.
RootExplorer(文件超级管理器)是如何做特权操作的?
首先我们可以看到RootExplorer 这个app被分配的信息:
app_73 1143 103 301620 39944 ffffffff 400194c4 S
包名:
com.speedsoftware.rootexplorer
上面可以看到,RootExplorer的
EUID=10073
(App Base是从10000开始的),PID=1143
.然好RootExplorer通过Runtime 方式,使用shell 命令运行了
su
.见下面exec() 方法就是运行su核心代码.
p=Runtime.getRuntime().exec("su");
RootExplorer接着启动sh:
看一看到下面的1159
是多出来的,他其实是通过PPID为1143
这个进程启动的,而1143
也就是RootExplorer App
.
信息如下:
app_73 1159 1143 764 376 c003e454 4001cf94 S /system/bin/sh
总结:
默认情况下,进程的UID还是继承app_73
,这里sh的PPID是1143
,说明是RootExplorer App
启动的,启动后sh就是1159
.
然后
1159
PID的sh会启动su
, 这里需要注意的是,su
进程的Real UID是10073,因为继承了parent,但是,其EUID却提升为ROOT,这就是由于SUID被设置的原因.由于su
进程的EUID是ROOT,所以导致了su
可以做很多高权限的事情.
su
会通过下面代码启动SuperUser Request Activity
来询问用户是否授权当前应用,如果否的话,则su
将return结束,否则su
会继续运行.
com.koushikdutta.superuser/com.koushikdutta.superuser.SuperuserRequestActivity --ei uid %d --ei pid %d > /dev/null", g_puid, ppid);
if (system(sysCmd))
return executionFailure("am.");
- 得到用户许可后(通过sqlite和SuperUser Request Activity交流用户许可),
su
会将资金的Real UID也设置成ROOT:
if(setgid(0)||setuid(0))
return permissionDenied();
由于su
EUID是ROOT,所以su
有权限执行以上代码,执行完后su
进程的Real UID, effective UID都变成了ROOT.这里设置RUID=0
是为了给自己正身,使得后代能够继承特权.
- 然后在
su
把自己正身完后就会去复用一个sh来运行用户的指令:
char *exec_args[argc + 1];
exec_args[argc] = NULL;
exec_args[0] = "sh";
int i;
for (i = 1; i < argc; i++)
{
exec_args[i] = argv[i];
}
execv("/system/bin/sh", exec_args);
//下面只会在失败的时候运行
return executionFailure("sh");
这里非常关键的代码是execv! 这里没有使用fork(fork会有新的进程出来),而是直接使用execv,这将导致不会创建新的进程运行sh image,而是直接在当前su的进程空间load并执行sh image可执行文件。执行完execv后,就开始直接sh的代码了。
- 这里可以看到,由于复用su当前进程来运行sh,使得sh运行的进程的EUID,Real UID都是ROOT,那么,任何操作都可以执行了。
如果不提升Real UID为Root的话,那么只要sh运行中通过启动外部程序的方式来完成操作的话,就会出现权限问题,因为新启动的进程只会继承父进程的Real UID,而不是EUID,那么新起的进程的Real UID=EUID= parent RealUID != ROOT,那么某些操作可能有问题。 所以,su把自己的Real UID也提升为ROOT后,则不管启动后的任何代后的子进程执行操作,都是以ROOT的权限运行。
RootExplorer通过得到sh流后,就可以通过该流执行任何shell指令了:
try {
// Preform su to get root privledges
p = Runtime.getRuntime().exec("su");
// Attempt to write a file to a root-only
DataOutputStream os = new DataOutputStream(p.getOutputStream());
os.writeBytes("echo "Do I have root?" >/system/sd/temporary.txtn");
// Close the terminal
os.writeBytes("exitn");
os.flush();
}
总结: android中app授权获取root权限,其实不是app自身的权限提升了,而是通过具有root权限的sh 流来执行shell命令.
Android中典型的ROOT原理(5)的更多相关文章
- Android中的LruCache的原理和使用
Android中的LruCache的原理和使用 LruCache,虽然很多文章都把LRU翻译成"最近最少使用"缓存策略,但Android中的LruCache真的如此吗? 答案是No ...
- Android 中View的工作原理
Android中的View在Android的知识体系中扮演着重要的角色.简单来说,View就是Android在视觉的体现.我们所展现的页面就是Android提供的GUI库中控件的组合.但是当要求不能满 ...
- Android中微信抢红包插件原理解析和开发实现
一.前言 自从去年中微信添加抢红包的功能,微信的电商之旅算是正式开始正式火爆起来.但是作为Android开发者来说,我们在抢红包的同时意识到了很多问题,就是手动去抢红包的速度慢了,当然这些有很多原因导 ...
- Android中图像变换Matrix的原理、代码验证和应用(一)
第一部分 Matrix的数学原理 在Android中,如果你用Matrix进行过图像处理,那么一定知道Matrix这个类.Android中的Matrix是一个3 x 3的矩阵,其内容如下: Matri ...
- Android中图像变换Matrix的原理、代码验证和应用(三)
第三部分 应用 在这一部分,我们会将前面两部分所了解到的内容和Android手势结合起来,利用各种不同的手势对图像进行平移.缩放和旋转,前面两项都是在实践中经常需要用到的功能,后一项据说苹果也是最近才 ...
- JAVA回调函数ANDROID中典型的回调地方
在计算机中回调函数是指通过函数参数传递到其他代码类的,某一块可执行代码的引用,这以设计允许了底层代码调用者在高层定义的子程序. 在JAVA里面我们使用接口的方式来实现函数的回调. 回调的通俗就是:程序 ...
- Android中SensorManager.getRotationMatrix函数原理解释
SensorManager是Android中的一个类,其有一个函数getRotationMatrix,可以计算出旋转矩阵,进而通过getOrientation求得设备的方向(航向角.俯仰角.横滚角). ...
- Android中线程间通信原理分析:Looper,MessageQueue,Handler
自问自答的两个问题 在我们去讨论Handler,Looper,MessageQueue的关系之前,我们需要先问两个问题: 1.这一套东西搞出来是为了解决什么问题呢? 2.如果让我们来解决这个问题该怎么 ...
- Android 的提权 (Root) 原理是什么?
作者:Kevin链接:https://www.zhihu.com/question/21074979/answer/18176410来源:知乎著作权归作者所有,转载请联系作者获得授权. Android ...
随机推荐
- Hibernate(八):基于外键映射的1-1关联关系
背景: 一个部门只有一个一把手,这在程序开发中就会设计数据映射应该设置为一对一关联. 在hibernate代码开发中,实现这个业务有两种方案: 1)基于外键映射的1-1关联: 2)基于主键映射的1-1 ...
- js中获取元素的样式兼容性的写法
1:设计元素的样式:el.style.color="red"||el.style["color"]="red" 获取元素的样式:el.st ...
- 如何设计一款APP,才能吸引用户眼球
有APP分析机构研究表明,人们每天耗费在手机和平板上的平均时长为158分钟,其中127分钟是耗费在各类APP中,而仅有31分钟是花费在浏览网页上.随着人们对互联网的依赖性越来越强,移动APP发展迅速已 ...
- PHP 安装与配置(WIN10)
需要在本地搭个PHP的测试环境,顺手将过程写了下来. 由于不是生产环境,我这里直接选择了最新的PHP版本用来测试. 本地坏境为:windows 10 Pro 1709 PHP版本:php-7.2.3- ...
- java的继承性
在java继承中,子类也称为派生类,父类也称为基类或者超类,基本语法 :子类 extends 父类{} 实现一个简单的继承类: class Person{ private String name; p ...
- 0312-css样式(选择器、文本text、字体fonts、背景background)
问题: 1.css中table{border:1px:}是定义table的样式,只有表格的外边框,不能实现<table border="1"></table> ...
- .NET Core 从 Github到 Nuget 持续集成、部署
一.前言 Nuget 作为一个.NET研发人员,我想你都不会陌生,他为我们提供非常方便的程序包管理,不管是版本,还是包的依赖都能轻松应对,可以说是我们的好助手.而 Nuget 除了官方nuget.or ...
- pyquery 的用法 --爬虫解析库
如果你对Web有所涉及,如果你比较喜欢用CSS选择器,如果你对jQuery有所了解,那么这里有一个更适合你的解析库--pyquery. 接下来,我们就来感受一下pyquery的强大之处. 1. 准备工 ...
- 手动导入xmpp后,再使用cocoapods的时候出现的问题
最新的cocoapod导入xmpp的时候,会出现循环依赖,所以撸主选择了手动导入. 一开始还用的挺开心的,后来,使用cocoapods导入其他的框架,发现调用的时候总是报错. Undefined sy ...
- codevs 1054 电梯
1054 电梯 提交地址:http://codevs.cn/problem/1054/ 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 题目描述 D ...