scapy
をpython
とともに使用して、ライブトラフィックを盗聴しています。
capture=sniff(iface="<My Interface>", filter="tcp")
しかし、これは各パケットをスニッフィングし、後で処理できるリストcapture
に追加します。
パケットを処理し、スニッフィングされたらすぐにパケットのいくつかのフィールドを表示したい。つまり、パケットをスニッフィングすると、そのパケットを分析できる機能がトリガーされます。そして、これは少数のパケットで継続します。
キャプチャされたパケットリストで使用している関数の準備ができました。しかし、私はそれを各ライブパケットに使用することはできません。
それを達成する方法は? scapy
で可能ですか、それとも他のパッケージをインストールする必要がありますか?
Sniff関数のパラメーターは、次のコードのようになります。
from scapy.all import *
def pkt_callback(pkt):
pkt.show() # debug statement
sniff(iface="<My Interface>", prn=pkt_callback, filter="tcp", store=0)
store=0
は受信したパケットを保存しないことを示し、prn
はpkt
をpkt_callback
に送信することを示します。
Yoel で述べたように、1つのアクションのみが必要な場合、この場合のような新しい関数の代わりにlambda
でprn
を使用できます。
sniff(iface="<My Interface>", prn = lambda x: x.show(), filter="tcp", store=0)
これは、prn
関数のsniff
引数を使用して実行できます。 Scapy
のチュートリアルには、単純な例 here があります。 Scapy
の- 公式APIドキュメント は以下を指定します。
sniff(prn=None, lfilter=None, count=0, store=1, offline=None, L2socket=None, timeout=None)
...
prn
:各パケットに適用する関数。何かが返された場合、それが表示されます。たとえば、prn = lambda x: x.summary()
を使用できます。
...
編集:
受け入れられた答えstore
コールバックを呼び出すには、prn
引数を0
に設定する必要があると主張しています。ただし、store=0
を設定しても、そのような効果はありません。 Scapy
の独自の例store=0
を設定しないでください 公式のAPIドキュメント はそのような要件について言及していません。実際、Scapy
のソースコードを調べると、store
引数とprn
引数の間には何の関係もないことがわかります。関連するコードブロックの抜粋を次に示します。
...
if store:
lst.append(p)
c += 1
if prn:
r = prn(p)
if r is not None:
print r
...
いくつかの簡単なテストケースを実行すると、この発見もサポートされます。