Pyshark 获取特定的协议名称而不仅仅是 TCP/UDP

Pyshark get specific protocol name not just TCP/UDP

我正在构建一个使用 PyShark 检查 PCAP 文件的工具,但是我很难从数据包中提取特定协议(例如 SSH、MQTT、ARP),而不仅仅是 TCP 或 UDP。

我想知道是否有人对此有经验?我试过 packet.ip.proto 但只有 returns TCP 和 UDP ID 号,而不是 SSH 或 ARP 等名称。

我正在尝试获取与 Wireshark 在以下示例中显示的信息相同的信息:

谢谢!

我想我已经弄明白了。看起来每种特定类型的协议都将自己的层添加到数据包中,因此通过打印出数据包中的所有层,您可以识别任何 non-standard 层。

with pyshark.FileCapture(TEST_FILE) as cap:
    for i, pkt in enumerate(cap):
        print(pkt.layers)

输出:

[<ETH Layer>, <IP Layer>, <TCP Layer>, <SYNERGY Layer>]
[<ETH Layer>, <IP Layer>, <TCP Layer>, <SYNERGY Layer>]
[<ETH Layer>, <IP Layer>, <TCP Layer>, <SYNERGY Layer>]
[<ETH Layer>, <IP Layer>, <TCP Layer>]
[<ETH Layer>, <IP Layer>, <TCP Layer>, <SSH Layer>]
[<ETH Layer>, <IP Layer>, <TCP Layer>, <SSH Layer>]
[<ETH Layer>, <IP Layer>, <TCP Layer>, <SSH Layer>]

您可以获得可用的图层名称列表,如下所示:

with pyshark.FileCapture(TEST_FILE) as cap:
    for i, pkt in enumerate(cap):
        try:
            print([pkt.layers[i].layer_name for i, lay in enumerate(pkt.layers)])
        except AttributeError as ex:
            print(ex)

输出:

['eth', 'ip', 'tcp', 'synergy']
['eth', 'ip', 'tcp', 'synergy']
['eth', 'ip', 'tcp', 'synergy']
['eth', 'ip', 'tcp']
['eth', 'ip', 'tcp', 'ssh']
['eth', 'ip', 'tcp', 'ssh']
['eth', 'ip', 'tcp', 'ssh']