python - Scapy:向 fields_desc 添加更多字段

标签 python scapy packets

我正在尝试创建一个新协议(protocol)。问题是,需要动态地将更多字段添加到 fields_desc 中,但我不确定如何实现这一点。 在 Scapy 文档中,我读到 Scapy 中的一层实际上只是一个可以操作的字段列表,但 Scapy 似乎不喜欢以下内容:

>>> class SomePacket(Packet):
...         
...     name = "SomePacket"
...     fields_desc = [ IntField("Number",0) ]
...             
...     def add_IntField(self, name, value):
...         self.fields_desc.append(IntField(name, value))
... 
>>> packet = SomePacket()
>>> ls(packet)
Number     : IntField             = 0               (0)
>>> packet.add_IntField("X",1)
>>> ls(packet)
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/usr/lib/python2.7/dist-packages/scapy/packet.py", line 1212, in ls
    print "%-10s : %-20s = %-15s (%s)" % (f.name, f.__class__.__name__, repr(getattr(obj,f.name)), repr(f.default))
  File "/usr/lib/python2.7/dist-packages/scapy/packet.py", line 176, in __getattr__
    fld,v = self.getfield_and_val(attr)
  File "/usr/lib/python2.7/dist-packages/scapy/packet.py", line 172, in getfield_and_val
    return self.payload.getfield_and_val(attr)
  File "/usr/lib/python2.7/dist-packages/scapy/packet.py", line 1057, in getfield_and_val
    raise AttributeError(attr)
AttributeError: X
>>> packet = SomePacket()
>>> ls(packet)
Number     : IntField             = 0               (0)
X          : IntField             = 1               (1)

因此,当我添加字段后第一次尝试显示数据包内容时,它不起作用。但如果我再次创建数据包,该属性就会突然出现。我做错了什么?

最佳答案

你不应该这样做。当您创建新的 SomePacket 对象时,Packet__init__() 函数采用 fields_desc 列表来初始化还有很多其他的东西。向 fields_desc 动态添加新值会导致不一致,从而产生给定的错误。

一种解决方案是将 add_IntField 函数更改为 classmethod 并在创建新对象之前添加所需的字段,如下所示:

>>> class SomePacket(Packet):
...         
...     name = "SomePacket"
...     fields_desc = [ IntField("Number",0) ]
...     
...     @classmethod
...     def add_IntField(cls, name, value):
...         cls.fields_desc.append(IntField(name, value))

>>> SomePacket.add_IntField('X', 1)
>>> packet = SomePacket()
>>> ls(packet)
Number     : IntField             = 0               (0)
X          : IntField             = 1               (1)

关于python - Scapy:向 fields_desc 添加更多字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31022015/

相关文章:

python - 在Python中解析来自MapQuest反向地理编码api的数据?

python - 使用 pip : Command "python setup.py egg_info" failed with error code 1 安装 pygame

python - 为什么我的标准输出会干扰我的 python 网页?

networking - 以编程方式模拟数据包丢失和延迟

python - PyEphem:冬至和春分的日期及其在较长时间尺度上的有效性

python - 如何使用 scapy PcapWriter 对数据包强制执行错误的校验和?

python - 使用 Scapy 解析 PPPoE 标签

security - 合法代码中出现 0x90 (NOP) 序列

SSL 语法 - 它看起来如何?

python - 用星号python分割字符串