菜单

概述

相关源文件

本文档提供了 Magisk 的技术概述,Magisk 是一个用于 Android 的高级系统修改框架。Magisk 通过独特的基于挂载的方法,在不更改系统完整性的前提下,实现了 root 访问、系统修改和模块功能。本文概述了 Magisk 的核心架构、启动过程、模块系统和关键组件。

有关安装说明,请参阅单独的安装指南。有关开发信息,包括模块创建,请参阅开发指南

核心架构

Magisk 结合使用了早期启动初始化、守护进程和挂载命名空间,在不直接修改系统分区的情况下修改 Android 系统。

来源:native/src/core/daemon.cpp native/src/core/lib.rs native/src/core/module.cpp docs/details.md

关键组件

  1. magiskinit:启动时运行的第一个程序,取代 Android 的 init
  2. magiskd:管理所有 Magisk 功能的守护进程
  3. MagiskSU:应用程序的 Root 访问实现
  4. 模块系统:用于扩展 Magisk 功能的框架
  5. Zygisk:用于在应用程序进程中执行代码的 Zygote 注入系统

来源:native/src/core/daemon.rs native/src/core/zygisk/entry.cpp native/src/core/su/mod.rs

启动过程

Magisk 的启动过程分为多个阶段,每个阶段负责特定的初始化任务。

来源:native/src/core/daemon.rs190-215 docs/details.md76-94

Pre-Init 阶段

在预初始化阶段,magiskinit 替换 Android 的init进程并

  • 挂载必要的**分区
  • 将 Magisk 服务注入到init.rc
  • 修补 SELinux 规则
  • 执行原始的init以继续启动

来源:native/src/core/daemon.rs102-121 docs/details.md79-86

Post-fs-data 阶段

此阶段发生在/data解密并挂载后

  • magiskd守护进程启动
  • 执行 Post-fs-data 脚本
  • 挂载模块
  • 初始化 Denylist(如果已启用)

来源:native/src/core/daemon.rs124-155 docs/details.md88-90

Late Start 阶段

在启动过程的后期,当触发 late_start 类时

  • 执行服务脚本
  • 执行模块服务脚本

来源:native/src/core/daemon.rs158-166 native/src/core/scripting.cpp120-151 docs/details.md92-94

启动完成

启动过程的最后阶段

  • 重置循环启动计数器
  • 按需创建安全目录
  • 确保管理器应用程序可用

来源:native/src/core/daemon.rs168-183

模块系统

Magisk 模块提供了一种在不实际修改系统分区的情况下修改 Android 系统的方法。

来源:docs/guides.md16-77 native/src/core/module.cpp283-321

模块结构

Magisk 模块是一个位于 /data/adb/modules 目录下的目录,结构如下:

组件描述
module.prop模块元数据(ID、名称、版本、作者)
system/将覆盖到系统上的文件
post-fs-data.sh在 post-fs-data 期间执行的脚本
service.sh在 late_start 服务期间执行的脚本
system.prop将加载为系统属性的属性
sepolicy.rule自定义 SELinux 策略规则
zygisk/用于 Zygisk 集成的本地库

来源:docs/guides.md19-77 native/src/core/module.cpp283-321

挂载机制

Magisk 使用绑定挂载系统将模块文件覆盖到系统上

  1. 模块在 post-fs-data 阶段收集
  2. 挂载一个 tmpfs 以创建所有模块修改的合并视图
  3. 将合并视图绑定挂载到实际的系统目录之上

这种方法允许在不实际修改系统分区的情况下进行系统修改。

来源:native/src/core/module.cpp127-186 native/src/core/module.cpp283-321

Root 权限管理

MagiskSU 通过安全的授权系统为应用程序提供 root 访问权限。

来源: native/src/core/su/daemon.rs native/src/core/su/db.rs native/src/core/su/connect.cpp

权限管理

Magisk守护进程通过以下方式管理root权限

  • 一个存储应用程序权限的SQLite数据库
  • 每个应用的策略设置(允许、拒绝)
  • 新请求的用户确认提示
  • 软件包跟踪,以防止UID重用攻击

来源: native/src/core/su/db.rs44-83 native/src/core/db.rs109-133

安全特性

MagiskSU 包含多项安全功能

  • 独立的root shell挂载命名空间(可配置)
  • SELinux上下文管理
  • Magisk 应用的签名验证
  • 未卸载应用的跟踪,以防止权限重用

来源: native/src/core/su/daemon.rs115-164 docs/releases/25100.md14-23

文件系统修改

Magisk 实现了一个复杂的挂载系统,可以在不改变实际分区的情况下修改 Android 的文件系统。

来源: native/src/core/module.cpp15-87 native/src/core/module.cpp283-321 native/src/core/node.hpp

挂载点和目录

Magisk 创建了各种挂载点和目录以供其运行

路径描述
/data/adb/modulesMagisk 模块的存储
$MAGISKTMP/.magisk/modules为运行时使用的模块挂载
$MAGISKTMP/.magisk/mirror系统分区的镜像
$MAGISKTMP/.magisk/rootdirRoot目录补丁

其中 $MAGISKTMP$ 根据设备不同,可以是 /sbin/debug_ramdisk

来源: docs/details.md6-37 native/src/core/daemon.cpp427-440

Magic Mount 进程

“Magic Mount” 系统通过以下方式工作:

  1. 创建模块修改的目录树
  2. 为需要修改的目录准备 tmpfs 节点
  3. 将文件从模块绑定挂载到其目标位置
  4. 支持文件替换和移除等特殊功能

来源: native/src/core/module.cpp46-87 native/src/core/module.cpp127-186 native/src/core/node.hpp32-310

数据库和配置

Magisk 将其配置和权限存储在 SQLite 数据库中。

来源: native/src/core/db.rs native/src/core/sqlite.cpp

配置设置

数据库存储各种配置设置

设置描述
root_accessRoot 访问模式(禁用、仅应用、仅 ADB、应用和 ADB)
multiuser_mode多用户设置(仅所有者、所有者管理、用户)
mnt_ns挂载命名空间模式(全局、每个应用、隔离)
denylist是否启用禁用列表
zygisk是否启用 Zygisk

来源: native/src/core/db.rs59-87 native/src/core/db.rs239-272

Zygisk 框架

Zygisk 提供了一种在应用程序进程初始化早期注入代码的方法。

来源: native/src/core/zygisk/entry.cpp native/src/core/module.cpp400-456

实现

Zygisk 的工作方式是:

  1. 将自身设为 Android 的原生桥接器
  2. 拦截 zygote 初始化
  3. 为兼容的进程加载模块库
  4. 提供 API 供模块修改应用行为

Zygisk 框架允许模块在应用程序进程被专门化和运行之前直接在其中运行代码,从而实现常规 Magisk 模块无法实现的高级修改。

来源: docs/guides.md129-132 native/src/core/zygisk/entry.cpp16-90 native/src/core/module.cpp400-456

工具和实用程序

Magisk 包含多种用于安装、管理和开发的实用工具。

工具描述
magiskboot用于解包、打补丁和重新打包引导映像的工具
magiskinit引导过程中运行的第一个程序,初始化 Magisk
magiskpolicy用于修改 SELinux 策略的工具
magisk具有各种功能的 मुख्य command-line utility
resetprop用于修改系统属性的工具
su命令访问超级用户功能

来源: docs/tools.md2-14 docs/tools.md161-234

SELinux 管理

Magisk 通过以下方式处理 SELinux:

  1. 修补 stock SELinux 策略
  2. 创建新的域,例如用于 root 操作的 magisk
  3. 使用 magisk_file 作为 Magisk 文件的文件类型
  4. 建立域之间的适当转换

这使得 Magisk 在维护 Android 的安全模型的同时能够运行。

来源:docs/details.md106-113

结论

Magisk 提供了一种强大但非破坏性的方式来修改 Android 系统。通过了解其架构和组件,开发者可以更有效地创建模块和扩展来增强 Android 的功能。

Magisk 方法的关键在于其基于挂载的修改系统,该系统在允许进行广泛自定义的同时,保持了系统分区的完整性。这种方法实现了诸如 root 访问、系统修改和高级模块支持等功能,而无需永久更改关键系统文件。