抓自定义二进制协议配方
🧩 抓 App 自研 TCP 二进制协议。
思路
自定义协议不走 SSL 时,r0capture 的 SocketOutputStream.socketWrite0 / SocketInputStream.socketRead0 hook 兜底抓裸 TCP 明文。
步骤
1. 抓包
bash
python3 r0capture.py -U -f com.app -v -p out.pcap2. 区分 SSL 与裸 TCP
| function | 含义 |
|---|---|
| SSL_read/SSL_write | 走 SSL |
| HTTP_send/HTTP_recv | 裸 TCP(非 SSL) |
自定义协议的包 function=HTTP_send/HTTP_recv,ssl_session_id 为空。
3. 看二进制规律
hexdump 里找规律:
- 固定魔数(开头几个字节)
- 长度前缀(第 N 字节是后续长度)
- 消息类型字段
4. 用调用栈定位编解码
[HTTP_send] 192.168.1.5:54321 --> 1.2.3.4:8888
00000000: 00 01 00 2A ...
at com.app.proto.BinaryEncoder.encode(BinaryEncoder.java:55)
at com.app.net.Client.send(Client.java:42)栈指向 BinaryEncoder.encode,反编译该类即可还原协议格式。
限制
若 App 用 Native socket(libc send/recv)绕开 Java socket 层,socketWrite0/socketRead0 hook 不到。需自定义 Frida 脚本 hook libc 的 send/recv。