Skip to content

hook SocketOutputStream.write 详解 ​

📤 script.js hook Java 层裸 TCP 发送,兜底抓非 TLS 流量。

📎 源码在线查看:script.js(socketWrite0)

hook 目标 ​

javascript
Java.use("com.android.org.conscrypt."
    + "ConscryptFileDescriptorSocket$SSLOutputStream");
// 或不同版本的:
Java.use("org.apache.harmony.xnet.provider.jsse."
    + "OpenSSLSocketImpl$SSLOutputStream");

类名因 Android 版本而异,r0capture 处理多个候选。

hook 实现 ​

javascript
OSOutput.write.overload('[B', 'int', 'int').implementation = function (buf, off, len) {
    if (len > 0) {
        var sub = Java.array('byte', 
            Array.from(buf).slice(off, off + len));
        // 取 socket 五元组
        var socket = this.socket;  // 拿到关联的 Socket
        var addrs = getPortsAndAddressesFromSocket(socket);
        send({ "type": "socket_write", ... }, sub);
    }
    return this.write(buf, off, len);
};

重载选择 ​

write 有多个重载:

  • write([B)
  • write([B, int, int) ← r0capture hook 这个(带偏移+长度,最常调)
  • write(int)

hook 指定 overload('[B','int','int') 精确匹配。

buf 处理 ​

Java 字节数组 byte[],hook 时是 Java 数组对象。取 off..off+len 段,转成可 send 的二进制(Java.array + 转换)。

与 SSL_write 的关系 ​

对 TLS 流量:

  1. App 调 SSL_write(明文 → 加密)→ r0capture SSL hook 抓到明文
  2. SSL_write 内部调 socket write(密文)→ 这个 hook 抓到密文

r0capture 主用 SSL hook 抓明文,socket hook 主要用于非 TLS 的裸 TCP(自定义协议)。为避免 TLS 流量被重复抓(一次明文一次密文),主机端按 type 去重。

相关文档 ​

基于 VitePress 构建 · 教学用途