Skip to content

抓自定义二进制协议配方 ​

🧩 抓 App 自研 TCP 二进制协议。

思路 ​

自定义协议不走 SSL 时,r0capture 的 SocketOutputStream.socketWrite0 / SocketInputStream.socketRead0 hook 兜底抓裸 TCP 明文。

步骤 ​

1. 抓包 ​

bash
python3 r0capture.py -U -f com.app -v -p out.pcap

2. 区分 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。

相关文档 ​

基于 VitePress 构建 · 教学用途