2017-09-28 44 views
1

私はpcapファイルからパケットをフィルタリングし、さらに処理する必要があります。 ファイルは非常に大きいので、一度にすべてをメモリに読み込むことはできません。 Scapyは非常に洗練されているようだと私は残念ながら、私はPcapReaderこれだけ一致するパケットのいずれにもフィルタ(例えばBPF)を適用する方法を見つけることができませんでしたpython scapy filter pcapファイル

with PcapReader(pcap) as pcap_reader: 
    for pkt in pcap_reader: 
     ... 

でパケットを反復処理することができた反復処理されますpktscapy.packet!?)である必要はありません。

私は、引数としてフィルタを取るtsharkデコーダである関数tdecodeがあることを知りましたが、結果のパケットを変数に保存するのではなく、すべての結果を端末にあふれさせる方法はありません。

.pcapファイルのパケットをscapyでフィルタリングし、結果を繰り返し処理する方法はありますか?

+0

をあなたがすることはできません最初のtshark(これはかなり高速です)でフィルターをかけ、scapyでさらに新しいpcapを処理しますか?後処理が高価な場合は、おそらくlibpcapを直接使用するほうが良いでしょう。 – pchaigno

答えて

2

Scapyは信じられないほど遅く、インタラクティブな使用が唯一の用途です。また、完全な(パイソン内の)解剖の前にパケットをフィルタリングすることもできないため、問題が蔓延します。

libpcapは、自分で小さなCエクステンションを書くか、を使ってPcapReaderの代わりに使うことができます。 libpcapでは、BPF-syntaxにフィルタを指定することができます。このフィルタは、ライブラリ内の着信パケットに適用されます。または、デバイスからライブをキャプチャするときに、カーネル自体によって適用されます。これにより、パフォーマンスが大幅に向上します。

基本的なレイアウトは、になるであろう:

  • open_offline() PCAPファイル
  • はlibpcapの提供ハンドル
  • からBPFフィルタ
  • リードscapyに着信パケットデータを渡す設定しましたさらなる検査のために

あなたはquite sophisticatedを得ることができます。

0

tcpdump()関数を使用して、BPFフィルタを適用できます。それはあなたのために、いくつかの興味深いものならPcapReader()filterパラメータを受け入れ(およびoffline=パラメータで多かれ少なかれsniff()のように振る舞うように

with PcapReader(tcpdump("myfile.cap", args=["-w", "-", "my BPF filter"], 
         getfd=True)) as pcap_reader: 
    for pkt in pcap_reader: 
     print pkt.summary() 

、多分あなたは、機能要求を提出することができます。

関連する問題