PCAPファイルを解析していて、TCPフラグ(SYN、ACK、PSH、URGなど)を抽出する必要があります。)取得するためにpacket['TCP'].flags
値を使用しています一度にすべてのフラグ。
pkts = PcapReader(infile)
for p in pkts:
F = bin(p['TCP'].flags)
print F, bin(F), p.summary()
# manual flags extraction from F
packet['TCP'].flags
値から手動で抽出せずに、単一のTCP=フラグを取得する方法はありますか?
通常、FLAGSを処理する通常の方法は、ビットマップおよびビットごとの演算子を使用することです。 Packet
クラスにフラグをテストする特定のメソッドがない場合、IMHOで実行できる最善の方法は次のとおりです。
FIN = 0x01
SYN = 0x02
RST = 0x04
PSH = 0x08
ACK = 0x10
URG = 0x20
ECE = 0x40
CWR = 0x80
そして、次のようにテストします。
F = p['TCP'].flags # this should give you an integer
if F & FIN:
# FIN flag activated
if F & SYN:
# SYN flag activated
# rest of the flags here
残念ながら、pythonにはこれをよりエレガントにするswitch
ステートメントがありませんが、それほど重要ではありません。
お役に立てれば!
Packet.sprintf()
メソッドを使用できます。
>>> p = IP()/TCP(flags=18)
>>> p.sprintf('%TCP.flags%')
'SA'
「長い」名前が必要な場合は、長いdict
...if
...式ではなくElif
を使用します(dict
がよく使用されますPython他の言語でswitch
を使用する場合):
>>> flags = {
'F': 'FIN',
'S': 'SYN',
'R': 'RST',
'P': 'PSH',
'A': 'ACK',
'U': 'URG',
'E': 'ECE',
'C': 'CWR',
}
>>> [flags[x] for x in p.sprintf('%TCP.flags%')]
['SYN', 'ACK']
この質問がなされた時には存在していなかった記録のための別のオプション。現在のScapy開発バージョンで動作します(この変更を含む最初のリリースは2.4.0です。2.4.0rc*にも含まれます)。
フラグ値でstr()
を使用できるようになりました。
>>> p = IP()/TCP(flags=18)
>>> p[TCP].flags
<Flag 18 (SA)>
>>> str(p[TCP].flags)
'SA'
これも機能します。
if packet[TCP].flags.F:
print('FIN received')