scapy "Ether()" 没有 "chksum" 参数
scapy "Ether()" does not have "chksum" argument
"frame check sequence" 是整个以太网帧的 32 位 CRC "checksum",从 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
由于两个原因,FCS 未在 Scapy 中的以太网帧上实现。
- 首先,从历史上看,如果 FCS 位于数据包的末尾,Scapy 很难获得它(但现在不再是这种情况,因为现在已经有了 FCSField)。
- 其次,大多数操作系统在默认情况下不提供它,当它们提供时,除了假设数据包末尾的填充是 FCS 之外,无法知道实际上存在 FCS。如果你觉得应该添加它,你应该在他们的跟踪器上打开一个问题。
原回答:
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
"frame check sequence" 是整个以太网帧的 32 位 CRC "checksum",从 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
由于两个原因,FCS 未在 Scapy 中的以太网帧上实现。
- 首先,从历史上看,如果 FCS 位于数据包的末尾,Scapy 很难获得它(但现在不再是这种情况,因为现在已经有了 FCSField)。
- 其次,大多数操作系统在默认情况下不提供它,当它们提供时,除了假设数据包末尾的填充是 FCS 之外,无法知道实际上存在 FCS。如果你觉得应该添加它,你应该在他们的跟踪器上打开一个问题。
原回答:
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