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
这样做有什么问题,我应该如何编写 class 以便将其与某种构造函数一起使用?
天空是极限,您可以按照自己喜欢的方式扩展或滥用 scapy。因此,是的,您可以拥有自己的 __init__
,但您必须重新实现一些 scapy 代码或至少调用 superclass 来适应接口。此外,您还必须将 fields_desc
定义为 class/instance 变量而不是 __init__
本地变量(即将您的代码更改为 self.fields_desc
以使其成为实例变量或使其成为class 显式变量)。
但是,如果您只是想为图层字段分配值,最好不要重新发明轮子并使用 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 上下文 (crypto/keys) 提供隐藏字段(用于解密, ...)
是否可以使用自己的 __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
这样做有什么问题,我应该如何编写 class 以便将其与某种构造函数一起使用?
天空是极限,您可以按照自己喜欢的方式扩展或滥用 scapy。因此,是的,您可以拥有自己的 __init__
,但您必须重新实现一些 scapy 代码或至少调用 superclass 来适应接口。此外,您还必须将 fields_desc
定义为 class/instance 变量而不是 __init__
本地变量(即将您的代码更改为 self.fields_desc
以使其成为实例变量或使其成为class 显式变量)。
但是,如果您只是想为图层字段分配值,最好不要重新发明轮子并使用 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 上下文 (crypto/keys) 提供隐藏字段(用于解密, ...)