首页 > 解决方案 > 如何转储 Wireshark 的 IP 数据包缓冲区/如何在 C++ 中进行 hexdump?

问题描述

我有一个简单的uint8_t*IP 数据包缓冲区,例如

45 0 0 34 0 0 40 0 40 6 6B 53 C0 A8 FF 6 AC D9 1C EE 0 4D 0 50 0 0 0 0 0 0 0 0 80 2 FD E8 A5 20 0 0 2 4 5 B4 3 3 0 4 2 0 0 0 

我想使用 Wireshark 来查看它。我看到我可以在 Wireshark 上导入十六进制转储,但是如何将此缓冲区保存为十六进制转储以供 Wireshark 打开?

是否可以将大量 IP 数据包连接在一起?

标签: c++networkingipwireshark

解决方案


如果您可以修改数据以匹配预期的格式text2pcap,则可以使用该工具将数据转换为 pcap(或 pcapng)文件。例如:

这是您以可接受的格式提供的数据text2pcap

0000 45 00 00 34 00 00 40 00 40 06 6B 53 C0 A8 FF 06
0010 AC D9 1C EE 00 4D 00 50 00 00 00 00 00 00 00 00
0020 80 02 FD E8 A5 20 00 00 02 04 05 B4 03 03 00 04
0030 02 00 00 00
0034  

由于这似乎以 IPv4 标头开头,因此您可以生成链接层标头类型设置为的 pcap 文件LINKTYPE_RAW,其值从https://www.tcpdump.org/linktypes.html获得,如text2pcap手册页。或者,您可以选择在数据中添加一个虚拟以太网标头,在这种情况下,您可以省略链路层标头类型选项,因为LINKTYPE_ETHERNET它是默认值;但是,您确实需要添加添加虚拟以太网标头的选项。在这里,我演示了这两种方法:

方法 1:原始 IP

text2pcap -l 101 file.hex file.pcap

方法 2:添加虚拟以太网标头

text2pcap -e 0x0800 file.hex file.pcap

text2pcap工具能够处理文件中任意数量的数据包,但请注意手册页中所需的格式,即“注意最后一个字节必须跟上例中预期的下一个偏移值或空格或一个行尾字符。”

顺便说一句,Wireshark 本身也能够使用File -> Import from Hex Dump...功能将十六进制数据转换为 pcap 文件,尽管 Wireshark 总是将十六进制数据作为 pcapng 文件导入。您可以选择将文件另存为 pcap,但总会生成中间 pcapng 文件。Wireshark 应该只提供一个复选框以允许用户选择要使用的格式,就像这样text2pcap做一样。我已经提交了 Wireshark Bug 16724来解决这个问题。


推荐阅读