为什么系统代理不够用
安卓抓包的标准痛点:在 WiFi 设置里配了代理,但很多 App 根本不走系统代理——OkHttp 可以配 Proxy.NO_PROXY,native 层的网络库(Cronet、自研协议栈)直接无视系统设置。表现就是 Charles 里只能抓到部分请求,目标接口一个都看不到。
解法:VPN 型全局接管。Postern 这类工具在手机上起一个本地 VPN,所有 TCP 流量强制走 VPN,再转发给 Charles——App 无论怎么配置都逃不掉。
方案架构
手机 App → Postern(VPN 接管) → Charles(电脑) → 目标服务器配置步骤
第一步:Charles 端
Proxy → Proxy Settings:端口 8888,勾选Enable transparent HTTP proxyingProxy → SSL Proxying Settings:添加*:*(对所有域名启用 SSL 解密)- 电脑防火墙放行 8888
第二步:手机端
- 安装 Postern(Google Play 或酷安)
- 添加代理服务器:Charles 电脑 IP + 8888,类型 HTTP/HTTPS
- 配置规则:
匹配所有地址 → 通过代理(或按域名精细化:只让目标 App 的域名走代理,其他直连——减少噪音) - 开启 VPN
第三步:证书
Android 7+ 需要 Charles 证书进系统区(方法见"Android 10+ 抓包"篇,Magisk 模块方案)。
精髓一:规则精细化是降噪关键
全局接管后手机所有流量都进 Charles,噪音爆炸。Postern 的规则系统按域名分流:
# 只抓目标 App 的域名,其他直连
api.target.com → 代理
*.targetcdn.com → 代理
* → 直连(默认规则)Charles 端再配合 Proxy → Recording Settings 的 include 列表双重过滤,抓包界面就干净了。
精髓二:VPN 型方案抓不到的场景
- QUIC/UDP:Postern 只接管 TCP,QUIC 走 UDP 直接绕过。解法:封 UDP 443(路由器或手机防火墙)逼 App 回退 TCP
- 证书 Pinning:流量是抓到了但全是 TLS 握手失败。解法:Frida 绕过 Pinning(前文详述)
- App 检测 VPN:部分风控检测
VpnService是否运行。解法:Frida hookConnectivityManager.getNetworkInfo等检测点,或换路由器层抓包(tcpdump 方案)
精髓三:替代方案对比
| 方案 | 优点 | 缺点 |
|---|---|---|
| Postern | 免费、规则灵活 | 停更较久,新 Android 版本兼容性一般 |
| HttpCanary | 手机端独立完成(不需电脑) | 免费版功能受限,分析能力弱 |
| reqable | 新工具、UI 现代、双端 | 高级功能付费 |
| 路由器透明代理 | 手机零配置、防 VPN 检测 | 配置复杂,需要可刷机的路由器 |
长期逆向工作流建议:Postern/reqable 做日常,路由器透明代理做兜底(对付检测 VPN 的 App)。
总结
- 系统代理可被 App 绕过,VPN 型全局接管是完整方案
- Postern 规则按域名分流,配合 Charles 过滤降噪
- 三大盲区:QUIC 封 UDP、Pinning 用 Frida、VPN 检测换路由器方案
- 日常 Postern/reqable,兜底路由器透明代理
交流微信:run1255