分享

Android 刷机与ROOT流程整理

 YYAOyao7 2023-07-03 发布于河南

root 指的是使用户取得 Android 操作系统的超级用户(Super User)许可权的技术。用户通过 root,可以越过手机制造商的限制,卸载手机制造商预装在手机中某些应用,以及运行一些需要超级用户权限的应用程序。同时,root 也可能会让手机变得“不安全”(并不是说 root 使手机变得不安全,而是一些用户的使用习惯会使 root 后的手机变得危险)。

一、基本说明

权限现状

但是从棉花糖(Android 6.0)开始,Google 基本阻止了以前版本中最流行的 root 方法 —— 即,将 su守护程序 放置到 /system 分区,并在启动时取得所需的权限。道高一尺,魔高一丈,于是就出现了 systemless 的 root 方式,因为它不采取任何方式修改 /system 分区。

刷机目的

  • Android开发调试需要
  • 系统定制与修改

环境声明

  • Mac
  • Pixel 2 XL
  • Android 9

主要内容

  • 刷机
    • 设备解锁
  • ROOT操作
    • 刷TWRP
    • 刷入面罩
  • ROOT开发
    • ADB安装
    • 抓包
    • 操作

基本了解

视频入门教程

www.bilibili.com/video/BV1Ly…

资源下载

如果设备跟我的手机是一致的,可以使用我分享的资源(其它机型需要自己去收集):

  • Pixel 2 XL Android 9

二、设备解锁

一般来说,在开发者选项中基本都有一个名为「OEM 解锁」的选项。除了少部分流入我国市场的国外运营商有锁机外,此选项基本都可供用户开启。

解锁 Bootloader 后会立即清空手机中所有数据,但这也是很多玩机操作必经的第一步,建议尽早开启。解锁 Bootloader 还意味着手机等私密设备的安全性大大下降,不少厂商也会在解锁政策上附加上不少条款。

一旦你确认你的fastboot连接没问题,即可运行解锁bootloader命令:

fastboot flashing unlock 复制代码

或者:

fastboot oem unlock
复制代码

你现在应该在手机上看到一个操作界面,要求你确认此操作,使用音量键滚动选择和用电源键确认你是否确定要继续。

允许该过程完成,然后键入此命令重启:

fastboot reboot 复制代码

成功解锁Bootloader!至此解锁bootloader加载程序后,每次手机启动时,你都会见到一条警告,这没有什么可担心的,这是正常的!

三、刷机

刷机包资源

Google Pixel

www.jianshu.com/go-wild?ac=…

Pixel2 XL为例:

下载链接

下载后的目录结构为:

刷机步骤

此处以Pixel2 XL线刷为例,核心流程为:

  • 打开设备调试模式
  • 进入到bootloader界面
  • 执行脚本刷机

打开设备调试模式

执行adb shell可连接设备即为成功

进入bootloader界面

方式一

将手机关机,同时按住电源键+减量减两个按键,手机也可进入bootloader页面下

刷机前的页面为:

方式二

可以链接ADB的情况下,执行:

adb reboot bootloader
复制代码

开始刷机

进入终端,CD到当前刷机包目录下,执行:

flash-all.sh 复制代码

接下来就是等待接近两分钟的时间:

四、刷面罩(Magisk)

什么是 Magisk

Magisk 是出自一位台湾学生 @topjohnwu 开发的 Android 框架,是一个通用的第三方 systemless 接口,通过这样的方式实现一些较强大的功能。Magisk 的厉害之处在于它实现了一种绕过 SafetyNet 使用 root 的方法。因为它不会以任何方式改变您的system分区。这意味着您仍然可以安装官方OTA更新,而不会丢失root。

功能

  • ROOT权限获取和管理

比如我们的/system/xbin中没有su,我们可以通过刷入相应的模块,在系统启动初期,将su映射到/system/xbin下来获取root

  • 挂载功能多样的各种扩展模块

如大家所熟知的替换系统字体、指纹特效、开机动画等等

支持的版本:Android 5.0+

实现原理

Magisk 本质上是一种文件挂载系统,magisk做的事情是通过boot中创建钩子,进而bind mount构建出一个在system基础上能够自定义替换,增加以及删除的文件系统,实际上并没有对 system 分区进行修改(即 systemless 接口,以不触动 system 的方式修改 system)。所有操作都在启动的时候完成,启动过程中magisk所做的事情:

1.准备阶段,将会把/data/magisk.img 挂到/magisk。同时它会遍历magisk目录中的模块是否为启用状态,并且记录。

2.创建骨架system文件系统(由于bind mount 必须要有一个目标文件才能进行bind mount),全部由mkdir 和touch构建

3.将每个标记为启用的/magisk/$MODID/system中文件bind mount到骨架系统

4.执行自定义模块中的脚本

5.遍历骨架中剩余没有被mount的文件,通过真正的system文件进行bind mount。

准备面罩

从 Magisk 22 开始,不再区分刷写用的 .zip 包与安装管理器用到的 .apk 应用安装包,二者合一且只有后缀的区别,默认提供 .apk 包,更改后缀为 .zip 后即可被刷写。

资源资源

github.com/topjohnwu/M…

传输到设备

adb push Magisk-v24.2.zip /sdcard/Download/
复制代码

刷TWRP(Recovery)

资源包

/google/goog…

红米K20 PRO

使用临时TWRP

执行命令前需要进入到bootloader界面下,执行以下命名即可,执行后设备会自动重启,最后进到TWRP的菜单下:

fastboot boot ~Downloads/twrp-3.6.0_9-0-raphael.img 复制代码

菜单效果:

安装面罩(Magisk)

菜单路径:install ->

此处安装之前存到/sdcard/Download/的安装包,安装完成

重启系统,打开相关

四、应用

Magisk插件介绍

基于magisk可实现一些自定义的功能,插件就是按得是这个事情

插件开发

制作教程

www./feed/160569…

模板文件

github.com/Pinkdoge/ma…

ADB Shell操作

挂载system分区

首先先adb shell链接设备,再执行su获取系统权限,这里还没有system分区的写入权限,再执行:

#adb shell
#su
mount -o rw,remount /  
mount -o rw,remount /system
复制代码

此时就有权限对system分区进行写入啦!

查看保护文件

系统分区的文件一般用户无法查看,需要以超级用户权限操作,比如:

adb shell su -c 'ls /etc/security/cacerts' 复制代码

请求抓包

从Android Nougat开始,默认情况下,应用不再信任用户证书。开发人员仍然可以通过在应用程序的AndroidManifest.xml文件中配置networkSecurityConfig属性来选择接受用户证书,但默认情况下,它们不再受信任。

抓包软件

抓包的基本使用方法就不说明了,以下有下载链接和配置。

软件下载链接

📎Charles-Settings.xml

证书配置

参考资源

github.com/Magisk-Modu…

github.com/Magisk-Modu…

github.com/NVISOsecuri…

获取证书HASH值

openssl x509 -inform PEM -subject_hash_old -in charles-ssl-proxying-certificate.pem | head -1
复制代码

生成HASH命名的文件,比如上面生成的Hash值为时,则:

cp charles-ssl-proxying-certificate.pem /etc/security/cacerts/92ac25d5.0 复制代码

拷贝数据到手机

adb push 6fbe4e0f.0 /sdcard/Download/6fbe4e0f.0
复制代码

拷贝到系统目录

由于sytem没有写入权限,先参考挂载system分区,再执行

cp /sdcard/Download/92ac25d5.0 /etc/security/cacerts/92ac25d5.0 chmod 644 /etc/security/cacerts/92ac25d5.0 复制代码

最后重启设备,确认能否正常抓包!

ROOT应用

参考

topjohnwu大神的 ROOT操作库

github.com/topjohnwu/l…

应用

基于此基础库,比较容易就实现ROOT权限的操作。

比如,我想实现一个快速拷贝证书到系统目录的操作,相关步骤如下:

  • 生成证书的Hash值文件

参考请求抓包

  • 直接操作系统文件
private fun deleteCertificate(sourcePath: String) {
    var targetPath = '/system/etc/security/cacerts/' + sourcePath
    Shell.cmd(
        'su', 'mount -o rw,remount /',
        'mount -o rw,remount /system',
        'rm -f ${targetPath}',
    ).submit { result ->
        updateUI(
            result
        )
        if (result.isSuccess) {
            Logger.log('删除证书成功:${sourcePath}')
        } else {
            Logger.log('删除证书失败:${sourcePath}')
        }
    }
}
复制代码

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多