实战:抓真实 App 流量
抓 F-Droid 这个真实 App 的 OkHttp 流量,分析 HTTP/2 二进制帧特征。
抓包过程
bash
# 清缓存强制 App 重新联网(WorkManager 才会立即跑)
adb -s 192.168.1.90:5555 shell "pm clear org.fdroid.fdroid"
adb -s 192.168.1.90:5555 shell "am start -n org.fdroid.fdroid/.views.main.MainActivity"
sleep 8
PID=$(adb -s 192.168.1.90:5555 shell "pidof org.fdroid.fdroid" | tr -d '\r')
# attach 抓包(后台)
python3 r0capture.py -H 127.0.0.1:27042 $PID -p fdroid.pcap > fdroid.log 2>&1 &
# 抓包中触发刷新
sleep 4
adb -s 192.168.1.90:5555 shell input swipe 360 500 360 1300 300
adb -s 192.168.1.90:5555 shell input tap 660 90
# 等 40 秒后 Ctrl+C / kill抓包结果
关键发现:HTTP/2
第一个 SSL_write 抓到的不是 GET /,而是:
PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n这是 HTTP/2 的 connection preface(连接前言),是 HTTP/2 协议的魔法串,标志着这条连接用的是 HTTP/2 而非 HTTP/1.1。
HTTP/2 vs HTTP/1.1 抓包差异
| 维度 | HTTP/1.1 (selftest) | HTTP/2 (F-Droid) |
|---|---|---|
| 请求行 | GET / HTTP/1.1 明文 | PRI * HTTP/2.0 preface + 二进制帧 |
| 请求头 | 明文文本 | HPACK 压缩(二进制,不可直接读) |
| 多路复用 | 无 | 一个连接上多个流 |
| 能否直接读 | ✅ 能 | ❌ 需 HTTP/2 dissector |
HTTP/2 帧长什么样
抓到的 h2 数据是二进制:
.. <.. .... HEAD ..b..v.Rl..A.A..i,9.\.M.z.....i...ep.O.UTF-8S.*/*P....那些 .. 是 HPACK 压缩后的 header。HTTP/2 用 HPACK 算法压缩头部(用静态表/动态表+哈夫曼编码),所以 :method: HEAD、accept: */* 这些头被压成了二进制,肉眼不可读。
怎么看懂 HTTP/2 流量
r0capture 抓到了原始 SSL 明文(h2 二进制帧),但要读懂得借助工具:
r0capture 的角色
r0capture 解决的是"拿到 SSL 解密后的明文"——对 HTTP/2 来说就是拿到 h2 二进制帧。能不能读懂是 HTTP/2 协议本身的事,需配合 Wireshark 的 HTTP/2 dissector。r0capture 已经把最难的一步(解 TLS)做完了。
抓到的明文内容
虽然 h2 帧是二进制,但响应体里的某些内容仍是明文(F-Droid 的仓库索引是 XML/文本):
https://f-droid.org/repo
https://ftp.fau.de/fdroid/repo
https://mirror.kumi.systems/fdroid/repo
http://fdroidorg6cooksyluodepej4erfctzk7rrjpjbbr6wx24jh3lqyfwyd.onion/fdroid/repo
...这些是 F-Droid 仓库的镜像列表,明文出现在 SSL_read 的响应里。
小结
| 抓到什么 | 怎么看 |
|---|---|
| SSL 明文(h2 帧) | r0capture 直接抓到 ✅ |
| h2 请求行/头 | 需 Wireshark HTTP/2 dissector |
| 响应体(文本类) | 日志里直接可见 |
| 镜像列表、资源字符串 | 明文可见 |
下一篇:云手机多机并发 →