2014-03-14 38 views
0

我有一個應用程序捕獲並顯示網絡數據包。數據包以兩種形式在TableView和TreeView中表示。我正在使用scapy來捕獲網絡數據包。檢測應用層協議,python?

我希望顯示數據包的最高協議級別(任何數據包的最高應用層),我面臨的問題是某些數據包的最終有效負載被命名爲協議本身(例如,DNS有效負載被命名爲DNS),但某些有效負載僅被命名爲Raw(例如,HTTP有效負載被命名爲Raw)。

所以我想知道是他們的任何方式,我可以檢測到這些協議,在Python中。

這是DNS數據包的輸出。

enter image description here

這是一個HTTP分組的輸出。

enter image description here

這裏是產生樹的代碼。

def packet2Tree(self,pkt): 
    if len(pkt.fields.keys()) == 0 or pkt.name == "": 
     return 
    self.rootNode = Node(pkt.name , self.RootNode) 
    field = pkt.fields_desc 
    for xfield in field: 
     self.childNode = Node(xfield.name , self.rootNode , str(pkt.getfieldval(xfield.name))) 
    self.packet2Tree(pkt.payload) 
    return self.RootNode 

任何猜測如何,如果有一個內置的方式做到這一點解決這個問題

+1

我不知道是否有一個內置的方式做到這一點,但你可以看看端口號並猜測? Scapy似乎理解大多數TCP數據包的端口號(例如,當你調用'repr(layer)'),所以也許查看源代碼? –

+0

@PeterGibson:將您的評論作爲答案。 – TheCreator232

+0

您是否在scapy源代碼中找到了將端口號映射到名稱的地方? –

回答

1

我不知道,但你可以看看的端口號,並採取猜測? Scapy似乎理解大多數TCP數據包的端口號(例如,當你調用repr(layer))時,所以可能要查看源代碼?

編輯這個問題解釋說,socket模塊能爲你做到這一點:

python-scapy: how to translate port numbers to service names?

>>> import socket 
>>> socket.getservbyport(80) 
'http' 
>>> socket.getservbyport(21) 
'ftp' 
>>> socket.getservbyport(53, 'udp') 
'domain'