この回答は、質問のタイトルと内容を範囲としています。パケットの周波数とチャネルにゲッターとセッターを提供します。
このソリューションでは、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