Android刷机笔记(一)

*郑重声明:本文内容只为学习研究之用,如有人用于非法用途,产生的后果笔者不负任何责任。

我们的最终目标是获取设备root权限,之后就可以实现我们想要但手机厂商没有提供的功能了。

Android设备root有两个思路。一是将su程序放在/system分区,系统启动时就可以获得相应权限。但是,/system分区只能读不能写,就需要找到系统漏洞,将su程序写入。因此,以前检测设备是否root的方法是检查/system/bin,/system/xbin等目录下是否有su程序。之前的很多一键root工具就是这样实现的,但是Android 6之后就越来越难了。

第二个思路就是刷入第三方recovery后安装root管理工具,或通过对官方提供的刷机包boot.img打补丁,然后安装Magisk的方式实现root。root权限管理工具可以使用Supersu和Magisk。Supersu只支持到Android8 ,Magisk一直在维护。另外,Magisk还能隐藏起来,躲过root检测,因此,我们主要研究Magisk。

刷入recovery获取root权限主要步骤:

  1. 解锁bootloader

  2. 获取与机型匹配的TWRP包,并刷入设备;

  3. 加载MagisK/Supersu管理工具

解锁Bootloader

为什么要解锁Bootloader呢?这需要从系统的启动讲起。

一般情况下,开机引导程序Bootloader执行后,Android有三种启动模式:

  1. fastboot: 仅初始化了内核,能够通过PC端控制手机,将系统镜像刷入手机的各个分区,包括内核
  2. recovery:已经加载了部分文件系统,能够读取刷入系统更新包
  3. main system:正常开机启动的系统

Bootloader相当于PC系统的BIOS,负责初始化硬件,开机自检,指引后续操作系统启动。Bootloader完成硬件初始化后,可以通过fastboot引导进入正常的系统启动模式或者recovery系统。这里的recocery系统就是我们即将刷入的系统。正常的操作系统即手机厂商提供的系统。

目前,很多厂商都对Bootloader上了锁,即对加载的系统固件做验证,若刷入第三方修改的固件,则验证不通过无法加载。需要向厂商申请解锁,已解锁的设备在加载固件时会忽略验证失败的结果,完成后续加载。

目前主流厂商设备解锁情况:

  • 小米:在官方论坛申请解锁,通过后下载解锁工具安卓步骤解锁。申请通过的时长不确定,有秒通过的,也有一周才通过的。地址:http://www.miui.com/unlock/index.html
  • 一加:可直接在设备开发者选项中解锁OEM。去论坛下载工具箱:https://www.oneplusbbs.com/,或下载大侠阿木工具箱:https://www.daxiaamu.com/5864/
  • OPPO:部分机型可解锁。需要下载深度测试APP,提交申请后由厂商审核通过才能解锁,需要2到3个月。
  • realme:可在开发者选项中解锁OEM。然后下载安卓深度测试APP,提交申请后由厂商审核才能解锁。数量有限制,每个月解锁1000名。
  • 华为:2018年关闭了申请解锁码的通道,据网上流传,可以从淘宝购买解锁码。也可以参考:https://www.52pojie.cn/thread-816065-1-1.html的方法,需要首先回退系统版本,尝试root。root成功之后再解锁bootloader, 然后再刷入新的ROM。
  • VIVO:不能解锁。

不做解锁限制的设备,可以参考https://www.jianshu.com/p/54edc48203db

  • 首先,进入fastboot模式(一般设备是按住【power】和【音量+】,有的是【音量-】)
  • 通过fastboot flashing unlock命令解锁
  • 执行命令fastboot flash+ 分区 + 分区镜像文件,刷入镜像。

这里使用到了一个工具fastboot,它是一个PC设备通过USB或TCP/UDP与Bootloader通讯的协议,可以使用它,刷入第三方ROM。我们平时说的“线刷”,就是通过USB将手机连接至PC,使用fastboot直接将system.img、boot.img、recovery.img烧写入设备。

系统推送更新使用的是“卡刷”,将系统更新包下载至手机存储空间(以前是sd卡),然后进入recovery启动模式,加载更新包。进入recovery模式时,已经加载了部分文件系统,所以才能读取存储空间的update.zip更新包,但是仅限于厂商的官方系统固件。

如果我们想要更新第三方固件,就需要刷入第三方recovery.img,只能“线刷”,使用更底层的fastboot。

刷入第三方Recovery

首先,Android设备有几个分区,有各自的功能,能够进行单独的格式化和读写。比如执行命令fastboot flash boot boot.img可以更新boot分区。

  • /boot分区,系统启动引导程序和内核,系统正常启动用的就是boot.img

  • /system分区,存放Android系统框架和相关配置,系统预装应用等,可通过recovery刷入新的ROM。只能读不能写,传统的root方法就是再这个分区动手脚

  • /recovery分区,包括一个完整的内核和一些特殊的Recovery binary,能够读取固件更新其他分区。system分区损坏时,可进入此分区刷入新的ROM,恢复系统正常使用,或者系统升级时,重启设备进入recovery模式,加载update.zip包

  • /data分区,用户数据区,存储用户安装的应用、短信、设置等信息。恢复出厂设置即擦除data分区

  • /cache分区,存储用户经常访问的数据和应用程序组件,清楚后会自动重建,不会影响系统运行

使用fastboot将第三方Recovery镜像刷入recovery分区,这里推荐使用TWRP。下载地址:https://twrp.me/Devices/

  • 找到与设备品牌型号对应的镜像,点进去(以Mi max 2为例)

  • 找到twrp镜像的下载入口,点进去下载最新版本的镜像,保存至本地;

  • 设备进入fastboot后,连接至PC端,打开cmd终端,切换至刚刚下载的twrp镜像的目录,并执行fastboot flash recovery xxxx.img,这里“xxxx.img”即为下载的twrp固件

  • 重启,fastboot reboot,为了防止重启时回到原来的系统,需要在输入重启命令后,按住recovery快捷键,启动到TWRP

刷入TWRP后,就可以实现更多功能,如刷入Supersu.zip获取并管理root权限等。

Magisk

获取和管理root权限一般使用supersu和Magisk。但是,Android8之后Supersu停止更新了。Supersu修改了system分区,加了一些新文件到system分区。Android8之后Google加强了安全校验(SafetyNat接口https://developer.android.com/training/safetynet/attestation,具体原理在这里挖个坑,后面再来填坑吧),system分区被修改后会向检测设备是否root的应用返回警告。而Magisk使用了systemless root,修改了系统的boot分区,没有动system分区,就绕过了SafetyNet接口的检查。

Magisk 安装有两种方法:

  1. 下载Magisk安装包放在存储区,重启设备,进入recovery模式,启动TWRP,点击TWRP的“安装”按钮,找到Magisk安装包,点击安装,重启设备即可。
  2. 不刷入第三方recovery,直接安装Magisk。参考:https://topjohnwu.github.io/Magisk/install.html。首先,在官网下载与自己手机型号匹配的系统固件包,提取其中的boot.img文件,并传入手机。在手机中安装Magisk Manager,修补boot.img,生成patchedboot.img,并将其传入PC端。在通过PC端命令行执行adb reboot bootloader进入Bootloader,执行fastboot boot Patchedboot.img刷入修改后的boot分区文件,获取临时root。最后,进入MagisK Manager,选择install–直接安装,才能获得永久root权限。

方法一实际安装过程如下:

下载Maisk安装包:https://github.com/topjohnwu/Magisk/releases,放进手机。

进入recovery模式:

在存储空间找到Magisk刷机包,点击开始加载:

这里刷入时报了一个错误:

(忘记留图片了,这个图片是搜解决方法时找到的,跟我的报错一样)

提示:Please restore stock boot image。以为是MagisK版本问题,从V17试到V21都不行。最后发现,原来是我之前使用Supersu root过,boot.img被修改了,需要在TRWP中卸载root。点击进入高级选项,可以看到一个清除Root按钮,点击后,TWRP将会重新刷入boot.img。

清除Root完成后,再重新刷入Magisk,就可以了。

重启系统,打开MagiskManager应用,可以看到:

说明已经安装完成了。

Magisk实现原理:由于它是通过启动时在 boot 中创建钩子,把 /data/magisk.img 挂载到 /magisk,构建出一个在 system 基础上能够自定义替换,增加以及删除的文件系统,所有操作都在启动的时候完成,实际上并没有对 /system 分区进行修改(即 systemless 接口,以不触动 /system 的方式修改 /system)。

开发者手册:https://topjohnwu.github.io/Magisk/guides.html。后续可根据需要开发一些模块,本地安装至Magisk。

参考文献:

【1】https://github.com/topjohnwu/Magisk

【2】https://android.googlesource.com/platform/system/core/+/master/fastboot/README.md

【3】https://www.52pojie.cn/thread-816065-1-1.html

【4】https://www.52pojie.cn/thread-903485-1-1.html

【5】https://www.jianshu.com/p/393f5e51716e