Skip to content

hook SSL_write 详解 ​

✍️ script.js hook Native SSL_write,捕获 App 发出的 TLS 明文。

📎 源码在线查看:script.js#L304-L340(SSL_write hook)

函数原型 ​

c
int SSL_write(SSL *ssl, const void *buf, int num);
// 返回实际写入字节数

hook 实现 ​

javascript
Interceptor.attach(SSL_write_addr, {
    onEnter: function (args) {
        this.ssl = args[0];
        this.buf = args[1];
        this.num = args[2].toInt32();
    },
    onLeave: function (retval) {
        var written = retval.toInt32();
        if (written > 0) {
            var fd = SSL_get_fd(this.ssl);
            var addrs = getPortsAndAddresses(fd);
            send(
                { "type": "SSL_write", "src_addr": addrs.src_addr, ... },
                this.buf.readByteArray(written)
            );
        }
    }
});

为什么在 onLeave 读 buf ​

SSL_write 返回时才知道实际写了几字节(可能 < num,如缓冲区满)。读 buf 前 written 字节才是真正发出的明文。

buf 是什么 ​

buf 指向 App 准备加密发送的明文(加密由 SSL_write 内部完成)。所以 hook 在加密前拿到明文——这正是 r0capture 的核心。

触发频率 ​

每次 App 发 TLS 数据都触发:

  • HTTP 请求(每次 send)
  • 长连接心跳
  • WebSocket 发送帧
  • gRPC 请求

与 socket_write 的去重 ​

TLS 流量同时走 SSL_write 和底层 socket write。r0capture 通过 type 标记区分,主机端可去重避免重复记录。

相关文档 ​

基于 VitePress 构建 · 教学用途