LinuxでWIFIパケットをキャプチャして、パケットがキャプチャされた周波数/チャネルを確認しようとしています。 Wiresharkを試してみましたが、運も help もありませんでした。 Wiresharkの サンプルパケット を使用していますが、周波数/チャネルを確認できます。
だから今私はスケイピーで実験しています。スニッフィングされたパケットの周波数/チャネルを把握したかったのですが、まだ運がありません。 Scapyでこれを行う方法はありますか?.
追伸ScapyやPythonよりも優れたツールがある場合は、コメントをいただければ幸いです。
この回答は、質問のタイトルと内容を範囲としています。パケットの周波数とチャネルにゲッターとセッターを提供します。
このソリューションでは、Wiresharkの Sample Captures にある wpa-Induction.pcap ファイルを使用します。
ScapyがScapyインタープリターでアクセスできるフィールドを確認するには、1つのパケットをざっと見回すと便利です。
_>>> pkts = rdpcap('wpa-Induction.pcap')
>>> pkts[0].summary()
"RadioTap / Dot11FCS / Dot11Beacon / Dot11Elt / Dot11EltRates / Dot11Elt / Dot11Elt / Dot11Elt / Dot11Elt / Dot11EltRSN / Dot11Elt / Dot11EltVendorSpecific / Dot11EltMicrosoftWPA / SSID=''"
>>> pkts[0].show()
###[ RadioTap dummy ]###
version= 0
pad= 0
len= 24
present= Flags+Rate+Channel+Lock_Quality+Antenna+dB_AntSignal+RXFlags
Flags= FCS
Rate= 2
Channel= 2412
ChannelFlags= CCK+2GHz
Antenna= 84
notdecoded= '\x00\x00+\x00\x00\x9fa\xc9\\'
... <output truncated> ...
_
2412は周波数であり、チャネルではありませんが、これが必要なデータです。 RadioTapはpkts[0].summary()
ごとのレイヤーです。それを一緒に入れて、
_>>> frequency = pkts[0][RadioTap].Channel
>>> print(frequency)
2412
_
Scapy アクセスを提供しません チャンネルへのアクセスですが、周波数をチャンネルに変換するのは簡単です。
ファイルとパケット番号を指定すると、パケットのチャネルと周波数を取得できます。
_from scapy.all import RadioTap, rdpcap
def getChannel(frequency):
base = 2407 # 2.4Ghz
if frequency//1000 == 5:
base = 5000 # 5Ghz
# 2.4 and 5Ghz channels increment by 5
return (frequency-base)//5
def getFrequency(file, packet_number):
pkts = rdpcap(file)
# Scapy mixes up Channel/Frequency here
frequency = pkts[packet_number][RadioTap].Channel
return frequency
freq = getFrequency('wpa-Induction.pcap', 0)
chan = getChannel(freq)
print("Channel: {0} \nFrequency: {1}".format(freq, chan))
_
頻度を5300に変更して保存したいとします。これには、パケットリストの反復、すべてのパケットの頻度の変更、結果の保存のみが必要です。 scapyインタプリタでは:
_>>> for i in range(len(pkts)):
... pkts[i][RadioTap].Channel = 5300
>>> wrpcap('temp.pcap', pkts)
>>> pkts2 = rdpcap('temp.pcap')
>>> pkts[0].Channel
5300
_