引语

Root,一直都是机圈玩家的基本功。从最早的杂七杂八的一键Root工具,到后来的SuperSU、Magisk,Google与第三方开发者始终在不断周旋,可谓是道高一尺魔高一丈了。


Root简史

一键Root

最早的一键Root工具(例如360一键Root、Kingroot等)大多都是通过早期版本的安卓漏洞实现的。通过某些漏洞获得Root权限,然后将su文件放入特定的目录下实现Root。

臭名昭著的“KingRoot”

这种操作的实质就是一种不安全行为。例如有些Root工具会打着“一键Root”的名号,不仅将你的手机Root了,还通过Root权限做了一些侵犯用户权益的事(最简单的就是把自己设置为系统应用,还无法删除),这就是十分危险的问题。


SuperSU

后来,通过Chainfire的努力,SuperSU横空出世。SuperSU的出现可以说是让刷机界进入了一个新的时代。SuperSU不仅是一款获取Root的工具,它同时还是一款管理Root权限的工具。比起不知道是不是流氓软件的各种“一键Root”工具,SuperSU作为一款开源软件在出色地完成Root工作后,还保持着无广告、无捆绑、不流氓等特性,收到广大玩家的一致好评。

SuperSU截图

可惜的是,2018年,SuperSU被一家位于美国的中国“Coding Core Mobile Technology LLC”公司收购,SuperSU项目转为了闭源。最后的开源版本仅支持Android 7.0。当然,人们是不会喜欢一个安全性未知的闭源程序接管他们手机里的最高权限的。因此,SuperSU在圈子中落幕。


Magisk

2015年9月末,Google发布了新一代Android Marshmallow,即安卓6.0(棉花糖)。在这一版本的系统中,Google加入SafetyNet。

SafetyNet

SafetyNet 提供了一组服务和 API 来保护您的应用免遭各种安全威胁,包括设备篡改、不良网址、潜在的有害应用以及虚假用户等。 ——Android 开发者

简单来说,SafetyNet就是系统完整性的检测程序。通过SafetyNet,系统会了解到其本身是否被修改(例如补入su文件、修改系统文件、解锁Bootloader、刷入第三方ROM等)。一旦未通过SafetyNet,设备就无法通过验证,从而导致刷机的用户无法使用Google Play、Netflix等使用了SafetyNet功能的应用,也无法获得任何OTA更新。这是当时刷机玩家们最头痛的问题。

2015年10月,Chainfire在XDA论坛上发布了在“无需修改系统文件获取Root权限”的实验性方法

同年11月,受Chainfire的启发,国人开发者吴泓霖将此方法应用在了HTC One (M8)设备上 。

2016年5月,吴泓霖发布了无需修改系统文件的非官方版Xposed框架。发布后,XDA上的部分开发者请求移植自己的模块,由于技术限制,吴泓霖拒绝了这些请求,这也是Magisk开发的灵感。8月,Magisk的最早期版本发布。

Magisk截图

Magisk也是一款获取Root权限以及管理Root的程序。但他与SuperSU不同之处在于,它不仅可以加载丰富的第三方模块(类似Xposed),同时 Magisk 通过挂载与系统文件相隔离的文件系统来加载自定义的内容,并为系统分区打开一个“平行世界”的入口。所有的更改都发生在那个世界(即Magisk 分区),必要时可以认为(从系统分区的角度)没有发生任何修改。这么做的好处就在于可以更加容易地隐藏系统被修改的事实,从而通过SafetyNet检测程序。

Magisk的这种通过对其他验证系统完整性的应用程序进行隐藏进而通过SafetyNet验证的方法被命名为Magisk Hide。

如上图,Xposed通过劫持Zygote进程来加载自己的功能(对系统文件进行修改),而Magisk通过自己的Magisk分区实现修改。

但在2021年8月,随着Magisk的开发者吴泓霖加入Android安全团队,MagiskHide 和 Magisk Module Repository 都将在未来发布的版本中被移除。


Magisk的使用

声明

上文提到 Magisk是一款易于使用、开源干净的Root权限管理程序,那么现在来简述一下我们如何通过Magisk获取Root权限并加载一些简单的第三方Module。

Magisk

警告:本文作者不承担任何失败风险,请在刷机之前做好备份以及心理准备。值得注意的是,绝大部分设备在解锁Bootloader之后是一定会失去保修的,这意味着如果刷机后出现任何问题,商家不会承担任何修理费用。


前置知识

在开始之前,我们还需要知道一个概念:安卓手机从按下开机键到进入系统,有哪些流程?

首先,我们按下电源键,引导芯片加载引导程序(即BootLoader)到内存中。

然后,执行Bootloader程序,初始化一些硬件,并启动Kernel。

在Kernel这一步中,主要是对Linux内核相关内容的初始化。

最后一步即是启动Android系统程序。

Android启动流程示意图

由于我们并不需要知道Bootloader后续步骤的详细内容,因此在这里我们不再过多地展开叙述。感兴趣的可以参考《Android Q 开机启动流程》


而在这里我们再对上述流程进行进一步简化。我们需要知道的,仅是Bootloader--boot--system三步内容。BootLoader通过检测,启动认证的boot分区内容,进而启动Android系统。而我们的Magisk,就是在Boot分区中写入su文件,获取Root权限。

因此,想要完成“让BootLoader加载修补后的boot分区从而启动Android系统”这个目标,我们要完成两件基本工作:

1、解锁Bootloader;2、刷入修补后的boot分区镜像。


解锁Bootloader

对于条件1,不同厂商的机器有不同的解锁方式,但他们无一例外都是不可逆的操作,同时还需要清除手机数据。

Bootloader

目前,华为手机已不支持解锁Bootloader,因此不建议在华为/荣耀等品牌的手机中执行相关操作。

同时,OPPO/VIVO系列手机解锁Bootloader也变得十分困难。因此,建议使用小米/一加等官方许可解锁Bootloader的手机。


提取Boot文件

条件2、刷入修补后的boot分区镜像。

这也是重点内容,因为刷入了修补的boot镜像,基本就等于获取完了Root权限。

要想修补boot分区,我们要做的第一步就是获取目前系统中使用的boot分区文件。在这里,我们有若干个方法获取。

通过匹配的固件包(ROM)提取boot.img

这种方法需要找到本机正在使用的固件(ROM)版本,从固件包中提取boot.img文件。

首先下载本机的固件包(ROM包),将payload.bin文件解压,放入这里提供的解包工具的payload_input文件夹内,然后运行payload_dumper.exe,提取所有的分区镜像文件。

payload_dumper

打开payload_output文件夹,找到boot.img并放入手机存储内。

在这里我们主要使用这一种方法,其他方法(例如通过Recovery提取、Terminal内dd命令获取等)由于机型限制苛刻或条件要求太高等问题不再阐述。


修补Boot文件

接着,我们需要修补boot镜像文件。

上文提到,由于吴泓霖加入了Android安全团队,因此Magisk Hide等内容后续将不会再支持。因此我们这里建议使用最新的Magisk以便开启Zygisk。

首先,我们需要在Github下载最新的Magisk进行安装

手机中安装Magisk后,打开Magisk,点击Magisk标题右侧的“安装”按钮。

在下一页面中,我们需要点击“选择并修补一个文件”。由于本人的手机已经Root了,所以这里会出现“直接安装”的选项。

修补后,修补的img镜像文件会保存在Download文件夹内。我们需要将其拷贝到电脑中。

这时,我们对boot.img已经修补完成,需要将其写入手机的boot分区内。


写入修补的Boot文件

重启手机进入fastboot模式,可以使用adb reboot fastboot来确保进入了fastboot模式。进入fastboot模式后,将手机与电脑连接,输入指令fastboot boot boot.img(这里'boot.img'为电脑中修补的boot文件的实际路径),手机将会通过修补的boot启动系统。但此时我们并未修改手机中的boot分区。此时我们暂时性的拥有了Root权限,但是会在下一次重启后失效。

因此我们重新打开Magisk程序,依旧点击第一个"安装"按钮,在接下来的页面中点击"直接安装(推荐)",Magisk将会提取手机内的boot,修补后重新刷入。此时我们就完成了Root权限获取的操作,也就可以正式使用Magisk了。


隐藏Magisk

但此时并未真正的结束。当我们使用银行App等程序时,可能会出现银行App提示“已被Root”随后关闭程序的情况,这是由于我们未对Magisk对系统的修改进行隐藏。导致此类App由于调用SafetyNet的API或者自己的检测程序检测到系统完整性被破坏,从而禁止用户使用此类需要较高安全度的程序。因此,我们需要对Magisk的修改进行隐藏。

这里我们使用 Zygisk + Shamiko 的方式实现隐藏Root。

进入Magisk,点击设置按钮,将下方的“Zygisk”以及”遵守排除列表“打开,然后在“配置排除列表”页面中设置所有需要隐藏Root权限的App(例如各银行App等)。

完成操作后,关闭"遵守排除列表"选项,因为我们不需要使用Magisk自带的"排除列表"功能。

在"模块"选项卡中,点击"从本地安装",然后选择Shamiko模块包,完成刷入操作。

刷入完成后,重启手机即可对选中的App隐藏Root功能。


Xposed

Xposed是一个运行于Android操作系统的钩子框架。其通过替换Android系统的关键文件,可以拦截几乎所有Java函数的调用,并允许通过Xposed模块中的自定义代码更改调用这些函数时的行为。 因此,Xposed常被用来修改Android系统和应用程序的功能。——维基百科

Xposed Installer

Xposed也是目前玩家们最常使用的框架,它为我们打开了软件自定义的大门。最基础的用途就是下载一些例如“微X模块”的软件,对微信进行多功能多方面的自定义等等。但由于Xposed原项目已停止开发,其最高版本支持Android 8.0(Oreo),因此我们使用其移植版LSPosed进行操作。

由于LSPosed是使用Riru驱动的,而我们打开了Zygisk模式,Riru并不能与Zygisk兼容,那我们如何使用LSPosed加载一些Xposed模块呢?这里我们需要用到的是兼容Zygisk的LSPosed。

从本站下载支持Zygisk的LSPosed,然后将其拷贝到手机内。

然后通过Magisk刷入该模块,重启即可。重启后首次进入桌面时,LSPosed程序会需要置放一个快捷方式,只需按照需要放在桌面的相应位置即可。


本文部分图片来源网络,如有侵权,请通知站主进行删除。

Android的开机启动流程概述

CHAINFIRE正式退出SUPERSU,但发展仍在继续

浅析Android Root

topjohnwu.github.io

欢迎关注我的微信公众号 Saki的避风港 ,获取更多有趣知识。

最后修改:2022 年 01 月 09 日
赞助一杯冰阔落