我有一个捕获并显示网络数据包的应用程序。数据包以 TableView 和 TreeView 两种形式表示。我正在使用 scapy 捕获网络数据包。
我希望显示数据包的最高协议(protocol)级别(任何数据包的最高协议(protocol)级别),我面临的问题是某些数据包的最终有效负载被命名为协议(protocol)本身(例如,DNS 有效负载是命名为 DNS),但有些负载只是命名为 Raw(例如 HTTP 负载命名为 Raw)。
所以我想知道他们有什么方法可以在 python 中检测这些协议(protocol)。
这是 DNS 数据包的输出。
这是 HTTP 数据包的输出。
这是生成 Tree 的代码。
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
猜猜如何解决这个问题
最佳答案
我不确定是否有内置方法可以做到这一点,但您可以查看端口号并猜测一下? 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'
关于python - 检测应用层协议(protocol),python?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22395557/