TCP 序列号
🔢 TCP 用序列号保证字节流顺序。r0capture 造 pcap 包时需自己编一套自洽的 seq/ack。
真实 TCP 的序列号
TCP 是面向字节流的可靠协议,每个字节都有序号:
seq = 本方已发送字节的起始序号
ack = 期望收到对方下一个字节的序号发送方发数据时填 seq,接收方回 ack=seq+len 表示「已收到,期待下一个」。
r0capture 的模拟
r0capture 抓的是 SSL 明文,造的是「假 TCP 包」,没有真实 TCP 的 seq/ack。但 Wireshark 需要 seq/ack 才能把同一会话的包正确排成流、识别为同一条 TCP stream。所以 r0capture 自己编一套自洽的:
python
if ssl_session_id not in ssl_sessions:
ssl_sessions[ssl_session_id] = (random.randint(0, 0xFFFFFFFF),
random.randint(0, 0xFFFFFFFF))
client_sent, server_sent = ssl_sessions[ssl_session_id]
if function == "SSL_read":
seq, ack = (server_sent, client_sent) # 服务端发
else:
seq, ack = (client_sent, server_sent) # 客户端发
# 写包后累加
if function == "SSL_read":
server_sent += len(data)
else:
client_sent += len(data)
ssl_sessions[ssl_session_id] = (client_sent, server_sent)为什么随机起始
真实 TCP 起始 seq 也是随机生成的(防预测攻击)。r0capture 模仿这一点,random.randint(0, 0xFFFFFFFF) 给每条会话一个随机起始 seq,避免不同会话 seq 撞车。
关联会话
ssl_session_id 是字典 key,同一会话的所有包共用一对 client_sent/server_sent,所以同会话的包在 pcap 里能正确排序成一条流。