如上图所示,在Wireshark中,我们可以点击任意一个十六进制字节,我们就会得到它在Packet Layer数据中代表的是哪一部分。
我正在尝试用 Python 实现相同的效果。我有一个 Pcap 文件及其十六进制转储。我还有一个包含数据包层信息的数组,如下所示:
Array: Packet Layer Information:
[ { "layer_name" : "eth", "layer_len" : 14, "layer_start" : 0 }, { . . . } ... { . . . } ]
包含我希望与数据包层数据链接的十六进制字节的数组如下所示:
Array: Highlighted Bytes:
[ { "layer" : "ip", "position_in_layer" : 10, "byte" : "e0" }, { } ... { } ]
我试图链接这些十六进制字节并打印出它们在层中代表什么数据,但是,从我所见,层的结构并不总是固定的,并且有很多层和网络协议类型。
我尝试过使用 Pyshark 和 Scapy 等库,但它们没有我正在寻找的功能。在 Scapy 中,我可以将十六进制转储转换为网络数据包,但是,当我打印图层时,它们始终只是 Eth 后跟 Raw。 Eth 之后的层是其有效负载的一部分。
我想找到一种方法,无论是在Python中,还是通过集成其他语言,都能够打印数据包层中的任何字节所代表的内容。
我从其他来源收到了答案,所以我会提交它,以防其他人需要。
有一个 tshark 命令可以将 pcap 文件转换为 pdml 文件。命令如下:
tshark -r input.pcap -T pdml > output.pdml
在此 pdml 文件中,包含有关 pcap 文件的所有类型的信息,包括有关 hexdump 的信息,以及每个数据包层数据在 hexdump 中代表的内容。
因此,解决方案是执行以下操作: