繁体   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