关于root
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的更多相关文章
- Centos 下 mysql root 密码重置
重置mysql密码的方法有很多,官网也提供了很方便的快捷操作办法,可参考资料 resetting permissions .本文重置密码的具体步骤如下: 一.停止MySQL(如果处于运行状态) #se ...
- CentOS7 重置root密码
1- 在启动grub菜单,选择编辑选项启动 2 - 按键盘e键,来进入编辑界面 3 - 找到Linux 16的那一行,将ro改为rw init=/sysroot/bin/sh 4 - 现在按下 Con ...
- Mac上MySQL忘记root密码且没有权限的处理办法&workbench的一些tips (转)
忘记Root密码肿么办 Mac上安装MySQL就不多说了,去mysql的官网上下载最新的mysql包以及workbench,先安装哪个影响都不大.如果你是第一次安装,在mysql安装完成之后,会弹出来 ...
- Atitit godaddy 文件权限 root权限设置
Atitit godaddy 文件权限 root权限设置 1. ubuntu需要先登录,再su切换到root1 2. sudo 授权许可使用的su,也是受限制的su1 3. ubuntu默认吗roo ...
- Mysql 忘记root密码处理办法
一.更改my.cnf配置文件 1.用命令编辑/etc/my.cnf配置文件,即:vim /etc/my.cnf 或者 vi /etc/my.cnf 2.在[mysqld]下添加skip-grant-t ...
- Ubuntu设置root用户登录图形界面
Ubuntu默认的是root用户不能登录图形界面的,只能以其他用户登录图形界面.这样就很麻烦,因为权限的问题,不能随意复制删除文件,用gedit编辑文件时经常不能保存,只能用vim去编辑. 解决的办法 ...
- php利用root权限执行shell脚本
vi /etc/sudoers , 为apache用户赋予root权限,并且不需要密码,还有一步重要的修改(我被困扰的就是这个地方) root ALL=(ALL) ALL apache ALL= ...
- linux下如何添加一个用户并且让用户获得root权限
1.添加用户,首先用adduser命令添加一个普通用户,命令如下: #adduser tommy //添加一个名为tommy的用户 #passwd tommy //修改密码 Changing pass ...
- 如何重置硬盘遭到“损坏”的Linux系统root用户密码
传统印象下Linux是非常坚不可摧的,具有千年不更新,万年不重启的美名.而随着虚拟化的推进,很多跑在虚拟化上的Linux由于先前基础架构的脆弱,变得适应性“越来越不好”,体现在IP存储如果出现节点故障 ...
- centos下MYSQL 没有ROOT用户的解决方法。
SbTest for using sysbench creating scritps: sysbench --test=oltp --oltp-table-size=100000 --mysql-db ...
随机推荐
- Java多线程(一) —— 传统线程技术
一.传统线程机制 1. 使用类Thread实现 new Thread(){ @Override public void run() { while(true){ try{ Thread.sleep(2 ...
- jenkins+maven+Tomcat8实现热部署
个人记录 公司使用jenkins实现代码自动更新并部署 采用jenkins安装方式为war包,版本为:2.138.3,启动方式为Tomcat启动jenkins, 该博客操作步骤有些地方进行简化,各位需 ...
- Hashtable 和 HashMap 以及 ConcurrentHashMap
备忘: ConcurrentHashMap与Hashtable的区别: Hashtable中采用的锁机制是一次锁住整个hash表,从而同一时刻只能由一个线程对其进行操作:而ConcurrentHash ...
- [AT1999] [agc002_e] Candy Piles
题目链接 AtCoder:https://agc002.contest.atcoder.jp/tasks/agc002_e 洛谷:https://www.luogu.org/problemnew/sh ...
- 【ARC069F】Flags
Description 数轴上有 \(n\)个旗子,第\(i\)个可以插在坐标\(x_i\)或者\(y_i\). 请最大化两两旗子之间的最小距离. \(2 \le n \le 10^4\),\ ...
- 【BZOJ2731】三角形覆盖问题
想象一条平行于\(y\)轴的扫描线,从低往高扫描.如何确定关键高度才能使每两个关键高度之间分割出的图形易于计算呢? 关键高度有:三角形底边高度.三角形上顶点高度.三角形交点的高度. 如此分割,我们 ...
- GridView中网络图片延迟加载导致高度计算失败的问题
在使用下拉刷新以及加载更多控件的时候,出现了列表上滚不完的现象,经过半天的分析,最后得出结论:由于图片采用了延迟加载,导致列表按照没有加载图片时候的大小进行布局,相关的加载更多控件也就傻逼了. 最终解 ...
- bzoj 4871: [Shoi2017]摧毁“树状图”
4871: [Shoi2017]摧毁“树状图” Time Limit: 25 Sec Memory Limit: 512 MBSubmit: 53 Solved: 9[Submit][Status ...
- 【THUSC2017】杜老师
题目描述 杜老师可是要打+∞年World Final的男人,虽然规则不允许,但是可以改啊! 但是今年WF跟THUSC的时间这么近,所以他造了一个idea就扔下不管了…… 给定L,R,求从L到R的这R− ...
- cpplint
Cpplint是一个Python脚本,作为一款开源免费的代码静态检测工具,Google也使用它作为自己的C++代码检测工具,也就是说,只要你的代码遵从Google C++代码规范,那么Cpplint将 ...