簡體   English   中英

Scapy:從具有自己的init的Packet派生的層

[英]Scapy: Layer derived from Packet with own init

是否可以使用自己的__init__()函數構造自己的圖層? 我正在嘗試的方法是:

>>> class SomePacket(Packet):
...     def __init__(self, number):
...             fields_desc = [IntField("Number",number)]
... 
>>> packet = SomePacket(1)
>>> ls(packet)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/dist-packages/scapy/packet.py", line 1213, in ls
    if not isinstance(obj.payload, NoPayload):
  File "/usr/lib/python2.7/dist-packages/scapy/packet.py", line 180, in __getattr__
    raise AttributeError(attr)
AttributeError: payload

這樣做有什么問題,我該如何編寫類以使其與一種構造函數一起使用?

天空是極限,您可以按自己喜歡的方式擴展或濫用船舷。 因此,是的,可以有自己的__init__但是您必須重新實現一些簡單的代碼,或者至少調用超類以適合接口。 另外,您還必須將fields_desc定義為類/實例var而不是__init__本地var(即,將代碼更改為self.fields_desc以使其成為實例var或明確地使其成為類var)。

但是,如果您只是嘗試為圖層字段分配值,最好不要重新發明輪子,而是使用scapy設計它的方式,因為它已經提供了類似__init__界面。

class SomePacket(Packet):
    fields_desc = [IntField("Number",1),  # capital letters are not convenient
                   IntField("yournumber",1),]


packet = SomePacket(Number=1, yournumber=99)
packet.show()

導致:

###[ SomePacket ]###
  Number    = 1
  yournumber= 99

我必須重寫__init__的唯一一層是SSL / TLS層,該層為跨越多個層(用於解密等)的ssl上下文(加密/密鑰)提供了一個隱藏字段。

暫無
暫無

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

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