Python Scapy - 在 UDP 数据中创建一个新的协议定义

Python Scapy - create a new protocol definition within UDP Data

是否可以使用Scapy的PcapReader来分析带有自定义字段的UDP包数据?例如UDP数据包Data中(见附件Wireshark抓包),有如下字段my_proto:

VER - 2 bytes
FLAGS - 2 bytes
TIMESTAMP - 8 bytes
VAL1 - 4 bytes
VAL2 - 4 bytes, etc

我想解析这些字段,这样对于收到的每个数据包我都可以检索 [my_proto].VER、[my_proto].FLAGS 等

我想我想要的与文档中的 Disney 示例类似,但是,我不确定如何将它绑定(不确定是否正确)到 UDP 的数据部分。 (https://scapy.readthedocs.io/en/latest/build_dissect.html)

如您所说,您的协议可能类似于:

from scapy.all import Packet,LEShortField, LELongField, LEIntField

class GreatProtocol(Packet):
    name = "GreatProtocol "
    fields_desc=[ LEShortField("VER", 0),
                  LEShortField("FLAGS",0),
                  LELongField("TIMESTAMP", 0),
                  LEIntField("VAL1", 0),
                 ]

现在,要绑定您需要使用函数绑定。 您可以通过 3 种不同的方式使用它:

  • 所有 UDP 负载都是 GreatProtocol(不推荐)
  • 所有目标端口为 X 的 UDP 都是 GreatProtocol(最合乎逻辑的)
  • 所有源端口为 X 的 UDP 都是 GreatProtocol
from scapy.all import bind_layers
from scapy.layers.inet import UDP


# All UDP payload are GreatProtocol (not recomended)
bind_layers(UDP, GreatProtocol)

# All UDP with dest port = X are GreatProtocol (most logical)
bind_layers(UDP, GreatProtocol, dport=55)


# All UDP with src port = X are GreatProtocol
bind_layers(UDP, GreatProtocol, sport=99)

请注意,我展示了使用 src 和 dst 端口,但您可以使用 UDP 层的任何字段

也可以选择一次性使用。



my_packet[UDP].decode_payload_as(GreatProtocol)

文档:

正在创建图层:https://scapy.readthedocs.io/en/latest/build_dissect.html

绑定层:https://scapy.readthedocs.io/en/latest/build_dissect.html#binding-layers

decode_payload_as: https://scapy.readthedocs.io/en/latest/api/scapy.packet.html#scapy.packet.Packet.decode_payload_as