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
是否可以使用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