scapyパケットをピクルスにする必要があります。ほとんどの場合、これでうまくいきますが、pickler が関数オブジェクトについて不平を言うことがあります。経験則として: ARP パケットは問題なくピクルします。一部の UDP パケットには問題があります。
6 に答える
私の解決策(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通過したいところはどこでも、それをaでQueue包み、後でそれを包みます。この方法で保持されていないデータを認識していません。ただし、このアプローチはパケットでのみ機能します。(通常のNIC(WLANではない)でスニッフィングされるすべてのパケットはイーサネットです。)おそらく、他のタイプでも機能するように拡張できます。PicklablePacket__call__Ethernet
pickleが一般的にシリアル化することを意味する場合は、いつでもpcapのインポート/エクスポートメソッド(rdpcapおよびwrpcap)を使用できます。
wrpcap("pkt.pcap",pkt)
pkt = rdpcap("pkt.pcap")
または、プロセスを起動して、別のプロセスでパケットを取得することもできます。一致させることができるパターンがある場合、既知のポートまたはソースIPtcpdumpが機能するとします。
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 は十分に監視されており、非常に反応が良い傾向があります。ここで答えが得られない場合は、こちらも試してください。
この質問に触発されたように、 dillライブラリ (または sPickle などの他のライブラリ - pypi search pickleを参照) を使用して、scapy パケットを保存できます。sudo easy_install dillたとえば、またはを使用して 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)
オブジェクト内の関数を pickle 化可能な表現との間で変換するPacketクラス、inject__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