aui*_*ino 12 python tcp packet-capture scapy packet
我正在解析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
Run Code Online (Sandbox Code Playgroud)
有没有办法获得单个TCP标志而无需手动从packet['TCP'].flags值中提取它?
Pau*_* Bu 13
通常,处理FLAGS的常用方法是使用位图和按位运算符.如果你的Packet班级没有特定的方法来测试旗帜,你可以做的最好的事情是恕我直言:
FIN = 0x01
SYN = 0x02
RST = 0x04
PSH = 0x08
ACK = 0x10
URG = 0x20
ECE = 0x40
CWR = 0x80
Run Code Online (Sandbox Code Playgroud)
并像这样测试它们:
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
Run Code Online (Sandbox Code Playgroud)
可悲的是,python没有switch声明使它更优雅,但它并不重要.
希望这可以帮助!
Pie*_*rre 13
您可以使用以下Packet.sprintf()方法:
>>> p = IP()/TCP(flags=18)
>>> p.sprintf('%TCP.flags%')
'SA'
Run Code Online (Sandbox Code Playgroud)
如果你想在"长"的名字,使用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']
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
27898 次 |
| 最近记录: |