12

scapyパケットをピクルスにする必要があります。ほとんどの場合、これでうまくいきますが、pickler が関数オブジェクトについて不平を言うことがあります。経験則として: ARP パケットは問題なくピクルします。一部の UDP パケットには問題があります。

4

6 に答える 6

7

私の解決策(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

于 2010-11-30T09:29:03.590 に答える
4

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')
于 2010-11-11T21:06:19.677 に答える
3

(これは参考用なので、投票は期待されていません)

Scapy リスト scapy.ml@secdev.org は十分に監視されており、非常に反応が良い傾向があります。ここで答えが得られない場合は、こちらも試してください。

于 2010-11-11T17:35:51.633 に答える
1

この質問に触発されたように、 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)
于 2014-06-16T13:22:28.430 に答える
0

オブジェクト内の関数を 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
于 2010-11-23T13:55:14.660 に答える