Scapy:层派生自包与自己的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

这样做有什么错,我应该如何编写类,以便与一种构造函数一起使用它?

无限制,您可以按照自己喜欢的方式扩展或滥用scapy。因此,拥有自己的__init__是可能的,但您必须重新实现一些scapy代码,或者至少调用超类以适应接口。此外,您必须将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上下文(加密/密钥)提供了一个隐藏字段,跨越多个层(用于解密,…)

最新更新