PCAPdroid 的 VpnService 原理 — 免 root 抓包的技术基础
核心思路
PCAPdroid 之所以能做到免 root 抓包,完全依赖 Android 系统提供的 VpnService API。这项 API 的设计初衷是让正规 VPN 客户端在不需要 root 的情况下建立 VPN 隧道,但 PCAPdroid 巧妙地把它用作了本地流量过滤器。
简单来说:PCAPdroid 创建一个虚拟的网络接口(不是真的 VPN),把设备上所有应用发出的流量都引到这个接口上,在本地完成处理后再原样转发出去。整个过程流量只在设备内部走,没有任何数据离开设备。
它是怎么工作的
- 第一次启动时,Android 会弹出系统级的 VPN 确认对话框
- 用户确认后,PCAPdroid 以服务身份在后台持续运行
- 系统把所有出站流量路由到 PCAPdroid 创建的虚拟接口
- PCAPdroid 在自己的代码里逐包检查、记录、可选地解密和修改
- 处理完的流量再被发往真正的目标服务器
为什么系统允许这样做
Android 7.0 之后加强了隐私保护,但 VpnService 仍然是系统认可的合法 API。任何应用只要声明了相应权限并通过系统对话框获得用户同意,就可以在本地处理流量。系统强制弹出对话框就是为了让用户知情。
PCAPdroid 首次启动就必须经过这一步,没有任何办法静默跳过。
能力边界
理解 VpnService 原理后,就能清楚 PCAPdroid 哪些能做、哪些做不到:
- ✅ 用户应用 + 系统应用的出站连接都能抓到
- ✅ 抓包同时可以运行其他 VPN 应用(但有冲突,见 Root 模式抓包页)
- ❌ 入站连接(其他设备连进这台手机)在非 root 模式下抓不到,因为 NAT 和防火墙
- ❌ 流量中的 DNS 查询可能因为 Android 的 netd 守护进程而归属到"未知"
- ❌ 某些应用使用了证书锁定(certificate pinning),TLS 解密会失败,需要额外绕过
与 root 模式的对比
VpnService 模式最大优点是不破坏设备、不需要 Magisk,适合不想折腾 root 的用户。Root 模式则能绕过 VpnService 的全部限制,做到真正的网卡级抓包,但需要完整 root 环境(Magisk + Zygisk + App 列表绕过)。两种模式在同一个 PCAPdroid 安装包中,根据设备是否有 root 来显示对应开关。
<img src="images/main-screen.png" alt="PCAPdroid 主界面" title="PCAPdroid 主界面" />