Как мариновать пакет scapy? - PullRequest
12 голосов
/ 11 ноября 2010

Мне нужно засолить пакет scapy. В большинстве случаев это работает, но иногда сборщик жалуется на функциональный объект. Как правило: пакеты ARP засолены нормально. Некоторые пакеты UDP являются проблематичными.

Ответы [ 6 ]

7 голосов
/ 30 ноября 2010

Мое решение (вдохновленное списком рассылки scapy) выглядит следующим образом:

class PicklablePacket:
    """A container for scapy packets that can be pickled (in contrast
    to scapy packets themselves)."""
    def __init__(self, pkt):
        self.contents = bytes(pkt)
        self.time = pkt.time

    def __call__(self):
        """Get the original scapy packet."""
        pkt = scapy.Ether(self.contents)
        pkt.time = self.time
        return pkt

Везде, где я хочу передать scapy Packet через Queue, я просто обертываюPicklablePacket и __call__ потом.Мне не известны данные, которые не сохраняются таким образом.Однако этот подход работает только с Ethernet пакетами.(Все пакеты, прослушиваемые на обычном сетевом адаптере (не WLAN), являются Ethernet.) Возможно, он может быть расширен и для других типов.

4 голосов
/ 12 ноября 2010

Если под pickle вы подразумеваете обобщенную сериализацию, вы всегда можете использовать методы импорта / экспорта pcap: rdpcap и wrpcap .

wrpcap("pkt.pcap",pkt)
pkt = rdpcap("pkt.pcap")

Или вы можете запустить свой процесс и получитьпакеты в другом процессе.Если есть какой-то шаблон, который вы можете сопоставить, скажем, будет работать известный порт или IP-адрес источника tcpdump:

tcpdump -i eth0 -w FOO.pcap host 172.20.33.12 and \(udp or arp\)

Затем вы можете прочитать сгенерированный pcap, как указано выше:

pkts = rdpcap('FOO.pcap')
3 голосов
/ 11 ноября 2010

(это больше для справки, поэтому голосов не ожидается)

Список Scapy scapy.ml@secdev.org хорошо отслеживается и, как правило, очень отзывчив.Если вы не получили здесь ответов, попробуйте и там.

1 голос
/ 16 июня 2014

Вдохновленный этим вопросом , можно использовать библиотеку dill (или другие, такие как sPickle и т. Д. - см. Pypi Search Pickle ) для сохранения пакетов scapy. Например. Установите укроп, используя sudo easy_install dill или sudo pip install dill. Вот базовый сценарий использования:

import dill as pickle
# E.g. Dump an array of packets stored in variable mypackets to a file
pickle.dump(mypackets, open('mypackets.dill-pickle', 'w'))
# Restore them from the file
mypackets = pickle.load(open('mypackets.dill-pickle', 'rb'))

Также можно, конечно, просто использовать встроенные функции scapy для выгрузки пакетов в файл pcap (читаемый tcpdump / wireshark и т. Д.) - если у вас просто есть массив пакетов:

wrpcap("packets_array.pcap",packets_array)
0 голосов
/ 28 мая 2016

Чтобы класс PicklabePacket работал с Scapy 3.0.0, вы можете использовать это определение класса:

class PicklablePacket:
"""A container for scapy packets that can be pickled (in contrast
to scapy packets themselves).
This works for python 3.5.1 and scapy 3.0.0 """

def __init__(self, pkt):
    self.__contents = pkt.__bytes__()
    self.__time = pkt.time

def __call__(self):
    """Get the original scapy packet."""
    pkt = scapy.all.Ether(self.__contents)
    pkt.time = self.__time
    return pkt
0 голосов
/ 23 ноября 2010

Вы можете подключить класс Packet и внедрить методы __getstate__ и __setstate__, которые преобразуют функцию в объекте из и в выбираемое представление.Подробнее см. здесь .

def packet_getstate(self):
    # todo

def packet_setstate(self, state):
    # todo

from scapy.packet import Packet
Packet.__getstate__ = packet_getstate
Packet.__setstate__ = packet_setstate
...