使用Scapy获取TCP标志

2024-09-28 20:49:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在解析一个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标志?


Tags: 文件forbinpacket标志pcapinfiletcp
3条回答

另一种选择,作为记录,在提出这个问题时还不存在。它适用于当前的Scapy开发版本(包括此更改的第一个版本将是2.4.0;2.4.0rc*也包括它)。

现在可以对标志值使用str()

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

通常,处理标志的常用方法是使用位图和按位运算符。如果您的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

遗憾的是,python没有一个switch语句来使这个更加优雅,但这并不重要。

希望这有帮助!

您可以使用Packet.sprintf()方法:

>>> p = IP()/TCP(flags=18)
>>> p.sprintf('%TCP.flags%')
'SA'

如果你想要“长”的名字,用一个dict代替一个ifelif。。。表达式(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']

相关问题 更多 >