Skip to content

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 BoringSSLJava socket
拿到解密后明文裸 TCP 明文
适用TLS 流量裸 TCP 流量
重复TLS 流量可能两边都抓到—

对 TLS 流量,两个 hook 都会触发(先 SSL_write 加密,最终也走 socket 输出),r0capture 做去重避免重复。

相关文档 ​

基于 VitePress 构建 · 教学用途