Skip to content

实战:抓真实 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
响应体(文本类)日志里直接可见
镜像列表、资源字符串明文可见

下一篇:云手机多机并发 →

基于 VitePress 构建 · 教学用途