scapy“ Ether()”没有“ chksum”参数

时间:2019-04-29 23:15:44

标签: scapy ethernet

“帧检查序列”是整个以太网帧上的32位CRC“校验和”,从DMAC开始并覆盖SMAC,类型和有效负载。它作为以太网帧的最后四个字节传输,就在数据包间隔之前。

我希望Scapy的Ether()方法具有该字段的数据包属性的参数。不会。

请注意,诸如IP()和TCP()/ UDP()之类的Scapy方法包含一个校验和参数(“ chksum”),用于为这些协议定义的其他校验和。

例如...

> IP( raw(UDP(chksum=0) / IP(version=4, chksum(0)) )
<IP  version=0 ihl=0 tos=0x35 len=53 id=28 flags= frag=0 ttl=69 proto=hopopt chksum=0x14 src=0.1.0.0 dst=64.0.0.0 |<Raw load='\x7f\x00\x00\x01\x7f\x00\x00\x01' |>>
> ls(Ether)
dst    : DestMACfield    = (None)
src    : SourceMACfield  = (None)
type   : XShortEnumField = (36864)
> Ether( raw(Ether()) )
<Ether dst=ff:ff:ff:ff:ff:ff src=12:34:56:78:9a:bc type=LOOP |>
> Ether.chksum()
AttributeError: chksum

1 个答案:

答案 0 :(得分:1)

由于两个原因,未在Scapy的以太网帧上实现FCS。

  • 首先,从历史上看,Scapy很难在包的末尾获得FCS(但现在已经不复存在了,因为FCSField已经成为问题了。)
  • 第二,大多数操作系统默认不提供它,而当它们提供时,除了假定数据包末尾的填充是FCS之外,没有其他方法可以知道实际上存在FCS。如果您认为应该添加它,则可能应该在其跟踪器上打开一个问题。

原始答案:

您似乎是Scapy的新手,应该从official doctutorial开始。

Scapy在构建数据包时会自动构建chksum参数。构建数据包意味着将其转换为字节:使用bytes(pkt)raw(pkt)(或pkt.build()

例如,show2()显示了构建时数据包的外观:

>>> pkt = IP()/UDP()/ICMP()
>>> pkt.show2()
 ###[ IP ]### 
  version= 4
  ihl= 5
  tos= 0x0
  len= 36
  id= 1
  flags= 
  frag= 0
  ttl= 64
  proto= udp
  chksum= 0x7cc6   <-------
  src= 127.0.0.1
  dst= 127.0.0.1
[...]

仅在None时才计算校验和,因此可以在需要时设置自定义(不正确)的校验和。如果要检查其中包含的内容,可以手动构建数据包:

>>> pkt = IP(raw(pkt))
>>> pkt[IP].chksum
31942