Skip to content

SSL_get_session 与 SSL_SESSION_get_id ​

🔑 取 SSL 会话 ID 的两个 Native 调用。

SSL_get_session ​

c
#include <openssl/ssl.h>

SSL_SESSION *SSL_get_session(const SSL *ssl);
// 返回 SSL_SESSION*,NULL 表示无会话

从 SSL 对象拿会话对象 SSL_SESSION*。

SSL_SESSION_get_id ​

c
#include <openssl/ssl.h>

const unsigned char *SSL_SESSION_get_id(const SSL_SESSION *sess, unsigned int *len);
// 返回会话 ID 字节指针,len 写出长度

r0capture 的用法 ​

javascript
function getSslSessionId(ssl) {
  var session = SSL_get_session(ssl);     // SSL -> SSL_SESSION*
  if (session == 0) return 0;
  var len = Memory.alloc(4);              // 给 &len 准备空间
  var p = SSL_SESSION_get_id(session, len);  // 拿 id 指针, len 写出
  len = len.readU32();                    // 读回长度
  var session_id = "";
  for (var i = 0; i < len; i++) {
    session_id += ("0" + p.add(i).readU8().toString(16).toUpperCase()).slice(-2);
  }
  return session_id;
}

调用链 ​

用途 ​

会话 ID 用于在 pcap 里把同一会话的多个包关联成一条 TCP 流。详见 getSslSessionId 与 TCP 序列号。

NativeFunction 包装 ​

javascript
SSL_get_session = new NativeFunction(addresses["SSL_get_session"], "pointer", ["pointer"]);
SSL_SESSION_get_id = new NativeFunction(addresses["SSL_SESSION_get_id"], "pointer", ["pointer", "pointer"]);

注意 SSL_SESSION_get_id 第二个参数是 pointer(&len),需 Memory.alloc(4) 准备。

相关文档 ​

基于 VitePress 构建 · 教学用途