本文档详细介绍了 Magisk 的应用隐藏机制,该机制允许 Magisk 应用在安装过程中通过更改其身份和包名来隐藏自身,以避免被检测。此功能对于需要通过 SafetyNet 验证或隐藏 root 权限免遭主动检查 Magisk 存在的应用程序的用户至关重要。
本页面专门关注 Magisk 应用本身的隐藏技术实现。有关隐藏 root 权限免遭其他应用程序检测的信息,请参阅拒绝列表系统文档。
应用隐藏机制依赖于 Android 的 PackageInstaller API,以随机化的包名重新安装 Magisk 应用。此过程有效地创建了一个具有不同身份的 Magisk 应用“克隆”,使其难以被搜索 Magisk 标准包名的应用程序检测到。
来源: app/shared/src/main/java/com/topjohnwu/magisk/utils/APKInstall.java
应用隐藏机制的核心实现在 APKInstall 工具类中。该类提供了使用 Android 的 PackageInstaller API 以编程方式安装 APK 文件的便捷接口。
来源: app/shared/src/main/java/com/topjohnwu/magisk/utils/APKInstall.java28-174
APKInstall 类:提供用于促进 APK 安装的静态方法
transfer():在流之间复制数据的实用方法registerReceiver():用于注册广播接收器的平台兼容方法startSession():创建并初始化安装会话Session 接口:定义了安装会话的契约
openStream():打开一个输出流以写入 APK 数据waitIntent():等待并返回安装所需的任何用户操作 IntentInstallReceiver 类:实现 Session 接口并继承 BroadcastReceiver
来源: app/shared/src/main/java/com/topjohnwu/magisk/utils/APKInstall.java28-67 app/shared/src/main/java/com/topjohnwu/magisk/utils/APKInstall.java74-174
隐藏 Magisk 应用的安装遵循特定序列,利用 Android 的 PackageInstaller API
来源: app/shared/src/main/java/com/topjohnwu/magisk/utils/APKInstall.java49-65 app/shared/src/main/java/com/topjohnwu/magisk/utils/APKInstall.java90-126 app/shared/src/main/java/com/topjohnwu/magisk/utils/APKInstall.java148-173
该过程始于对 APKInstall.startSession() 的调用,该调用
InstallReceiver,并提供一个可选的包名进行监视如果提供了包名,系统还将监视 ACTION_PACKAGE_ADDED 事件,以检测指定的包是否成功安装。
来源: app/shared/src/main/java/com/topjohnwu/magisk/utils/APKInstall.java49-65
用于写入 APK 数据
session.openStream(context) 请求输出流InstallReceiver 创建具有适当参数的 PackageInstaller 会话用于安装的 SessionParams 包含 MODE_FULL_INSTALL,并且在 Android S 及更高版本上,用户操作要求被明确禁用以简化安装过程。
来源: app/shared/src/main/java/com/topjohnwu/magisk/utils/APKInstall.java148-173
InstallReceiver 处理安装事件
STATUS_PENDING_USER_ACTION:捕获需要呈现给用户的 IntentSTATUS_SUCCESS:如果未指定包名,则触发 onSuccess 回调如果指定了包名,接收器还将监视与该包匹配的 ACTION_PACKAGE_ADDED 广播,这表示安装成功。
来源: app/shared/src/main/java/com/topjohnwu/magisk/utils/APKInstall.java90-126
如果需要用户交互(在较旧的 Android 版本中很常见)
waitIntent() 方法返回必须呈现给用户的 Intent使用 CountDownLatch 确保 waitIntent() 方法在收到安装状态或 5 秒超时之前一直阻塞。
来源: app/shared/src/main/java/com/topjohnwu/magisk/utils/APKInstall.java139-145
应用隐藏机制通过多种方式增强了安全性
由于 APK 数据可以在安装前进行修改,因此该系统不仅允许更改包名,还可能进行其他进一步混淆应用身份的修改。
来源: app/shared/src/main/java/com/topjohnwu/magisk/utils/APKInstall.java
该实现包含了针对不同 Android 版本的兼容性措施
Context.RECEIVER_NOT_EXPORTED 标志来注册接收器USER_ACTION_NOT_REQUIREDFLAG_MUTABLE 和 FLAG_UPDATE_CURRENT 来创建 PendingIntent这些调整确保了该机制在各种 Android 版本上都能可靠运行。
来源: app/shared/src/main/java/com/topjohnwu/magisk/utils/APKInstall.java39-47 app/shared/src/main/java/com/topjohnwu/magisk/utils/APKInstall.java155-158 app/shared/src/main/java/com/topjohnwu/magisk/utils/APKInstall.java149-152
应用隐藏机制使 Magisk 能够通过以不同的包身份安装来隐藏其存在。此功能对于需要避免 SafetyNet 或其他 root 检测系统检测的用户至关重要,同时仍可保持 Magisk 的全部功能。
该实现利用 Android 的 PackageInstaller API 和广播系统,以一种干净、安全且适用于不同 Android 版本的方式处理安装过程。