检测应用层协议,python?
我有一个应用程序,可以捕获并显示网络数据包。这些数据包在一个表格视图和一个树状视图中展示。我使用的是scapy这个工具来捕获网络数据包。
我想显示数据包的最高协议层(最高层是应用层),但我遇到的问题是,有些数据包的最终负载直接用协议名称命名(比如,DNS负载叫做DNS),而有些负载则只是叫做原始(Raw)(比如,HTTP负载叫做Raw)。
所以我在想,有没有办法在Python中识别这些协议。
这是一个DNS数据包的输出。
这是一个HTTP数据包的输出。
这里是生成树状视图的代码。
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 个回答
4
我不太确定有没有现成的方法可以做到这一点,但你可以看看端口号,然后猜一猜?Scapy 似乎能理解大多数 TCP 数据包的端口号(比如当你调用 repr(layer) 时),所以也许可以看看源代码?
补充说明 这个问题解释了 socket
模块可以为你完成这个任务:
>>> import socket
>>> socket.getservbyport(80)
'http'
>>> socket.getservbyport(21)
'ftp'
>>> socket.getservbyport(53, 'udp')
'domain'