1、root优缺

  android的root跟苹果越狱很类似,可以享受“解禁”后的很多自由。

  1、删除系统中不需要的一些app,特别是一些厂商强制安装的app。

  2、美化系统,例如修改字体,修改开关机音乐、动画等;

  3、可以更细致的优化系统,例如屏蔽掉一些自动运行的app;

  当然,android root后带来的肯定远不止这些好处。但root后毫无约束的自由就会产生很多不可控的问题,例如流氓软件可以很轻易的植入广告、病毒、修改系统文件,并且root并非官方支持的行为,root后会影响保修。

2、root原理

  android的系统管理员为root,该用户可以在系统最高许可范围内进行任何操作(并不是所有操作root都有权执行)。而root android手机的过程也就是获取root用户的权限,同时为了防止不良软件随意利用root权限,我们需要给系统安装一个Superuser.apk的应用,当有应用需要通过su获取root权限时,Superuser会拦截该动作并向用户做出询问,当用户允许才执行。所以root的过程简单来说就是将su文件放到/system/bin下,将Superuser.apk放到/system/app下,还需要设置/system/bin/su能让任意用户执行,需要set uid,即需要设置adb shell chmod 4755 /system/bin/su。但由于厂商并不支持该行为,所以一般会有诸多限制让我们很难顺利完成root提限,需要合理的利用系统进程的一些漏洞来完成这一操作(一般所谓的“不完全root”就是指通过Superuser来防止未经授权的应用随意获取root权限)。

3、root方法

  1> adb push su /system/bin                                             #复制su到bin目录

  2> chown root:root su                                                        #将su的拥有者以及所属群组设置为root

  3> chmod 4755 /system/bin/su                                   #将su设置为-rwsr-xr-x,使所有用户都可以使用

  4> adb push Superuser.apk /system/app                 #安装Superuser应用,对root权限进行授权使用

  上述步骤看似简单,实际却很难实现。在linux中,如果想获取root权限可以通过执行su切换到root权限,或者通过sudo临时获取root权限,且不管哪一种方式,系统都要求输入正确的root用户密码才能获取相应的root权限。而android本身就不希望用户得到root权限,所以大部分手机出厂的时候根本就没有su这个程序,即使有,一般也都将4755权限设置为了755,使普通用户无法使用。并且android的su和linux里的su还不一样,在android中不是靠密码验证,而是看你原来的权限是什么,如果你是非root用户,就无法切换到root,会提示permission denied,也就是说只有root运行su才有用。而且system目录对于普通用户一般也都是只读,无法写入,同样chmod也需要root权限才能运行。sudo在android中也不支持。

  要想完成上面的root步骤,首先需要root权限,所以只能通过找一个本身已经有root权限,并且存在漏洞的进程来执行上述命令。所以想要root android手机,首先需要找到一些拥有root权限的程序漏洞,再通过该漏洞执行上述root步骤。目前最常用的root工具都是pc客户端程序,通过android系统的adb shell运行漏洞利用程序,也有一些是能直接在android设备上运行。由于漏洞并不具有完全的适用性,不同的方法也只适应一定的机型,所以这里不讨论具体的实现步骤。下面三个链接比较细致的讲解了root的相关知识,需要进一步了解的可以看看。其中讲解了如何利用RageAgainstTheCage漏洞,使adb拿到root权限。

  http://www.cnblogs.com/xiaoxiaoboke/archive/2012/02/13/2349719.html

  http://www.cnblogs.com/xiaoxiaoboke/archive/2012/02/13/2349723.html

  http://www.cnblogs.com/xiaoxiaoboke/archive/2012/02/13/2349711.html

4、关于suid和sgid

  在讲解root步骤时,我们提到一个为su设置set uid,或者说4755权限的步骤。那我们需要了解一下什么是suid,什么是sgid,什么是sbit以及4755的意思。

  在linux中文件和目录的默认权限通常由上述结构表示,r表示可读,w表示可写,x表示可执行,-表示无权限(当用数字模式时,r为4,w为2,x为1,-为0,而4755的后三位表示默认权限,即对于文件拥有者,有4+2+1=7,即可读可写可执行权限;对于文件所属群组,4+1=5,具有可读可执行权限;而对于其他用户,4+1=5,同样具有可读可执行权限)。而除了这些默认权限外,还有三个特殊权限:suid、sgid、sbit,数字模式时,suid为4,sgid为2,sbit为1,而4755的第一位表示特殊权限,也就是4,所以4755的特殊权限为suid。

  1、suid,控制用户执行的文件,以文件所属用户的身份执行,而不是执行文件的用户本身。当一个可执行的文件拥有suid时,会将文件拥有者的x位变成s,这时称为set uid,简写就是suid。而android root时,就是需要确保su已经suid为root用户,这样其他用户也可以通过root身份来执行su,也就取得了root权限。

  suid权限仅对二进制程序(系统中的一些命令)有效,不能用在脚本上,因为脚本是将很多程序集合到一起来执行,而不是脚本本身在执行;suid放在目录上是无效的;suid权限仅在执行该程序的过程中有效(run-time);程序执行者对于该程序来说,需要具备x的权限。

  2、sgid,对目录的控制是以目录所属群组的身份运行,在目录中创建的任何子目录或文件的所属群组都与目录所属群组一致。

  sgid同样对二进制程序有效;程序执行者对于该程序来说,需要具备x的权限;sgid主要用在目录上。

  3、sbit,主要针对其他用户(others)来设置的,只对目录有效,当用户在该目录下建立文件或目录时,仅有自己与root才有权利删除。例如/tmp目录,任何人都可以在/tmp内增加,修改文件,因为权限都是rwx,但仅有该文件或目录的建立者与root才能够删除自己的目录或文件。

  特殊权限的设置和默认权限一样,使用chmod命令,也同样可采用UGO模式或数字模式,具体如何设置请自行查阅。

5、root在开发中的影响

  在实际开发中,经常会有一些功能由于没有足够的权限而无法实现。例如设置系统时间,静默安装,读取一些系统的配置文件等,要解决这些问题,最常见的就是查找源码中是否存在隐藏的api可以在不需要root权限的情况下通过反射机制实现,否则就只能加入android:sharedUserId=“android.uid.system”属性,通过配置和系统进程中运行的apk一样的userid,这样就可以使apk运行在系统进程中,也就拥有了相应权限。由于采用uid方式需要目标系统的platform key,所以生成的apk只能安装在目标系统中。

参考资源

http://www.opsers.org/base/learning-linux-the-day-that-the-special-privileges-suid-sgid-sbit.html

关于root的更多相关文章

  1. Centos 下 mysql root 密码重置

    重置mysql密码的方法有很多,官网也提供了很方便的快捷操作办法,可参考资料 resetting permissions .本文重置密码的具体步骤如下: 一.停止MySQL(如果处于运行状态) #se ...

  2. CentOS7 重置root密码

    1- 在启动grub菜单,选择编辑选项启动 2 - 按键盘e键,来进入编辑界面 3 - 找到Linux 16的那一行,将ro改为rw init=/sysroot/bin/sh 4 - 现在按下 Con ...

  3. Mac上MySQL忘记root密码且没有权限的处理办法&workbench的一些tips (转)

    忘记Root密码肿么办 Mac上安装MySQL就不多说了,去mysql的官网上下载最新的mysql包以及workbench,先安装哪个影响都不大.如果你是第一次安装,在mysql安装完成之后,会弹出来 ...

  4. Atitit  godaddy 文件权限 root权限设置

    Atitit  godaddy 文件权限 root权限设置 1. ubuntu需要先登录,再su切换到root1 2. sudo 授权许可使用的su,也是受限制的su1 3. ubuntu默认吗roo ...

  5. Mysql 忘记root密码处理办法

    一.更改my.cnf配置文件 1.用命令编辑/etc/my.cnf配置文件,即:vim /etc/my.cnf 或者 vi /etc/my.cnf 2.在[mysqld]下添加skip-grant-t ...

  6. Ubuntu设置root用户登录图形界面

    Ubuntu默认的是root用户不能登录图形界面的,只能以其他用户登录图形界面.这样就很麻烦,因为权限的问题,不能随意复制删除文件,用gedit编辑文件时经常不能保存,只能用vim去编辑. 解决的办法 ...

  7. php利用root权限执行shell脚本

    vi /etc/sudoers , 为apache用户赋予root权限,并且不需要密码,还有一步重要的修改(我被困扰的就是这个地方) root  ALL=(ALL)  ALL apache  ALL= ...

  8. linux下如何添加一个用户并且让用户获得root权限

    1.添加用户,首先用adduser命令添加一个普通用户,命令如下: #adduser tommy //添加一个名为tommy的用户 #passwd tommy //修改密码 Changing pass ...

  9. 如何重置硬盘遭到“损坏”的Linux系统root用户密码

    传统印象下Linux是非常坚不可摧的,具有千年不更新,万年不重启的美名.而随着虚拟化的推进,很多跑在虚拟化上的Linux由于先前基础架构的脆弱,变得适应性“越来越不好”,体现在IP存储如果出现节点故障 ...

  10. centos下MYSQL 没有ROOT用户的解决方法。

    SbTest for using sysbench creating scritps: sysbench --test=oltp --oltp-table-size=100000 --mysql-db ...

随机推荐

  1. P1896 [SCOI2005]互不侵犯

    题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 注:数据有加强(2018/4/25) ...

  2. Life Forms POJ - 3294(不小于k个字符串中的最长子串)

    题意: 求不小于字符串一半长度个字符串中的最长字串 解析: 论文题例11 将n个字符串连起来,中间用不相同的且没有出现在字符串中的字符隔开, 求后缀数组, 然后二分答案变为判定性问题, 然后判断每组的 ...

  3. [洛谷P3829][SHOI2012]信用卡凸包

    题目大意:有$n$张一模一样的信用卡,每个角进行了圆滑处理,问这些卡组成的“凸包”的周长 题解:发现是圆滑处理的圆心围成的凸包加上一个圆周即可 卡点:输入长宽弄反,然后以为是卡精 C++ Code: ...

  4. Merge Intervals - LeetCode

    目录 题目链接 注意点 解法 小结 题目链接 Merge Intervals - LeetCode 注意点 区间是无序的 每个区间start一定小于end 解法 解法一:首先以start的值从小到大来 ...

  5. 【Cf #178 A】Shaass and Lights(组合数)

    考虑两个灯之间的暗灯,能从左边或右边点亮两种顺序,而最左端或最右端只有一种点亮顺序. 先不考虑点灯顺序,总共有n - m个灯要点亮,对于连续的一段暗灯,他们在总的点灯顺序中的是等价的,于是问题就可以抽 ...

  6. Javascript/jQuery关于JSON或数组集合的几种循环方法

    JavaScript遍历JSON或数组集合: /** * 根据json数据生成option树形控件 * 如果有children节点则自动生成树形数据 * @param {JSON} data * @p ...

  7. Android Layout: TableLayout

    TableLayout<TableLayout xmlns:android="http://schemas.android.com/apk/res/android" andr ...

  8. Java-异常机制详解以及开发时异常设计的原则要求

    Java-异常机制详解以及开发时异常设计的原则要求 http://blog.csdn.net/Jack__Frost/article/details/52760930?locationNum=6

  9. Qt 编写多窗口程序

    该文章原创于Qter开源社区(www.qter.org),作者yafeilinux,转载请注明出处! 导语      程序要实现的功能是:程序开始出现一个对话框,按下按钮后便能进入主窗口,如果直接关闭 ...

  10. shell 中的操作符

    1.算术操作符 2.关系操作符 3.布尔操作符 4.字符串操作符 5.文件相关操作符 算术操作符 bash shell 没有提供任何机制来执行简单的算术运算,不过我们可以借助于一些其他程序,如 exp ...