如何计算数据包校验和而不发送它?

Dim*_*.Go 18 python scapy

我正在使用scapy,我想创建一个数据包并计算其'校验和而不发送它.有办法吗?

谢谢.

Alm*_*hen 33

我也试图避免使用show2(),因为它会打印数据包.我在源代码中找到了一个更好的解决方案:

del packet.chksum
packet = packet.__class__(bytes(packet))
Run Code Online (Sandbox Code Playgroud)

此代码使用正确的校验和重新生成数据包,无需任何打印,实际上是show2()在打印前在后台运行.

  • 到目前为止,真实和最好的答案.不要尝试从打印中提取数据,这可能会随着时间的推移而改变 (2认同)

Mik*_*ton 13

您需要.chksum在创建数据包后删除该数据包中的值; 然后打电话.show2()

>>> from scapy.layers.inet import IP
>>> from scapy.layers.inet import ICMP
>>> from scapy.layers.inet import TCP
>>> target = "10.9.8.7"
>>> ttl = 64
>>> id = 32711
>>> sport = 2927
>>> dport = 80
>>> pak = IP(dst=target, src = "100.99.98.97", ttl=ttl, flags="DF", id=id, len=1200, chksum = 0)/TCP(flags="S", sport=sport, dport=int(dport), options=[('Timestamp',(0,0))], chksum = 0)
>>> del pak[IP].chksum
>>> del pak[TCP].chksum
>>> pak.show2()
###[ IP ]###
  version   = 4L
  ihl       = 5L
  tos       = 0x0
  len       = 1200
  id        = 32711
  flags     = DF
  frag      = 0L
  ttl       = 64
  proto     = tcp
  chksum    = 0x9afd
  src       = 100.99.98.97
  dst       = 10.9.8.7
  \options   \
###[ TCP ]###
     sport     = 2927
     dport     = www
     seq       = 0
     ack       = 0
     dataofs   = 8L
     reserved  = 0L
     flags     = S
     window    = 8192
     chksum    = 0x2c0e
     urgptr    = 0
     options   = [('Timestamp', (0, 0)), ('EOL', None)]
>>>
Run Code Online (Sandbox Code Playgroud)

  • 谢谢.我找到了另一个选项 - 将数据包转换为字符串,然后使用该字符串重新创建它. (3认同)
  • @Dima,感谢您的建议.我想避免使用`show2()`,因为所有输出都是不必要的.也许应该只有一个`recalc`包功能. (2认同)