scapy独立层,无封装
我在尝试创建一个协议,但遇到了一些理解上的问题。我为每一层都创建了一个类,然后又写了一些方法来帮我构建数据包,把这些层一个叠一个地放在一起。
当我创建一个数据包时:
a=Foo()/Bar() (or a=test())
我得到的结果像这样:
<Foo | <Bar |>>
,根据我的理解,这意味着这些数据包是被封装起来的(就像IP()/ICMP()
那样,这样做是有道理的)。现在,我的问题是我想要的结果更像是:
<Foo |> <Bar |>
我哪里做错了?下面是我使用的代码(简化版):
#!/usr/bin/env python
import logging
logging.getLogger("scapy").setLevel(1)
from scapy.all import *
class Foo(Packet):
name = "Foo packet"
fields_desc = [
ByteField("foo1", 0x23)
]
class Bar(Packet):
name = "Bar packet"
fields_desc = [
ByteField("bar1", 0x42)
]
def test():
a=Foo()
b=Bar()
return a/b
if __name__ == "__main__":
interact(mydict=globals(), mybanner="test-env")
现在,我不确定“/”这个符号在这种情况下是否合适。我应该怎么做才能更好呢?在我的协议中,这些层是独立的,而不是被封装的。
1 个回答
2
如果你不想在 Foo
里面放 Bar
,我不明白你为什么不使用列表……比如说,这里有一个包含两个 ping 的列表,目标是 10.2.2.2…… [IP(dst="10.2.2.2") / ICMP(), IP(dst="10.2.2.2") / ICMP()]
sr([IP(dst="10.2.2.2") / ICMP(), IP(dst="10.2.2.2") / ICMP()])
Begin emission:
........................*Finished to send 2 packets.
......*
Received 32 packets, got 2 answers, remaining 0 packets
(<Results: TCP:0 UDP:0 ICMP:2 Other:0>, <Unanswered: TCP:0 UDP:0 ICMP:0 Other:0>)
>>
或者在你的情况下…… return [a, b]
。这样会提供两个独立的封装,而不是把它们叠在一个协议层级里