getSslSessionId() 会话 ID
🔑 取 SSL 对象对应的会话 ID,返回十六进制大写字符串。
📎 源码在线查看:
script.js#L254-L276(getSslSessionId)
签名
javascript
function getSslSessionId(ssl)
// 返回 "59FD71B7..." 或 0| 参数 | 含义 |
|---|---|
ssl | 指向 SSL 对象的指针(即 SSL_read/SSL_write 的第一个参数 args[0]) |
用途
会话 ID 用于在 pcap 文件里把同一次 SSL 会话的多个收发包关联到同一条 TCP 流。Python 端 log_pcap 用它作为 ssl_sessions 字典的 key,为每条会话维护模拟序列号。
实现
javascript
function getSslSessionId(ssl) {
var session = SSL_get_session(ssl); // SSL -> SSL_SESSION*
if (session == 0) {
return 0;
}
var len = Memory.alloc(4);
var p = SSL_SESSION_get_id(session, len); // session -> 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;
}调用链
三个 Native 调用
| 函数 | 签名 | 作用 |
|---|---|---|
SSL_get_session(ssl) | pointer(ptr) -> pointer | 从 SSL 对象拿会话对象 |
SSL_SESSION_get_id(session, &len) | pointer(ptr, ptr) -> pointer | 拿会话 ID 字节,len 写出 |
Memory.alloc(4) + readU32 | — | 给 &len 准备 4 字节空间再读回 |
十六进制拼接
javascript
("0" + p.add(i).readU8().toString(16).toUpperCase()).slice(-2)readU8()读 1 字节(0~255).toString(16)转 16 进制字符串(可能 1 位或 2 位)- 前面补
"0"再.slice(-2)取后 2 位 → 保证 2 位(0xAB→"AB",0x5→"05") .toUpperCase()大写
session == 0 的处理
若 SSL_get_session 返回 0(无会话,如未完成握手),直接返回 0。Python 端会得到 ssl_session_id=0,pcap 里这条包会被归到一个单独的"0 会话"流。