SocketOutputStream / SocketInputStream
📤 Java 层裸 TCP 收发类,r0capture 的第二抓包通道。
是什么
Android 的 java.net.Socket 的输入输出流,底层是 SocketOutputStream.write / SocketInputStream.read,直接读写裸 TCP 字节,不经 SSL。
r0capture 为什么要 hook 它
有些 App 用裸 TCP + 自定义加密协议(非 TLS),SSL hook 抓不到。r0capture 额外 hook Java socket 捕获这类流量。
hook 点
javascript
Java.perform(function () {
var OSOutput = Java.use("com.android.org.conscrypt"
+ ".ConscryptFileDescriptorSocket$SSLOutputStream");
// 或 java.net.SocketOutputStream(不同 Android 版本类名不同)
OSOutput.write.overload('[B', 'int', 'int').implementation = function (buf, off, len) {
// buf[off..off+len] = 即将发出的明文
send({ "type": "SSL_write", ... }, buf.slice(off, off + len));
return this.write(buf, off, len);
};
});与 SSL_write 的关系
| 维度 | SSL_write (Native) | SocketOutputStream (Java) |
|---|---|---|
| 层 | Native BoringSSL | Java socket |
| 拿到 | 解密后明文 | 裸 TCP 明文 |
| 适用 | TLS 流量 | 裸 TCP 流量 |
| 重复 | TLS 流量可能两边都抓到 | — |
对 TLS 流量,两个 hook 都会触发(先 SSL_write 加密,最终也走 socket 输出),r0capture 做去重避免重复。