Linux 上の Python から、802.11 管理の「プローブ要求」フレームを盗聴したいと思います。これは、次のように Scapy から可能です。
# -*- coding: utf-8 -*-
from scapy.all import *
def proc(p):
if ( p.haslayer(Dot11ProbeReq) ):
mac=re.sub(':','',p.addr2)
ssid=p[Dot11Elt].info
ssid=ssid.decode('utf-8','ignore')
if ssid == "":
ssid="<BROADCAST>"
print "%s:%s" %(mac,ssid)
sniff(iface="mon0",prn=proc)
または、次のように tshark から:
tshark -n -i mon0 subtype probereq -R 'wlan.fc.type_subtype eq 4' -T fields -e wlan.sa -e wlan_mgt.ssid
tshark からの出力をリダイレクトし、Python で丸呑みすることもできます (きれいではありませんが、機能します)。
ただし、これらのオプションには両方とも GPL ライセンスが適用されるため、潜在的な商用プロジェクトは扱いにくいものになります。したがって、この特定の問題に対してPythonで「低レベル」のソリューションを見つけようとしています。Google から、次の 2 つの方向性を試すことができました。
Pcap ライブラリ: Python で使用できる 3 つの pcap ライブラリがあるようです: pylibpcap、pypcap、およびpcapy。上記の機能をこれらに組み込む方法がよくわかりません。サンプルコードやソリューションは素晴らしいでしょう。
生のソケット: PF_PACKET: "パケット ソケットは、デバイス ドライバー (OSI レイヤー 2) レベルで生のパケットを送受信するために使用されます。ユーザーは、物理層の上のユーザー空間にプロトコル モジュールを実装できます。"
これは、pcap を完全にバイパスする別のオプションのように思えます。これは、pcap ライブラリのオーバーヘッドを取り除くより良いアプローチである可能性があるというコメントを聞いたことがあります。ただし、どこからこれに取り組み始めればよいかわかりません。
これを解決するための助けをいただければ幸いです。