2013-12-06 4 views
11

Я разбираю файл PCAP, и мне нужно извлечь флаги TCP (SYN, ACK, PSH, URG, ...). Я использую значение packet['TCP'].flags для получения всех флагов одновременно.Get TCP Flags with Scapy

pkts = PcapReader(infile) 
for p in pkts: 
     F = bin(p['TCP'].flags) 
     print F, bin(F), p.summary() 
     # manual flags extraction from F 

Есть ли способ, чтобы получить единый флаг TCP без вручную извлечь его из packet['TCP'].flags значения?

+0

Определить разумный способ? Как вы это делаете вручную? –

+0

Итак, вы говорите, что этот подход работает? В чем проблема с кодом? –

ответ

10

Обычно обычным способом обработки FLAGS является битмап и побитовые операторы. Если Packet класс не имеет специфический метод тестирования для флагов, самое лучшее, что вы можете сделать, ИМХО это:

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 

К сожалению, питон Безразлично» t имеет заявление switch, чтобы сделать его более элегантным, но это не имеет большого значения.

Надеюсь, это поможет!

9

Вы можете использовать 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'] 
0

Другой вариант, для записи, который не существовал к тому моменту, когда задавался этот вопрос. Он работает с текущей версией разработки Scapy (первая версия, включая это изменение, будет 2.3.4).

Теперь вы можете использовать str() на значении флага:

>>> p = IP()/TCP(flags=18) 
>>> p[TCP].flags 
<Flag 18 (SA)> 
>>> str(p[TCP].flags) 
'SA'