2017-03-08 88 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屬性)