Skip to content

自定义二进制协议 ​

🧩 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 流量
functionSSL_read/SSL_writeHTTP_send/HTTP_recv
ssl_session_id有值空字符串 ""
hook 层NativeJava

限制 ​

socketWrite0/socketRead0 是 java.net.SocketOutputStream/InputStream 的方法。若 App 用 Native socket(直接调 libc send/recv)或自定义网络库绕开 Java socket 层,则 hook 不到。

解析建议 ​

  1. 先看 hexdump 找规律(固定魔数、长度字段位置)
  2. 结合调用栈定位编解码函数(message["stack"] 指向 App 哪个类在发包)
  3. 反编译该类,逆向出协议格式

相关文档 ​

基于 VitePress 构建 · 教学用途