Android Root 发展历程和方案分析
Android Root 顾名思义即给安卓系统获取根权限,让用户拥有系统级权限,极大提升系统可玩性。
一般来说,Root 需要先解锁 bootloader(BL),解锁的目的,是让用户有权限刷写各个分区,从而能:
- 更换系统(system / vendor / product 等)
- 更换内核(boot )
- 注入 Root / 模块方案
注意:解锁 BL ≠ 必然 Root,也可以只刷机不 Root。
主流 Root 方案按时间大致可以排成这样:
KingRoot → SuperSU → Magisk → SKRoot(小众) → KernelSU → APatch
一、Root 实现思路:按技术路线分类
用户态 Root(User-space Root)
- 不直接修改内核代码
- 修改 boot.img → ramdisk → init 脚本,在早期启动阶段插入自己的用户态 root 程序
- 通过 用户态守护进程 管理权限(例如
magiskd) - 一般依赖一个 管理 App 配合使用(授权弹窗、模块管理等)
- 代表方案:Magisk
- 优点:对内核无强依赖,兼容面最广
- 缺点:本质不在内核,某些内核安全策略/厂商定制下会有局限
内核态 Root(Kernel-space Root)
- 直接在内核中 Hook 权限相关函数 / LSM / syscall
- 在内核层修改
cred、capabilities等结构,获得最高权限 - 部分方案需要内核源码(早期 KernelSU),部分不需要(APatch、SKRoot)
- 代表方案:KernelSU、APatch、SKRoot
- 优点:权限层级最高,可做更“隐蔽”和细粒度的控制
- 缺点:与内核版本/厂商定制强相关,适配成本较高
漏洞 Root(Exploit-based Root)
- 利用系统或内核漏洞临时/半永久获取 Root
- 通常依赖特定 Android / 内核版本,系统一更新就失效
- 代表方案:KingRoot 等一键 Root 工具
- 优点:用户体验简单,历史上对锁 BL 的机器也有机会
- 缺点:完全吃漏洞红利,维护性差,安全风险高
二、按时间线看典型方案
KingRoot:漏洞驱动的早期 Root
- 主要活跃在 Android 4.4 ~ 6.0 时代
- 通过 内核 / 系统漏洞(如提权漏洞)获得 Root
- 多为 临时或半永久 Root,重启或 OTA 后经常失效
- 随着漏洞不断被修复,这类方案很快被淘汰
定位:
完全基于漏洞的时代产物,如今更多是历史意义。
SuperSU:system 分区注入 su 的经典方案
- 思路:直接修改
system.img,在/system/bin或/system/xbin注入su二进制 - 通过
su的 setuid 机制实现提权 - 典型适用 Android 4.x ~ 6.x,system 还比较“好改”的时代
- 随着:
- system 分区逐渐只读 / 受更严格完整性保护
- Magisk 引入 systemless Root
SuperSU 很快失去优势。
定位:
传统“改 system.img 注入 su”的代表
Magisk:用户态 systemless Root 的时代
Magisk 把 Root 方式拉到了一个新高度。
核心实现
- 修改 boot.img → ramdisk → init:
- 用
magiskinit接管早期启动,作为“第一个用户态进程” - 启动 root 守护进程
magiskd
- 用
/system/bin/su在 Magisk 中 只是前端/中转:- 解析参数 → 连接
magiskd→ 由magiskd以 root fork/exec 真正的命令 - 提权的决策和执行在
magiskd中完成,而不是在su本身
- 解析参数 → 连接
- 不在 system 分区直接写入文件,做到 systemless
(实际上是用挂载/覆盖的方式“虚拟出”修改过的系统视图)
关键特点
- 首创 magic mount 模块系统:
- 在不实际修改系统文件的情况下,实现对
/system、/vendor等目录的文件覆盖 - 极大提升“玩机模块生态”
- 在不实际修改系统文件的情况下,实现对
- 强兼容性:
- 只要能改 boot.img中的init脚本,大多数内核版本都能使用
- 依赖管理 App(Magisk App):
- 管理模块、处理 su 授权弹窗、升级/卸载
局限
- 纯用户态方案,需要搭配app
- 模块生态与内核态模块(如 APatch 的 KPM )相比,在内核能力利用上略逊一筹
- 不支持kernelsu后来的模块webui功能,需要额外安装app解决
SKRoot:早期“内核 Root + su 环境注入”的探索者
- 时间上早于目前主流内核 Root(KernelSU / APatch)
- 无需内核源码:
- 离线分析目标内核镜像(ELF/镜像格式)
- 找到如
do_execve等关键函数与task_struct/cred/seccomp的偏移 - 插入自定义 shellcode 实现内核级提权
- 号称“隐藏性很强”:
- 没有模块系统
- 常见用法是:针对单个或少数进程注入 su 环境
- 通过 PATH / so 寄生等方式,让特定 APP 获得 su,而不是全局暴露
- 适配范围:大致 3.10 ~ 6.6 内核
优点:
- 不依赖内核源码,适配范围相对广
- su 环境可以“定向注入”,对其他进程很隐蔽
缺点:
- 没有完整的模块系统,操作较繁琐
- 生态小众,文档和社区支持相对较弱
KernelSU:主流内核态 Root + overlayfs 模块
基本定位
- 代表性的 内核态 Root:
- 在内核中安装 hook(LSM / cred 修改等)
- 在执行
/system/bin/su时,内核直接修改进程 cred 实现提权
/system/bin/su在 KernelSU 中是真正的 提权入口:- 它触发内核 hook
- 提权是在内核里完成的,而不是转发给某个守护进程(区别于 Magisk)
技术路径演进
- 早期:通过 谷歌GKI 内核(已被官方淘汰) / 内核源码集成(已被官方淘汰) 集成 KernelSU
- 现在主流:LKM(ko 模块)方式:
- 把修改封装成内核模块加载进 GKI 内核
- 同一大版本Gki内核编译出来的ko模块具有一定通用性,所以安装体验上不需要内核源代码
- 但 ko 的编译仍依赖内核的源码,只是这部分由项目方/维护者完成
- 对用户体验来说“不需要自己改源码”
模块系统:元模块(支持overlyfs/magic mount或者自定义挂载方式)
- 默认使用 overlayfs 实现模块系统(首创):
- 支持对
/system等只读分区做“上层覆盖”(模块安装后通常需要 重启才能生效对/system的修改)
- 支持对
- 对比 Magisk 的 magic mount:
- overlayfs 是内核特性,语义更标准
- 但实时性稍差,多数变更需要重启
特点与限制
-
特点:
- 内核态 su:安全模型清晰,可做细粒度 App profile(按 UID/GID 控制权限大小)
- 官方overlayfs 模块系统:结构正规,可与 GKI 思路统一
-
限制:
- 对低版本 / 非 GKI 内核兼容性差
- 一些魔改了内核且不开源的gki设备对谷歌官方gki内核支持差,刷了可能开不了机
- 官方更推荐搭配 5.10以上的 GKI 内核搭配ko模块使用
APatch:无需源码的 kpimg 内核 Root + KPM 模块
在内核 Root 方案中,APatch 的技术路线是目前最“工程化 + 通用”的一类。
核心实现方式
- 仍然是 内核态 Root,但:
- 不需要内核源码
- 使用 KernelPatch 工具链解析并 patch 目标内核镜像
- 通过在内核镜像中注入
kpimg:- 修改内核启动入口 / early init 流程
- 把自定义 hook 注入到内核的启动过程
- 重启后,
kpimg会在早期阶段接管部分逻辑,实现:- Root 提权
- 内核 hook(supercall / inline hook)
- 启动用户态守护/事件(apd 等)
兼容性
- 内核版本范围广:3.18 ~ 6.12
- 不依赖 GKI,不要求厂商公开内核源码
- 对各家定制内核更友好(因为是直接对内核二进制镜像做符号分析与 patch)
特点
-
KPM 内核模块:
- 在已经被 kpimg 接管的内核里,动态加载 KPM 模块
- 支持对内核函数进行 hook,部分 hook 即时生效
- 无
/system/bin/su文件,通过监听拦截/system/bin/su或su指令来实现提权
-
模块系统 + Lua 脚本:
- 用户态 apd 管理模块目录、事件(post-fs-data / boot-completed 等)
- 最新版本中可以用 Lua 替代传统 shell 脚本,增强复杂逻辑可维护性
-
不依赖内核源码的工程化链路:
- 用 tools/kallsym.c、tools/patch.c 等做符号解析、patch
- 用 kernel/patch/android/user_init.sh 等把 apd 接到系统启动阶段
三、综合对比与结论
技术路线对比(简表)
| 方案 | 类型 | 是否改内核代码 | 是否需源码 | 是否依赖 App | su 角色 | 模块系统 |
|---|---|---|---|---|---|---|
| KingRoot | 漏洞 Root | 否 | 否 | 需要 | 各家自定义 | 无 / 简单补丁 |
| SuperSU | system 注入 su | 否 | 否 | 可选 | 传统 setuid su | 无 |
| Magisk | 用户态 Root | 间接(不改内核) | 否 | 强依赖 | /system/bin/su中转到 magiskd |
magic mount |
| SKRoot | 内核 Root | 是(patch 镜像) | 否 | 有工具/库 | 隐藏 su + 进程定向注入 | 无完整模块系统 |
| KernelSU | 内核 Root | 是(源码/GKI/LKM) | 技术层面上需要 | App 非必须 | /system/bin/su 触发内核提权 |
元模块 |
| APatch | 内核 Root | 是(kpimg patch) | 否 | App 非必须 | 内核 hook su/execve 等 | APM/KPM + Lua |
目前最主流的三款root方案分析
-
Magisk:
适合追求 广泛兼容 + 成熟模块生态 的用户,一般设备能解锁 boot.img 就能用。 -
KernelSU:
适合有 GKI 内核,且希望在内核层面细控 Root 权限(App profile)的人,
更偏“官方化”的内核模块方案,但对旧机型支持有限 可以自定义挂载 -
APatch:
从技术理念上最“硬核”,不依赖源码、支持广泛内核版本,
内核模块 hook + Lua 模块系统,对研究者 / 高级玩家非常友好。