如何在PCAP的TCP/IP包中设置Kind=15选项并重算校验和(优先用Scapy)
TCP Kind=15(替代校验和)选项配置与校验和重算方案
一、RFC1146相关要求说明
RFC1146规定,TCP替代校验和需通过SYN包协商启用,且一旦启用需在整个连接的所有数据包中使用。但你的测试场景是跳过SYN包直接在后续包添加Kind=15选项,这属于非标准操作,只要目标测试硬件能识别该选项即可执行,无需严格遵循标准协商流程。
Kind=15选项的固定格式为:1字节Kind值(15)、1字节Length值(4)、2字节替代校验和,总长度4字节。
二、基于Scapy的实现步骤
1. 加载原始PCAP文件
from scapy.all import rdpcap, wrpcap, IP, TCP # 替换为你的输入PCAP路径 raw_packets = rdpcap("input.pcap")
2. 定位目标连接并修改非SYN包
先指定目标TCP连接的IP和端口,然后过滤掉SYN包,为其余符合条件的包添加Kind=15选项并重新计算校验和:
# 替换为你的目标连接信息(源/目的IP+端口) target_connection = (("192.168.1.100", 12345), ("10.0.0.5", 80)) modified_packets = [] for pkt in raw_packets: if IP not in pkt or TCP not in pkt: modified_packets.append(pkt) continue # 匹配目标双向连接 is_target_conn = ((pkt[IP].src, pkt[TCP].sport) == target_connection[0] and (pkt[IP].dst, pkt[TCP].dport) == target_connection[1]) or \ ((pkt[IP].src, pkt[TCP].sport) == target_connection[1] and (pkt[IP].dst, pkt[TCP].dport) == target_connection[0]) if not is_target_conn: modified_packets.append(pkt) continue # 跳过纯SYN包(仅SYN标志位为1,无ACK) if pkt[TCP].flags & 0x02 and not pkt[TCP].flags & 0x10: modified_packets.append(pkt) continue # 构造Kind=15选项(先占位校验和) alt_checksum_opt = b'\x0f\x04\x00\x00' tcp_layer = pkt[TCP] # 合并原有TCP选项与新选项 tcp_layer.options = tcp_layer.options + [('Unknown', alt_checksum_opt)] # 清空原有校验和,让Scapy自动重算标准TCP/IP校验和 tcp_layer.chksum = None pkt[IP].chksum = None # 手动计算替代校验和(RFC1146规定为TCP段的16位补码和取反) def calc_alt_chksum(data): chksum = 0 # 按16位字累加 for i in range(0, len(data), 2): if i + 1 < len(data): word = (data[i] << 8) + data[i+1] else: word = data[i] << 8 chksum += word # 处理溢出 chksum = (chksum >> 16) + (chksum & 0xffff) chksum += chksum >> 16 return ~chksum & 0xffff # 生成TCP段字节流用于计算 tcp_bytes = bytes(tcp_layer) alt_chksum = calc_alt_chksum(tcp_bytes) # 更新选项中的校验和值 updated_opt = b'\x0f\x04' + alt_chksum.to_bytes(2, byteorder='big') tcp_layer.options = tcp_layer.options[:-1] + [('Unknown', updated_opt)] # 更新数据包的TCP层 pkt[TCP] = tcp_layer modified_packets.append(pkt)
3. 保存修改后的PCAP文件
# 替换为输出PCAP路径 wrpcap("modified_test.pcap", modified_packets)
三、核心注意事项
- Scapy不支持自动计算Kind=15的替代校验和,必须手动实现RFC1146规定的16位补码和逻辑。
- 若只需为部分非SYN包添加选项,可在循环中增加额外筛选条件(比如按数据包序号、传输方向过滤)。
- 跳过SYN协商直接添加Kind=15属于测试场景下的特殊操作,不符合标准TCP流程,需确认测试硬件兼容该模式。
内容的提问来源于stack exchange,提问作者LetMeSOThat4U
相关产品推荐
相关产品推荐

