整理了一些我了解 Android root 过程中看过的文章。
抽出了一些我觉得必要的部分写在这里,相信看完至少能对谈及的几个系统or框架有个宏观的了解。
解锁Bootloader
限制我们获取root权限的第一步是Bootloader锁。
手机开机时,最先运行的小程序就叫做bootloader(PC的BIOS+引导?),我们用它来进行开机自检和初始化手机硬件,它会指引手机找到系统分区并启动操作系统,相当于电脑上的BIOS.
通过bootloader,我们可以启动正常的操作系统,也可以启动recovery系统(什么是recovery系统?下面讲)
厂商通常会对手机的bootloader上锁,这样它就只能运行厂商认证过的操作系统和recovery了。如果boatloader发现要运行的系统不是指定的系统,就会阻止它运行。
对bootloader解锁,意味着我们可以运行第三方的操作系统和recovery。
Bootloader的解锁方式有两种,官方解锁和强制解锁。
- 很多手机厂商提供了官方解锁的方式,可以去手机官网发邮件或者通过论坛申请解锁boatloader
- 但有些手机不支持官方解锁,我们有一些别的民间方法强制解锁,具体方法可以自行搜索
手机品牌+手机型号+解锁bootloader
# 获得Root权限的原理
参考:
熟悉 Linux
的童鞋都知道,我们只需要打上 su
的命令,就可以拥有管理员权限。
su是运行环境变量PATH下面的一个可执行文件,当任意软件运行su时,软件的权限就会被提升到Root权限。
未Root的安卓系统是没有su这个文件的,所以Root一个手机,就是将su文件放入到系统运行环境变量PATH下面。 之后软件运行su程序,就可以提升到Root权限。
通常在PATH下的目录有:
/sbin
/vendor/bin
/system/sbin
/system/bin
/system/xbin
一般把su
文件放到/system/xbin
下
我们先来看一段古老的代码:
cp /data/tmp/su /system/bin/ #(copy su 到/system/分区
chown root:root su #(su的所有者置成root
chmod 4775 /system/bin/su #(把su置成-rwsr-xr-x
(su即supersu,超级用户的缩写 r代表该文件可读,w代表可写,x代表可执行,-就代表没有该权限)
这段代码的作用是获取root
可是若要修改system分区 就必须先获得ROOT权限 然而这段代码就是用来获取ROOT权限的 这样就进入了死循环。
聪明的开发者们想到了许多种方法
# 如何Root?
目前常见的方式有以下两种:
- 一键Root工具
- 刷入第三方Recovery,再刷入SuperSU.zip/再刷入已经含有Root权限的ROM包
一键Root 工具(利用系统漏洞)
我们刚刚说过,Root一个手机,其实就是把su文件放入安卓系统文件夹/system/xbin
首先要解决的问题是,安卓系统文件夹对于普通用户来说,只能读不能写。作为一个普通用户,我们是怎么将一个su文件放入系统文件夹呢。
方法就是,利用系统漏洞,将某一个进程提权到Root权限,并利用它将su文件放入到系统文件夹
一键Root就是使用的这种方法
- 首先利用系统漏洞获取某个进程的Root 权限
- 使/system/xbin/目录可写,并拷贝su到/system/xbin/
- 拷贝并安装Root权限管理器
下面说说一键Root的好处和坏处
- 好处:简单,易懂好,操作
- 坏处:很多机型无法Root,即使是同一个机型,效果也不稳定,有时候可以Root成功,有时候无法Root成功。甚至有时候软件显示成功,其实并没有成功。Root失败之后,还有可能导致死机,无法开机,变砖块等随机问题。
而且一键Root利用了手机的系统漏洞对进程提权放入su文件。随着安卓系统的发展,这些漏洞被逐渐修复,早期寻找系统漏洞的方式在大多数机器上无法被用。
这就是为什么刷机党们很少采用一键Root
(利用第三方Recovery
今天,最常用的方法就是卡刷,安全高效,进入recovery执行代码。
Recovery? SuperSU?ROM包? 这是些啥玩意?
我们先来复习一下
Root就是赋予手机管理员权限
本质就是将su程序放入手机系统文件夹下面
而难点在于系统文件夹没有管理员权限,可读不可写,我们无法轻而易举地把su文件放在里面
这时候,我们可以利用第三方的Recovery将su程序放入系统文件夹
什么是Recovery?
一个安卓系统有以下不同的分区
/boot
/system
分区包含系统主体文件/recovery
分区里放的是recovery.img 镜像文件/data
分区包含APP的安装包APK文件和相应的数据/cache
分区包含缓存文件放在cache分区/misc
Recovery像是一个独立的微型系统,可以不依赖于安卓操作系统主体单独运行。Recovery的中文名是恢复,顾名思义,当手机系统文件被损坏从而不能正常启动时,我们可以进入recovery小系统对主体系统进行修复。
手机正常启动时,我们进入的是普通的操作系统。但是通过手机厂商预设的组合键(通常是电源+音量加),我们可以进入recovery 系统。
进入recovery 系统之后,我们可以对安卓主体系统进行自由管理
但手机本身是自带厂商的官方recovery的,这个recovery功能较少,一般可以清除缓存,擦除所有数据,刷入官方指定的系统
如果我们有第三方的recovery ,就可以实现更多功能,例如调整分区大小,进行文件管理,还有刷入SuperSU.zip以及第三方的ROM 包。
目前最最好用的第三方Recovery叫做
TWRP (TeamWin Recovery Project )
, 它是由国外android爱好者开发的一款工具 ,可以从以下网址下载
https://twrp.me/
软件授权管理
但如果每个应用都拥有root权限,那手机还有什么安全可言?
因此,出现了软件授权管理工具 SuperSU和Magisk 。
什么是SuperSU?
SuperSU由国外大神开发,是全球用户都在用的授权管理软件。
分为APK(安卓手机应用)
和ZIP(文件压缩包)
两个版本。
- ZIP为用户提供了Root的安卓设备的解决方案,市面上全部机型的Root权限获取与管理 ;
- APK主要功能是对已获得Root权限的设备进行进行权限管理。
到SuperSU 的官网,我们就可以看到apk文件和zip文件
SuperSU 的变味
参考:
由于SuperSU被收购和新兴框架的出现(Magisk提供的新的root解决方案),现在网上关于SuperSU的讨论基本停在了2017年末。
实在想试下,这篇文章值得参考: 如何用SuperSU和TWRP来root安卓手机
Magisk vs SuperSU
参考:
在Android世界中,Magisk是新手,SuperSU是老手。这两种流行的工具可用于某些相同的事物,但是它们的工作方式截然不同。
-
首先,让我们谈谈SuperSU如何获得root权限。SuperSU更改系统文件并将新文件添加到linux的系统分区。
在Google加强安全性之前,这种方法一直有效,直到Android Marshmallow出现。修改系统分区会向尝试检测根目录的应用发送红色标记。Google SafetyNet是一个用于监视系统的API,如果检测到篡改,它将阻止某些应用程序运行。您不能将Google Pay或Netflix与SuperSU一起使用。修改系统后,您也不会获得任何 OTA(Over The Air Updates, 无线下载 )更新 。
-
Magisk被称为“systemless” root ,因为它不涉及任何这些系统文件。
它修改启动分区,并保留了系统文件。这种修改只是虚拟地覆盖在原始文件上。当某些东西请求系统文件时,修改后的版本将被发送到magisk指定的位置。但是由于所有系统文件都是完整的,因此可以欺骗SafetyNet认为一切正常。应用仍然可以在有被root的手机上运行。
模组化
Magisk的一个功能是SuperSU不包含的。Magisk Manager应用程序允许用户对root权限进行管理,同时他还是一个模块库。“模块”是一些可以被安装的rom,可以做很多很cool的事情。
比如Active Edge自定义,表情符号替换,RAM管理修复,Camera2API启动器等等。
SuperSU没有内置模块,但是拥有root用户可以让您使用Xposed等其他框架来安装mod。
开源和闭源
两者之间的另一个大区别是开源与开源。SuperSU是封闭源,而Magisk是开放源。开源的伟大之处在于任何人都可以查看Magisk源代码。而SuperSU于几年前出售给一家名为CCMT的公司后就闭源了。有些人不喜欢使用陌生公司的封闭源软件不难理解。
毕竟Android是建立在开放源代码模型上的,这使很多人更喜欢Magisk的方法。(尽管大多数人不会去看他开源出来的代码。。)
Magisk原理
参考:
Magisk原理和下面要讲的Xposed很像。二者的工作机制都是「拦截」。
-
Xposed 通过劫持 Android 系统的 zygote 进程来加载自定义功能,这就像是半路截杀,在应用运行之前就已经将我们需要的自定义内容强加在了系统进程当中。
-
Magisk 则另辟蹊径,通过挂载一个与系统文件相隔离的文件系统来加载自定义内容,为系统分区打开了一个通往平行世界的入口,所有改动在那个世界(Magisk 分区)里发生,在必要的时候却又可以被认为是(从系统分区的角度而言)没有发生过。
Magisk 的实现方式就像是一种魔法,当被挂载的 Magisk 分区被隐藏甚至被取消挂载时,原有系统分区的完整性丝毫未损,玩需要 root 验证的游戏、运行对设备认证状态有要求的应用甚至进行需要验证系统完整性的 OTA 更新都没有任何问题。
因此严格来说 Magisk 可以被看作是一种文件系统,这种文件系统通过巧妙的实现方式避开了对系统文件的直接修改,从稳定性上来看要优于以往任何一种系统框架,这也是当前它在玩机社区广受认可和好评的原因所在。
它的魔力不止于 root
很多人对 Magisk 的初步认识可能是 root ——在 SuperSU 销声匿迹之后,它自然而然就成为了当前 Android 社区用来获取 root 权限的主流方式。
不过 Magisk 特殊的运作机制还赋予了它相较于 Android 平台其他定制工具而言独一无二的特质——systemless
。这种 systemless 特质让 Magisk 拥有了获取 root 权限之外的诸多优势:
-
一方面,得益于独特的挂载机制,使用 Magisk 时我们可以有针对性地隐藏 root,甚至暂时隐藏 Magisk 本身。
如此一来,不仅「root 模式下使用特定应用」成为了可能,就连无缝 OTA 更新这种「魔改党」们想都不敢想的事也变得不再遥远。在 Magisk Manager 应用的设置中,我们甚至还可以用随机包名对 Magisk 进行重新安装,让它从其他应用的眼皮底下彻底消失——多么具有魔法特质的高明手段!
-
另一方面,挂载系统的存在,也让 Magisk 拥有了多样的模块化生态系统。
既然用了「开外挂」的实现方式,那不妨就多挂载一些额外的东西,字体、音效、驱动……甚至 Xposed 本身。Magisk 提供了一个独立于系统分区以外的、可以随时隐形的「沙盒」,那自然不能将其才华禁锢于 root 这一件事上。在 Magisk 的模块仓库里,我们可以找到各式各样的模块(modules)来满足自己的定制化需求,借助这些模块,我们在 root 之后能做的事情其实也还有很多。
在这里的讨论语境下,Magisk 如何给人们留下「框架」这一认知误区的原因就浮出水面了。只是功能方面好不逊色的 Magisk,稳定性和上手门槛对大部分用户来说都更加友好。
如何安装 Magisk
作为一套复杂的文件系统,Magisk 的安装步骤却是十分简单。
视频:https://www.bilibili.com/video/BV14i4y1t7mS?from=search&seid=1656913929162768577
在电脑上配置好 adb 环境 并解开 Bootloader 锁后(自行搜索手机品牌+手机型号+解锁bootloader
),如果你的设备有来自 TWRP 的官方支持,只需在打开 USB 调试后将手机与电脑相连,然后打开电脑端的命令行窗口:
- 执行
adb reboot bootloader
进入Bootloader
界面 - 执行
fastboot boot TWRP.img
进入临时TWRP
- 在
TWRP
中刷入你下载的Magisk
安装包
没有官方 TWRP 支持的设备安装 Magisk 的步骤要稍微复杂一些:
- 从你的刷机包中提取当前固件的 boot.img 文件,将它传入到安装了 Magisk Manager 的手机中
- 进入 Magisk Manager —— 安装(install)—— install —— 修补 boot 镜像文件
- 然后选择传入的 boot.img 文件进行生成,并将生成后的 Patchedboot.img (姑且这么命名) 传输到电脑上。
随后我们使用 Magisk 应用对 boot.img 进行重新打包:
8. 打开命令行窗口
9. 执行 adb reboot bootloader 进入 Bootloader 界面
10. 执行 fastboot boot Patchedboot.img 来加载生成后的 boot 分区文件获取临时 root
此时进入系统,你会发现你已经成功安装了 Magisk(如果显示没有安装则为获取失败,请检查操作过程重新尝试),但这还不够,我们还得进入 Magisk Manager,选择安装(install)——install——Direct Install(直接安装)才能将临时 root 转换为永久 root。
三星、华为等特殊机型的 Magisk 安装方法参见 Magisk 官方帮助文档。
安装完 Magisk 后,我们就可以通过 TWRP 或者 Magisk Manager 刷入获取到的模块了。模块的获取方式可以是 Magisk Manager 自带的模块仓库,也可以是其他第三方论坛(如酷安、XDA 等)。
卸载 Magisk 最为彻底的方式就是在 Magisk Manager 中点击「卸载」、「完全卸载」,应用会自动下载刷完 uninstall.zip 卸载包、自动卸载它自己、自动重启。如果你无法进入系统,在 TWRP 中手动刷入 uninstall.zip 卸载包即可。
至于哪些模块值得刷,就是完全看个人需求了。
Xposed原理
Xposed与root关系并不大
我们常常能看到自动抢红包插件 破解应用
这些软件的运行都需要Xposed框架
先上概念
原理:劫持Zygote进程及其创建的虚拟机,拿自己的app_process覆盖掉Android原生提供的文件,app_process在启动过程中会额外加载XposedBridge.jar这一个包,从而改变APP的运行结果。
(看不懂没关系 下面详解
Zygote进程:追溯到开机的一瞬间 【Zygote进程】在内部会先启动【Dalvik虚拟机】,加载一些必要的系统资源和系统。在系统启动脚本system/core/rootdir/init.rc文件中,我们可以看到启动【Zygote进程】的脚本命令:
import /init.${ro.zygote}.rc
app_process:app的启动程序。 【zygote fork()】调用一个 【app_process】作为app的载体(细胞核叫一个蛋白质作为营养物质的载体,物质在载体上才能被运输,app也是一样,有载体才能顺利运行),xposed会把系统自带的【app_process】文件替换成【xposed app_process】
再来看一遍概念:劫持Zygote进程及其创建的虚拟机,拿自己的app_process覆盖掉Android原生提供的文件,app_process在启动过程中会额外加载XposedBridge.jar这一个包,从而改变APP的运行结果。
Xposed劫持了Zygote进程。原本是zygote调用【app_process】来运行程序,现在有了xposed后,zygote调用【被xposed替换后的app_process】来运行程序,使得程序在开启时,额外加载一个jar(可理解为游戏Mod),从而改变APP的运行结果。
什么是ROM包?
华为,小米,OPPO等都是安卓手机,但它们的系统又各不相同。
华为手机的系统叫做EMUI,小米手机的系统叫做MIUI, OPPO的操作系统叫做ColorOS。
但是,这些系统本质上都是基于安卓系统的,他们对安卓系统进行优化和定制化,加入自己特有的APP和服务。
比如我们看到很多华为手机出厂就自带华为APP,这些就是 定制化之后的安卓系统 , 这些安卓系统就叫做ROM包
ROM包(ROM image)只读内存bai镜像
ROM(Read-Only Memory)就是和RAM(Random Access Memory)一对的那个ROM
如何通过第三方Recovery进行Root
所谓的刷ROM或者刷机,指的就是重装手机操作系统。刷机的步骤主要分为以下三部:
- 解锁bootloader
- 刷入第三方recovery
- 刷入SuperSU.zip 或者ROM包