检测应用层协议,python?

2 投票
1 回答
2725 浏览
提问于 2025-04-17 22:15

我有一个应用程序,可以捕获并显示网络数据包。这些数据包在一个表格视图和一个树状视图中展示。我使用的是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 模块可以为你完成这个任务:

python-scapy: 如何将端口号转换为服务名称?

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

撰写回答