Android的内核就是Linux,所以Android获取root其实和Linux获取root权限是一回事儿。
你想在Linux下获取root权限的时候就是执行sudo或者su,接下来系统会提示你输入root用户的密码,密码正确就获得root权限了。Android本身就不想让你获得Root权限,大部分手机出厂的时候根本就没有su这个程序。所以你想获得Android的root权限,第一步就是要把编译好的su文件拷贝到Android手机的/system/bin或者/system/xbin/目录下。我们先假设你可以把su放在bin下,接下来你可以在Android手机的adb shell或者串口下输入su了。上面说了,执行su,系统会提示你输入root用户密码,但你怎么可能知道密码呢?暴力破解吗?破解root的黑客当然不会这么做,这就涉及到第二个问题。
一般我们在Linux的console下输入 ls -l 会列出所有文件的权限。
比如:-rwxr-xr-x,用过Linux的人都知道r代表该文件可读,w代表可写,x代表可执行,-就代表没有该权限。第一个rwx代表文件所有者的权限,第二个rwx代表和所有者同组人的权限,第三个rwx代表其他用户对该文件的权限。但下面这个文件就比较特殊。


rws,它的执行权限标志位是一个s,s代表当任何一个用户执行该文件的时候都拥有文件所有者的权限,这文件的所有者是root,简单点说就是不管谁执行这个文件,他执行的时候都是以root身份执行的。那root用户执行任何文件都是不需要密码的。
这个时候如果你把su文件的权限置成-rwsr-xr-x会发生什么?su这个程序本来就是赋予执行者root权限的,但执行的时候又不需要密码,所以执行一下这个文件就自动成root身份了。
问题都清楚了,就是你需要把su拷贝到Android手机上,并且把su权限标志位置成-rwsr-xr-x。能把这个事情搞定你就成功root了一个手机。
大概意思就是两行代码
cp /data/tmp/su /system/bin/ #copy su 到/system/分区
chmod 1775 /system/bin/su #把su置成-rwsr-xr-x
那怎么搞定这个事情呢?Android的system分区本身不可写,只有是root的权限才能改动它,执行不了啊。
一个办法就是找一个本身已经有root权限的进程来启动我上面的两行代码,那我这两行代码一启动就是root权限,就可以顺利执行了。但是已经有root权限的进程都是出厂时候就装到手机上的,代码写死了,你没法控制它执行你自己的代码啊。这个时候就需要你找漏洞了,比如用来破解Android2.3 root权限的zergRush漏洞就是利用一个拥有root权限的进程栈溢出漏洞,栈溢出说白了就是这个进程读到了自有内存之外的地址空间,这段内存空间没分配给它,谁都能写这段内存,那我就可以把自己的两行代码预先写到这里,运行zergRush代码,然后等那个倒霉的进程执行我就行了。
如果各位有一定基础,能看懂我上面讲的,就基本知道原理其实并不难,难点在于找到漏洞。
zergRush的代码在这儿:
revolutionary/zergRush · GitHub
有兴趣的可以看看,网上也有很多分析文章。

另外iphone的越狱其实和Android的root是一回事儿,都是越权操作。所以越狱的方式也都差不多,也是找IOS自带程序的漏洞,只不过IOS安全性强一点,所以也比较难找。如果你发现你的iphone的某个自带程序经过一些特定操作会出现系统崩溃重启的现象,并且是可以复现的,那就很有可能可以用来越狱了。
好像是IOS6出来的时候,由于比较难搞,某个越狱团队就号召大家来找茬,发现的漏洞可以报告给他们用来越狱。说明IOS越狱越来越难。直接体现就是现在越狱需要的时间越来越长。
不过如果你发现漏洞也可以报告给苹果,苹果会根据漏洞严重程度给予一定奖励。我记得看新闻说南非一个家伙靠给苹果找漏洞赚25万美元。发家致富的好路子啊,哈哈。

================================================
谢谢各位支持
关于为什么su一定要放到/system/bin/或者/system/xbin/
首先,你当然可以把su这个程序copy到/data/分区,但你adb push进去的时候,su有这个程序的所有者肯定不是root,一般是shell什么的(记不清了,应该是和adbd这个进程的所有者一样),这个时候即使你把它权限置为-rwsr-xr-x,哪你运行它的时候也是shell身份运行的,su会提示你输入密码的。
第二我们root手机的目的是为了运行需要root权限的APP,比如goagent或者什么的。这些APP里代码需要获得root的时候是这么写的:
   Process p = Runtime.getRuntime().exec("su");
也就是它们在代码里调用了一下su这个程序,哪可以写成下面这个样子吗?
   Process p = Runtime.getRuntime().exec("./data/tmp/su");
我没写过APP,不太清楚,估计是不行的。换句话说你必须把su放到环境变量PATH所有的目录里,APP才能调用到它。如果你不想放到bin或者xbin下,你就必须给PATH增加一个目录。PATH是root权限才能修改的,你如果能修改PATH,说明你已经有root权限了,修改PATH就没必要了,还不如直接放到bin下面。

关于sudo
android的工程里没有sudo这个东西。sudo是为了给普通用户临时分配root权限的,Android里建立了很多用户,比如wifi,shell等等,这些用户可以访问那个文件,不可以访问那个文件,代码里已经写死了,权限也分配的很分明。它们在运行的过程中不需要临时获得root权限。所以Android不需要sudo这个程序。

— 完 —
本文作者: Kevin

【知乎日报——比新闻更多】听亲历者和内行专家八仙过海谈新闻,离现场更近一点。
下载知乎新 app - 知乎日报客户端(Android / iPhone 同步上架):
http://daily.zhihu.com/download

此问题还有 6 个回答,查看全部。
延伸阅读:
Android 手机 root 是否有必要?
Android 手机如何获得 root 权限?

更多相关文章

  1. Android防止内存溢出浅析/应用自动更新功能的代码实现
  2. android待机详细结合代码分析(二)
  3. android中的资源,资源与xml文件
  4. android与linux内核对比--《Android系统源代码情景分析》试读
  5. Android File Transfer – 在 Mac 上也能读取 Android 设备文件
  6. Android NDK入门实例 计算斐波那契数列一生成jni头文件
  7. Android studio project文件结构翻译
  8. pandaboard ES学习之旅——5 Android Linux内核源代码下载与编译

随机推荐

  1. 安装完成后如何找回SQL Server实例安装时
  2. SQL Server2014 哈希索引原理详解
  3. 恢复sql server 2000误删数据的解决办法
  4. SQLSERVER SQL性能优化技巧
  5. SQL字段拆分优化
  6. 异步的SQL数据库封装详解
  7. SQL Server中的连接查询详解
  8. SQL Server 2016 CTP2.3 的关键特性总结
  9. SQL中distinct的用法(四种示例分析)
  10. sql server 性能优化之nolock