首先,使用 Wireshark 验证您的欺骗数据包是否具有正确的 TCP 校验和。如果您的欺骗数据包具有无效的 TCP 校验和,它们将被接收者丢弃。要在 Wireshark 中打开此功能:编辑 > 首选项 > 协议 > TCP > 如果可能,验证 TCP 校验和
除了序列号,还要确认您正确地处理了TCP 时间戳值。如果序列号是正确的,但 TCP 时间戳选项是旧的,那么接收方仍然会丢弃数据包。
这是一个增加 TCP 时间戳的函数,它可能会为您解决问题。
def inc_timestamp(packet, TSval_inc, TSecr_inc):
if packet.haslayer(TCP):
for i, option in enumerate(packet[TCP].options): # Timestamp option format: tuple(name, tuple(time1, time2))
if str(option[0]) == "Timestamp": # Ex. ('Timestamp', (7797613, 414050))]
packet[TCP].options[i] = option[0], (option[1][0]+TSval_inc,option[1][1]+TSecr_inc)
如果您在 Scapy 中从头开始创建这些数据包,则可能必须添加 TCP 时间戳选项字段,因为默认情况下它不包含在 Scapy TCP() 层中。无论哪种方式,上面提供的代码都应该为您提供必要的格式信息来执行此操作。