自定义二进制协议
🧩 App 自研的 TCP 二进制协议,r0capture 通过 Java socket hook 抓取。
为什么能抓
很多 App(游戏、IM、金融)用自定义二进制协议走裸 TCP,不走 SSL。r0capture 的 SocketOutputStream.socketWrite0 / SocketInputStream.socketRead0 hook 覆盖这类流量:
抓到的内容
自定义协议的二进制字节流,hexdump 渲染:
[HTTP_send] 192.168.1.5:54321 --> 1.2.3.4:8888
00000000: 00 01 00 2A 00 00 00 05 68 65 6C 6C 6F ... ...hello...需自行按协议格式解析(魔数、长度前缀、消息体等)。
与 SSL 流量的区分
| 维度 | SSL 流量 | 裸 TCP 流量 |
|---|---|---|
| function | SSL_read/SSL_write | HTTP_send/HTTP_recv |
| ssl_session_id | 有值 | 空字符串 "" |
| hook 层 | Native | Java |
限制
socketWrite0/socketRead0 是 java.net.SocketOutputStream/InputStream 的方法。若 App 用 Native socket(直接调 libc send/recv)或自定义网络库绕开 Java socket 层,则 hook 不到。
解析建议
- 先看
hexdump找规律(固定魔数、长度字段位置) - 结合调用栈定位编解码函数(
message["stack"]指向 App 哪个类在发包) - 反编译该类,逆向出协议格式