[英]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 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)
要使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.