scapy独立层,无封装

0 投票
1 回答
808 浏览
提问于 2025-04-16 20:48

我在尝试创建一个协议,但遇到了一些理解上的问题。我为每一层都创建了一个类,然后又写了一些方法来帮我构建数据包,把这些层一个叠一个地放在一起。

当我创建一个数据包时:

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]。这样会提供两个独立的封装,而不是把它们叠在一个协议层级里

撰写回答