环境:OnePlus 15 (Android 16), Magisk 30.7, Shamiko v1.2.5
App 检测请求
├─ Root 检测 → Magisk DenyList + HMA OSS + Shamiko (白名单模式)
├─ VPN 检测 → VPNHide 模块 (hook NetworkCapabilities)
├─ 完整性检查 → PlayIntegrityFix-NEXT + TrickyStore
└─ IP 地理位置 → Clash 规则 GEOSITE,category-ip-geo-detect → DIRECT
Magisk 自带的 DenyList 机制,在 Zygisk 下对指定 App 卸载 Su 和 Magisk 相关痕迹。
magisk --denylist enable
magisk --denylist add com.example.target关键 App:银行类(涨乐财富通、UOB TMRW)必须加入。
已隐藏的包名:Termux 系列、Magisk Manager(伪装为 ru.ctr.dfu)、LSPosed、FreezeIt、HMA OSS。
注意:修改 DenyList 后需强制停止目标 App 才能生效,因为 Zygisk 在进程 fork 时注入。
- 版本:v1.2.5 (414)
- 模式:白名单模式(只对白名单内的 App 隐藏 root)
- 白名单:Termux、AdAway、FreezeIt(这些是"需要知道 root 存在"的 App,实际上 Shamiko 白名单 = 不隐藏的 App)
- 黑名单:已禁用,因为在本设备上不可靠
局限:Shamiko 在 Android 16 上报告 "Unsupported environment",黑名单模式不稳定,因此仅依赖 Magisk DenyList。
LSPosed 模块,用于隐藏 App 列表而非直接隐藏 root。防止 App 检测到 Magisk/Termux/LSPosed 等已安装的包。
- 配置模板:
root_hide - 配置路径:
/data/misc/hide_my_applist_jhzxzrpxtsgpsfil/config.json
PlayIntegrityFix-NEXT v3.0 + TrickyStore,配合 HMA 一起通过 Google Play 完整性检查,防止 App 通过 Play API 判断设备安全状态。
本机运行两个独立的 Clash 实例:
| 实例 | 运行环境 | 端口 | 用途 |
|---|---|---|---|
| Chroot Clash | Debian chroot | 7890 (HTTP+SOCKS5) | chroot 内服务代理 |
| Clash Meta App | Android 原生 | 7899 | TUN 模式,接管全局流量 |
TUN 模式工作在网卡层,对 App 完全透明——App 看到的是"直连网络",而非 VPN 隧道。
dev.okhsunrog.vpnhide 是一个 LSPosed/Xposed 模块,hook NetworkCapabilities,让 App 查询连接类型时看不到 VPN 标志。
原理:Android 系统通过 ConnectivityManager.getActiveNetwork() 和 NetworkCapabilities 暴露 VPN 状态。VPNHide 修改返回的 TRANSPORT_VPN 标志位。
即使 VPN 隐藏成功,如果出口 IP 的地理位置异常(比如从中国 IP 变成新加坡 IP),App 仍可能检测到异常。
解决方案:Clash 规则中配置 GEOSITE,category-ip-geo-detect → DIRECT,让 IP 地理检测类请求直连,保证 IP 归属地一致。
| 局限 | 原因 | 影响 |
|---|---|---|
| Shamiko 在 Android 16 不可用 | 内核/SELinux 变化导致 Zygisk hook 失效 | 只能依赖 Magisk DenyList,功能较弱 |
| DenyList 需手动维护 | 新安装的检测型 App 不会自动加入 | 忘记加就暴露 root |
| 修改后需强制停止 App | Zygisk 只在 fork 时注入 | 体验差,容易遗忘 |
| VPNHide 非万能 | 部分 App 用 NDK 直接读 /proc/net 或用其他方式检测 | 高安全 App(银行)可能绕过 |
| Play Integrity 需要网络 | 设备证明需要联网验证 | 无网环境下完整性检查失败 |
| TUN 模式可能与 EasyTier 冲突 | Clash TUN 拦截 ICMP 导致 RAW socket 阻塞 | 需要额外的自动检测和重启机制 |
| 内核模块 vpnhide_kmod 有限 | 依赖特定内核版本编译 | Android 大版本更新后可能失效 |
| TrickyStore 需要指纹伪造 | 模拟设备认证密钥 | Google 可能随时更新检测逻辑 |
本方案采用纵深防御策略:
- Root 隐藏:DenyList(主)+ HMA OSS(辅助隐藏包名)+ PlayIntegrityFix(完整性检查)
- VPN 隐藏:TUN 模式(网络层透明)+ VPNHide(应用层 hook)+ GeoIP 规则(防 IP 异常)
- 已知妥协:Shamiko 不可用是最大的遗憾,DenyList 的覆盖范围和粒度都不如 Shamiko 黑名单模式
对于高安全性银行 App,当前方案大概率够用;但对于使用了 NDK 层检测、内核层检测的 App(如部分国内银行),仍有暴露风险。