【发布时间】:2020-01-08 22:43:12
【问题描述】:
假设我有以下内容:
class Delimiter(Packet):
name = "Delimiter"
fields_desc = [
ByteField("val", 0)
]
class OutHeader(Packet):
name = "Out Header"
fields_desc = [
ShortField("index", 0)
]
bind_layers(Delimiter, OutHeader, val=0)
bind_layers(OutHeader, Ether)
我想让Delimeter 成为第 2 层标头,这样数据包顶部就没有 Ether 标头。我怎样才能做到这一点?仅使用这段代码,Scapy 就会改为:
###[ 802.3 ]###
dst = 00:51:99:ff:ff:ff
src = ff:ff:ff:00:00:00
len = 0
###[ Padding ]###
【问题讨论】:
-
我认为您混淆了网络层。数据包是第 3 层,是第 2 层(例如以太网)帧的有效负载。
-
@RonMaupin 感谢您的回复。不,我指的是我观察到 Scapy 似乎在第 2 层开始解剖数据包,但我不知道如何在数据包的前面定义一个层,例如 Ether、Dot3 等。
-
你不要那样做。数据链路层由接口和驱动程序定义。例如,您不能在以太网接口上发送令牌环帧,反之亦然。帧类型没有字段,例如帧具有 EtherType,或者数据包具有协议字段等。
-
@RonMaupin 我想是这样的。不过,请注意数据包的原始字节。 00 显然是分隔符,51:99 显然是 Out Header 和 ff:.... 是目标 MAC。我只想解析那种格式的数据包。
-
对于以太网,有一个七字节同步(交替的 1 和零),然后是一个八字节的帧起始分隔符(交替的 1 和 0 直到最后一位,这也是一个,连续生成两个),然后帧以目标 MAC 地址开始。此外,在帧的末尾,线路上有一个 12 字节的静默间隙。这就是以太网帧的分隔方式。没有
00帧分隔符。框架在 SoF 中的11之后立即开始。其他数据链路协议的做法不同。
标签: networking scapy packet packet-sniffers