2017-03-08 93 views
0

某些协议号为:如何获取PCAP文件中的协议号码?

6 TCP传输控制[RFC793] ... 17 UDP用户数据报[RFC768]

由IANA。

import pyshark 

pkts = pyshark.FileCapture('testes.pcap') 

我只是想打印PCAP文件中的所有协议号码,然后保存在一个文件中。我如何使用pyshark获取它?

回答

2

您是否看过pyshark的文档? README向您展示了如何从单个数据包中读取数据。鉴于您的例子中,我们可以得到的第一个包这样的:

>>> pkt = next(pkts) 
>>> pkt 
<UDP/DNS Packet> 

我们可以反思pkt,看看有什么字段:

>>> dir(pkt) 
['__class__', '__contains__', '__delattr__', '__dict__', '__dir__', 
[...] 
'get_multiple_layers', 'highest_layer', 'interface_captured', 'ip', 
[...] 

既然你要找的协议信息,ip似乎如果它可能有用(假设你问的是ip协议号码)。让我们来看看包含的内容:

>>> dir(pkt.ip) 
['DATA_LAYER', '__class__', '__delattr__', '__dict__', '__dir__', 
[...] 
'addr', 'checksum', 'checksum_status', 'dsfield', 'dsfield_dscp', 
'dsfield_ecn', 'dst', 'dst_host', 'field_names', 'flags', 'flags_df', 
'flags_mf', 'flags_rb', 'frag_offset', 'get_field', 
'get_field_by_showname', 'get_field_value', 'hdr_len', 'host', 'id', 
'layer_name', 'len', 'pretty_print', 'proto', 'raw_mode', 'src', 
'src_host', 'ttl', 'version'] 

我要猜测proto就是我们想要的。

>>> pkt.ip.proto 
17 

事实上,17是UDP的ip协议号码。所以,如果你只是想协议号的列表,你可以要求(这是输出从本地包跟踪):

>>> [pkt.ip.proto for pkt in pkts if hasattr(pkt, 'ip')] 
['17', '17', '17', '17', '6', '6', '6', '6', '6', '6', '6', '6', '6', '17', '17', '6', '6', '17', '17', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '1', '1', '1', '1', '1', '1', '1', '1'] 

(我们使用hasattr检查,因为非IP数据包没有ip属性)