SSL_read(C 原型)
📥 OpenSSL/BoringSSL 的
SSL_read函数原型与 r0capture hook 方式。
C 原型
c
#include <openssl/ssl.h>
int SSL_read(SSL *ssl, void *buf, int num);参数与返回值
| 参数 | 类型 | 含义 |
|---|---|---|
ssl | SSL* | SSL 连接对象 |
buf | void* | 接收明文的缓冲区 |
num | int | 最多读取的字节数 |
返回值:
> 0:实际读取的字节数,明文已写入buf<= 0:无数据或出错(需查SSL_get_error)
r0capture 的 hook
javascript
Interceptor.attach(addresses["SSL_read"], {
onEnter: function (args) {
// args[0]=ssl, args[1]=buf, args[2]=num
this.message = getPortsAndAddresses(SSL_get_fd(args[0]), true);
this.message["ssl_session_id"] = getSslSessionId(args[0]);
this.message["function"] = "SSL_read";
this.message["stack"] = SSLstackread;
this.buf = args[1];
},
onLeave: function (retval) {
retval |= 0;
if (retval <= 0) return;
send(this.message, this.buf.readByteArray(retval));
}
});参数映射
| C 参数 | Frida | 含义 |
|---|---|---|
ssl | args[0] | 用于取 fd 和 session_id |
buf | args[1] | onLeave 时从中读明文 |
num | args[2] | (未直接用,用 retval) |
| 返回值 | retval | 实际读取字节数 |
为什么在 onLeave 读
SSL_read 执行后才把明文写入 buf,且实际长度由 retval 决定。详见 SSL_read hook。