前言
一直很好奇Android Root的原理,恰好最近碰到了一个跟Android默认带Root权限的问题,这里顺便记录一下Android系统root的原理。
原理
Android是基于Llinux内核的开源操作系统,与Ubuntu系统类似,所以在Android里获取root权限其实和在Linux系统下获取root权限是一回事。在Linux系统下获取root权限的方法是在命令行执行sudo或者su,接下来输入提权密码就可以获取root权限了。Android系统其实也是这样,例如应用层程序开发,在root过的手机上运行root权限的代码如下所示:
Process process = Runtime.getRuntime().exec("su"); DataOutputStream os = new DataOutputStream(process.getOutputStream()); ...... os.writeBytes("HelloWorld!\n"); os.flush();
我们可以看到,Android应用程序获取root权限也是需要执行su命令,因此Android能够root的密码都在su程序上。但是,Android本身是不想让你获取root权限的,因此大部分手机出厂都是user版本,默认是不带su这个二进制程序的。所以你想获取Android的root权限,第一步就是要把编译好的su文件拷贝到Android手机的/system/bin或/system/xbin目录下(为什么要拷贝到/system目录下,是因为这个分区是没有nosuid限制的,同时/system/bin和/system/xbin又都是系统环境变量PATH里的路径,可以直接执行su)。我们先假设你可以把编译好的su程序放在xbin或者bin目录下,接下来你可以在Android手机的adb shell或者串口下输入su提权了。
Linux命令行下输入su之后,是需要输入root密码才能够提权的,但是Android里的su和Linux里的su是不一样的,Android里的su是不靠验证密码的,而且需要验证你之前的权限是什么。意思是,如果你是root用户,那你可以通过su切换到别的用户,比如shell、wifi、audio等。但是如果你是root之外的其他用户,就不能切换到root了,会提示你permission denied。也就是说,用root运行su才有用,但是这个时候我没还有root权限怎么办?这就是接下来要讨论的问题。
我们在Ubuntu下查看/usr/bin/passwd文件的权限,如下图所示:
这个文件的权限比较特殊,Linux用户一般都知道文件分为r、w、x权限,那这个s是神马意思呢?这里回答一下,s代表当任何一个用户执行该文件的时候都拥有文件所有者的权限,这文件所有者是root。简单来说,就是不管谁执行这个文件,他执行的时候都是以root身份来执行的。
看到这里,大家是不是都有思路了,也就是说,即使我不是root用户也可能以root用户的身份来执行程序,那么我把一个所有者是root的su程序权限标志位设置为-rwsr-xr-x,那么不管是谁执行它,都是以root身份执行。这就牛逼了,su果断可以执行成功,那你也就可以顺利的获取root权限了。
破解
原理都清楚了,那root的过程其实就是分两步:
1. 把一个所有者是root的su拷贝到Android手机上。
2. 把su的权限标志位设置成-rwsr-xr-x。
写成代码大概如下所示:
cp /sdcard/su /system/xbin/ chown root:root /system/xbin/su chmod 4755 /system/xbin/su
代码看起来很简单,但是想真正的运行成功,以上代码每一句都需要root权限执行。我擦,一下回到解放前,跟先有鸡还是先有蛋的问题类似,代码运行需要root权限,而代码本身的目的就是获取root权限,成了一个封闭的死循环了。但是所幸Android系统有Bug,因此就给了你打破这个死循环的机会。
打破的方法就是找一个本身已经有root权限的进程来运行这个3行的shell脚本,这样脚本就可以顺利执行了。但是已经有root权限的进程都是出厂时候就装到手机上的,代码写死了,你没法控制它执行自己的代码啊,这个时候就需要查找漏洞了。例如Android2.3 root权限的zergRush漏洞就是利用一个拥有root权限的进程栈溢出漏洞。具体利用漏洞的方法大家就可以自行google了。
防止root
通过上述分析,我们可以简单的理解,解决Android系统能够su提权的方法就是把su文件干掉就可以了。
本文向大家介绍Android系统中使用shareuserid获取系统权限的教程,包括了Android系统中使用shareuserid获取系统权限的教程的使用技巧和注意事项,需要的朋友参考一下 Android会为每个apk进程分配一个单独的空间(比如只能访问/data/data/自己包名下面的文件),一般情况下apk之间是禁止相互访问数据的。通过Shared User id,拥有同一个User id
我正在尝试从我的手机上检索我的文件,屏幕坏了。安装了adb,设备已经root。试图在adb shell上获得root访问权限,但它不起作用,无法列出 /data/.中的文件夹。 这是命令提示符 抄送: 据我所知,$ 符号应该变成#符号,表示我有root访问权限,但它不起作用,任何修复?谢谢
本文向大家介绍详解nodejs中express搭建权限管理系统,包括了详解nodejs中express搭建权限管理系统的使用技巧和注意事项,需要的朋友参考一下 权限管理,是管理系统中的常见组件。通常需要定义资源,把资源调配给用户,通过判断用户是否有权限增删改查来实现。 初衷: 使用express开发过的项目大大小小加在一起也有二十多个了,之前做的各个项目都是独立存在的。最近领导建议说把这些小项目整
在 Web 应用中,认证系统的功能是识别网站的用户,权限系统是控制用户可以做什么操作。第 8 章实现的认证机制有一个很好的作用,可以实现权限系统。 虽然 9.1 节已经完成了 edit 和 update 动作,但是却有一个荒唐的安全隐患:任何人(甚至是未登录的用户)都可以访问这两个动作,而且登录后的用户可以更新所有其他用户的资料。本节我们要实现一种安全机制,限制用户必须先登录才能更新自己的资料,而
我试过了 但它给了我编译时错误 无法从静态上下文引用非静态方法“get(int)”。 我从observable的调用方法调用这个方法。 我还看到了但它已被弃用。
本文向大家介绍Android普通应用升级为系统应用并获取系统权限的操作,包括了Android普通应用升级为系统应用并获取系统权限的操作的使用技巧和注意事项,需要的朋友参考一下 有时候使用某些api需要使用系统权限,如调用PackageInstaller的相关接口,需要android.permission.INSTALL_PACKAGES权限,该权限系统只会授权给系统应用,此时可以考虑将我们的应用升
获取访问攻击是网络渗透测试的第二部分。 在本节中,我们将连接到网络,这将使我们能够发起更强大的攻击并获得更准确的信息。 如果网络不使用加密,我们可以连接到它并嗅出未加密的数据。 如果网络是有线的,我们可以使用电缆并连接到它,可能通过更改我们的MAC地址。唯一的问题是攻击目标使用加密,如WEP,WPA,WPA2。 如果我们确实遇到加密数据,我们需要知道解密它的密钥,这在本章将会学习和实践。 如果网络
本文向大家介绍Java访问权限原理与用法详解,包括了Java访问权限原理与用法详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Java访问权限原理与用法。分享给大家供大家参考,具体如下: 构造者模式思想 进行初始化,解决了多个构造器重载,构造器参数过多记不住的情况。 包 层次结构 package 父包[.子包.······]; 包名:小写字母;通常是域名反转.部门名.项目名 包的好处