MemRelay-Operation: memory-save:rapdrama-exp-frida-progress-20260925-0420 MemRelay-Resource: 3857b23e-1823-4ee9-a368-ec9161d4fd72
40 lines
2.3 KiB
Markdown
40 lines
2.3 KiB
Markdown
---
|
||
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 支持。 |