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 标记区分,主机端可去重避免重复记录。