Skip to content

Instantly share code, notes, and snippets.

@felix021
Created May 7, 2026 14:12
Show Gist options
  • Select an option

  • Save felix021/2a5148e5e7aae3835712748e77b109ed to your computer and use it in GitHub Desktop.

Select an option

Save felix021/2a5148e5e7aae3835712748e77b109ed to your computer and use it in GitHub Desktop.
Android Root/VPN 隐藏方案:实现与局限

Android Root/VPN 隐藏方案:实现与局限

环境: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

一、Root 隐藏

1. Magisk DenyList(主防线)

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 时注入。

2. Shamiko(补充层)

  • 版本:v1.2.5 (414)
  • 模式白名单模式(只对白名单内的 App 隐藏 root)
  • 白名单:Termux、AdAway、FreezeIt(这些是"需要知道 root 存在"的 App,实际上 Shamiko 白名单 = 不隐藏的 App)
  • 黑名单:已禁用,因为在本设备上不可靠

局限:Shamiko 在 Android 16 上报告 "Unsupported environment",黑名单模式不稳定,因此仅依赖 Magisk DenyList

3. Hide My Applist (HMA OSS)

LSPosed 模块,用于隐藏 App 列表而非直接隐藏 root。防止 App 检测到 Magisk/Termux/LSPosed 等已安装的包。

  • 配置模板:root_hide
  • 配置路径:/data/misc/hide_my_applist_jhzxzrpxtsgpsfil/config.json

4. Play Integrity Fix

PlayIntegrityFix-NEXT v3.0 + TrickyStore,配合 HMA 一起通过 Google Play 完整性检查,防止 App 通过 Play API 判断设备安全状态。

二、VPN/代理隐藏

1. Clash 双实例架构

本机运行两个独立的 Clash 实例:

实例 运行环境 端口 用途
Chroot Clash Debian chroot 7890 (HTTP+SOCKS5) chroot 内服务代理
Clash Meta App Android 原生 7899 TUN 模式,接管全局流量

TUN 模式工作在网卡层,对 App 完全透明——App 看到的是"直连网络",而非 VPN 隧道。

2. VPNHide 模块

dev.okhsunrog.vpnhide 是一个 LSPosed/Xposed 模块,hook NetworkCapabilities,让 App 查询连接类型时看不到 VPN 标志。

原理:Android 系统通过 ConnectivityManager.getActiveNetwork()NetworkCapabilities 暴露 VPN 状态。VPNHide 修改返回的 TRANSPORT_VPN 标志位。

3. IP 地理位置 Bypass

即使 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 可能随时更新检测逻辑

四、总结

本方案采用纵深防御策略:

  1. Root 隐藏:DenyList(主)+ HMA OSS(辅助隐藏包名)+ PlayIntegrityFix(完整性检查)
  2. VPN 隐藏:TUN 模式(网络层透明)+ VPNHide(应用层 hook)+ GeoIP 规则(防 IP 异常)
  3. 已知妥协:Shamiko 不可用是最大的遗憾,DenyList 的覆盖范围和粒度都不如 Shamiko 黑名单模式

对于高安全性银行 App,当前方案大概率够用;但对于使用了 NDK 层检测、内核层检测的 App(如部分国内银行),仍有暴露风险。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment