2014-03-14 119 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'