Scapy независимых слоев, без инкапсуляции - PullRequest
0 голосов
/ 04 июля 2011

Я пытаюсь создать протокол, и у меня есть некоторые проблемы с пониманием.Я создал класс для каждого слоя.Затем я создал несколько методов, которые создают пакеты для меня, складывая слои один над другим.

Когда я создаю пакет:

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 голосов
/ 05 июля 2011

Если вы не хотите Bar внутри Foo, я не понимаю, почему вы не используете список ... например, это список из двух пингов до 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].Это обеспечило бы две различные инкапсуляции, вместо того, чтобы они помещались в иерархию протоколов

...