簡體   English   中英

Scapy:向 fields_desc 添加更多字段

[英]Scapy: Adding more fields to fields_desc

我正在嘗試創建一個新協議。 問題是,需要向 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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM