--- title: Frida 拦截 Flutter 流量的进展与卡点 type: experience permalink: main/projects/280dd2a0-d23d-4a71-91e1-dce4353163be/frida-拦截-flutter-流量的进展与卡点 stable_id: 3857b23e-1823-4ee9-a368-ec9161d4fd72 scope: project memory_type: experience project_id: 280dd2a0-d23d-4a71-91e1-dce4353163be usage_profile_id: 0c9feb46-d06e-43cd-9ef0-c5813c84a998 status: active revision: 1 request_id: rapdrama-exp-frida-progress-20260925-0420 created_at: '2026-09-24T20:34:18.651753+00:00' updated_at: '2026-09-24T20:34:18.651753+00:00' tags: - frida - flutter - 抓包 - dart --- ## 当前进展 已安装 Frida 17.18 + frida-server 17.17.0(x86_64)。SSL verify hook(偏移 0x8113ee)能成功安装并触发。视频流(ExoPlayer / Java 层)通过系统代理进 Charles 并被解密。 ## 卡点 Dart 的 HttpClient 不走 Android 系统代理(findProxy 默认是 null = 直连)。API 请求直连 apis.raptdrama.com / app.raptdrama.com,不经过 Charles。 用 iptables DNAT 把 TCP 443 转到 Charles 时,Charles 的透明代理无法正确建立到原始目标的回连(因为 DNAT 丢失了原始目标地址信息,Charles 收到的连接目标是自己),导致连接失败或 TLS 从未发起。SSL bypass hook 不会被触发因为根本没到 TLS 握手阶段。 Frida hook libc connect 时发现:App 启动后 30 秒内没有一次 libc connect() 被调用。netstat 确认 Dart 进程有到 10.0.2.2:8888 的 tcp6 连接(使用 AF_INET6 + IPv4-mapped 地址),说明系统代理确实被 Dart 读到了(只是 API 请求没走它)。需要进一步确认 Dart 到底怎么建立到 apis.raptdrama.com 的直连。 ## 未尝试的方案 1. **reFlutter 重打包**:patch libflutter.so 内置代理地址和禁用 SSL 验证,重签后安装。缺点是签名变化可能影响谷歌登录,且每次 App 更新要重做。 2. **mitmproxy 透明代理**:mitmproxy 的透明模式可以从 DNAT 的 SO_ORIGINAL_DST 获取原始目标地址,Charles 不行。 3. **Frida 直接 hook Dart 的 HTTP 层**:在 libapp.so 里找到 dio/http_client 的请求/响应处理函数,直接拦截 JSON 而不走代理解密。 4. **ProxyDroid / tun2socks**:在模拟器里装 VPN app 把所有流量导到代理,比 iptables DNAT 更完整。 5. **HTTP Toolkit**:专门处理 Android 透明代理,内置 DNAT 支持。