【问题标题】:Wrong TCP checksum calculation by ScapyScapy 错误的 TCP 校验和计算
【发布时间】:2015-01-30 10:09:21
【问题描述】:

问了this之后,只想做一个简单的测试。我使用tcpdump 捕获了流量。过滤掉Wireshark中的一个TCP ACK包,并将过滤后的包导出到sample.pcap

现在这几乎是我用于 TCP 校验和重新计算的代码:

from scapy.all import *

ack_pkt = sniff(offline="sample.pcap", count=1)[0]
print "Original:\t", ack_pkt[TCP].chksum

del ack_pkt[TCP].chksum
print "Deleted:\t", ack_pkt[TCP].chksum

ack_pkt[TCP]=ack_pkt[TCP].__class__(str(ack_pkt[TCP]))
print "Recalculated:\t", ack_pkt[TCP].chksum

我得到的输出是:

WARNING: No route found for IPv6 destination :: (no default route?)
Original:   30805
Deleted:    None
Recalculated:   55452

校验和重新计算过程是正确的还是有其他东西可以重新计算校验和?由于scapy被广泛使用了很长时间,我想,我的校验和重新计算有问题。

已更新数据包信息:(未显示以太网标头以便更好地查看。)

以十六进制字符串查看数据包:

from binascii import hexlify as hex2
ack_pkt = sniff(offline="sample.pcap", count=1)[0]
print ack_pkt.chksum, ack_pkt[TCP].chksum
print hex2(str(ack_pkt[IP]))

del ack_pkt.chksum
del ack_pkt[TCP].chksum
print ack_pkt.chksum, ack_pkt[TCP].chksum
print hex2(str(ack_pkt[IP]))

ack_pkt=ack_pkt.__class__(str(ack_pkt))
print ack_pkt.chksum, ack_pkt[TCP].chksum
print hex2(str(ack_pkt[IP]))

ack_pkt[TCP].chksum=0
print hex2(str(ack_pkt[IP]))

我得到的输出是:

26317 30805
450000345bc840004006*66cd*0e8b864067297c3a0016a2b9f11ddc3fe61e9a8d801000f7*7855*00000101080a47e8a8af0b323857
None None
450000345bc840004006*66cd*0e8b864067297c3a0016a2b9f11ddc3fe61e9a8d801000f7*d89c*00000101080a47e8a8af0b323857
26317 55452
450000345bc840004006*66cd*0e8b864067297c3a0016a2b9f11ddc3fe61e9a8d801000f7*d89c*00000101080a47e8a8af0b323857
450000345bc840004006*66cd*0e8b864067297c3a0016a2b9f11ddc3fe61e9a8d801000f7*0000*00000101080a47e8a8af0b323857

(* 仅用于标记校验和字节。)

这不奇怪吗?删除校验和后,当我输入ack_pkt.show() 时,我看到两个校验和字段都是None。但是在转换成十六进制字符串的时候,是不是被重新计算过了?

ack_pkt[TCP].chksum=0 这样,重新计算的校验和仅来自 0

注意:

我已经尝试使用ack_pkt[TCP].show2(),并且得到的值与上面的值相同。

【问题讨论】:

    标签: python tcp scapy


    【解决方案1】:

    1) 您是否尝试复制完整的数据包,而不仅仅是其 TCP 部分:

    ack_pkt=ack_pkt.__class__(str(ack_pkt))
    

    2) 您是否尝试过following 方法,将数据包显式转换为字符串并使用字符串重新创建?

    3) 如果以上都不起作用,请发布您正在使用的 TCP ACK 数据包

    【讨论】:

    • 1) 最初我只是在做同样的事情。那里我得到了错误的价值。所以出于好奇,我像上面提到的那样尝试过。 2) 是的。这也只给出相同的值。 3)我会尽快更新数据包。意思是让我尝试手动校验和计算。
    • 用数据包信息更新了问题。
    【解决方案2】:

    我按照one's compliment of one's compliment sum 尝试使用pythonC (with libpcap) 手动重新计算校验和,我得到的值与scapy 得到的值相同。所以我猜linux-kernel中的校验和计算被某种方式修改了。

    (最好说一个人错了,而不是说其他​​三个人都错了。:P)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-09
      • 1970-01-01
      • 2015-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-08
      • 2019-01-30
      相关资源
      最近更新 更多