繁体   English   中英

如何腌制一个scapy包?

[英]How to pickle a scapy packet?

我需要腌制一个scapy包。 大部分时间都可以使用,但有时候pickler会抱怨一个函数对象。 根据经验:ARP数据包泡菜很好。 一些UDP数据包存在问题。

我的解决方案(受到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

我希望通过Queue传递scapy Packet任何地方我只需将其包装在PicklablePacket然后将__call__包裹起来。 我不知道没有以这种方式保留的数据。 但是,此方法仅适用于Ethernet数据包。 (在常规NIC(而不是WLAN)上嗅探的所有数据包都是以太网。)它可能也可以扩展为适用于其他类型的数据包。

如果通过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')

(这更多是供参考,所以没有预期的投票)

Scapy列表scapy.ml@secdev.org受到良好监控,往往反响灵敏。 如果你在这里没有得到答案,那就试试吧。

受这个问题的启发,人们可以使用莳萝库(或其他像sPickle等 - 请参阅pypi搜索泡菜 )来保存scapy数据包。 例如,使用sudo easy_install dillsudo 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)

要使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

您可以monkeypatch Packet类并注入__getstate____setstate__方法, __setstate__方法将对象中的函数转换为__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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM