我正在寻找一种 pythonic 方式来表示一个 UDP 包,该包由不同长度的不同字段组成,等等。
我看到了bitstring,但是定义所有字段及其长度的过程非常麻烦。我可能需要创建一个类并为每个字段和长度创建一个变量,并检查它们是否不会被更大的数字覆盖等等。
对我来说,这听起来像是图书馆的工作,但我找不到。
有谁知道适合这项任务的图书馆?
我正在寻找一种 pythonic 方式来表示一个 UDP 包,该包由不同长度的不同字段组成,等等。
我看到了bitstring,但是定义所有字段及其长度的过程非常麻烦。我可能需要创建一个类并为每个字段和长度创建一个变量,并检查它们是否不会被更大的数字覆盖等等。
对我来说,这听起来像是图书馆的工作,但我找不到。
有谁知道适合这项任务的图书馆?
第一种方法是使用“包含电池”的模块,例如:
现在如果你想创建一个自定义数据包,有两种方法可以使用scapy
创建一个新的自定义协议,或者你可以使用ctypes
这样struct
的:
import os
import struct
from ctypes import *
class myUDP(Structure):
_fields_ = [
("sport", c_ushort),
("dport", c_ushort),
("sum", c_ushort),
("len", c_ushort)
]
def __new__(self, packet=None):
return self.from_buffer_copy(packet)
def __init__(self, packet=None):
# unpack your data, etc...
self.srcport = struct.unpack("H",self.sport)
以上是 UDP 标头(未经测试)的低级、简单且尽可能少的示例表示:
虽然这在现实世界的场景中使用起来有点困难,但协议很复杂,因为它需要大量的技术工作、错误处理等......才能成为一个完整的数据包解码器。
您可以使用 scapy 进行数据包操作
from scapy.all import *
packet = IP(src="1.1.1.1", dst="2.2.2.2")/UDP(dport=4321, sport=123)/"payload"
print str(packet)
# output: 'E\x00\x00#\x00\x01\x00\x00@\x11t\xc4\x01\x01\x01\x01\x02\x02\x02\x02\x00{\x10\xe1\x00\x0f+?payload'