【问题标题】:How to create a custom top-level layer 2 header in scapy?如何在 scapy 中创建自定义顶层第 2 层标头?
【发布时间】: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


【解决方案1】:

我最终通过手动切掉标题解决了这个问题,没有自定义 Packet 对象:

s = str(pkt).encode("hex")
delim = int(s[:2])
index = int(s[2:6], 16)
rest = Ether(s[6:].decode("hex"))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-27
    • 2016-04-02
    • 2011-10-08
    • 1970-01-01
    • 2019-07-29
    • 1970-01-01
    相关资源
    最近更新 更多