libpcap 格式究竟是什么?

What exactly is the libpcap format?

我写了一个程序,可以创建一个命名管道,然后将数据包写入其中,然后使用 wireshark 从中读取(将命名管道作为接口 -> wireshark -k -i tmp/myfifo).以下是已发送到管道的字节列表。

D4 C3 B2 A104 0008 0000 00 00 0000 00 00 00FF FF 00 0001 00 00 00AA 77 9F 4790 A2 04 004d000000 4d00000000 00 00 00 00 0000 00 00 00 00 0008 004500003f00 0040 00 403A3c837f 00 00 017f 00 00 01A0 0100 0148 69 20 74 68 69 73 20 69 73 20 5061 72 76 61 74 68 69 20 66 72 6f 6d20 56 49 54 20 55 6e 69 76 65 72 7369 74 79

D4C3B2A1 0400 0800 00000000 00000000 FFFF0000 01000000-全局header
AA779F47 90A20400 4d000000 4d000000-数据包header
00 00 00 00 00 0000 00 00 00 00 00 08 00-以太网header
4500 003f 00 00 40 00 40 3A3c837f 00 00 017f 00 00 01 -ip header
9B 01 00 01 -icmp header
48 69 20 74 68 69 73 20 69 73 20 5061 72 76 61 74 68 69 20 66 72 6f 6d20 56 49 54 20 55 6e 69 76 65 72 7369 74 79 - 最后是消息

我尝试通过将其十六进制格式及其 ASCII 字符串代码发送到接口(管道)来打开 wireshark。 但在这两种情况下,一旦我打开 wireshark,它就会提示它是“Unrecognized libpcap format”。 根据以下链接中的 libpcap 格式,字节被构造

[1]Wireshark 的 Libpcap 文件格式:https://wiki.wireshark.org/Development/LibpcapFileFormat [2]生成pcap文件的示例python代码: http://www.codeproject.com/Tips/612847/Generate-a-quick-and-easy-custom-pcap-file-using-P

我应该发送什么才能让 wireshark 嗅探?

如果我们查看 the man page for the pcap file format,我们会发现您需要作为字节序列发送,所有 multi-byte 整数值都按照机器写出字节流的字节顺序:

  • 一个 4 字节幻数,微秒 time-stamp 分辨率的值为 0xA1B2C3D4,纳秒 time-stamp 分辨率的值为 A1B23CD4;
  • 一个2字节的主版本号,值为2;
  • 一个2字节的次版本号,值为4;
  • 一个值为0的4字节时区偏移量;
  • 一个值为 0 的 4 字节时间戳精度指示符;
  • 一个4字节的快照长度值——如果你没有明确截断任意固定长度的数据包,在这里放一个大的值,比如262144;
  • 一个 4 字节的 link-layer header 类型值,来自 the list of LINKTYPE_ values.

因此,如果您的机器是 little-endian - 任何具有 x86 兼容处理器的机器都将是(即 32 位 IA-32 或 64 位 x86-64、AMD 或 Intel 或。 ..),所以如果你在 PC 或 Intel-based Mac 上执行此操作,你的机器是 little-endian - 字节序列将用于 microsecond-resolution 时间的捕获邮票,数据包是以太网数据包,每个数据包都以以太网 header 开头,开头为:

D4 C3 B2 A1 (magic number)
00 02 (major version number)
00 04 (minor version number)
00 00 00 00 (time zone offset)
00 00 00 00 (time stamp accuracy)
00 04 00 00 (snapshot length = 262144)
00 00 00 01 (link-layer header type value, LINKTYPE_ETHERNET)

然后,在那之后,你会为每个数据包写出一个 header 包含的字节流,所有 multi-byte 整数值都按照机器写入的字节顺序输出字节流,一个 per-packet header with:

  • 一个4字节的时间戳"seconds"值,代表自1970年1月1日以来的秒数,00:00:00UTC(标准的UN*X时间戳);
  • 一个 4 字节时间戳 "microseconds" 值,表示从那一秒开始的微秒数;
  • 一个 4 字节的值,给出流中该数据包的数据包字节数;
  • 一个 4 字节的值,给出数据包在之前它在快照长度处被任意切断的字节数 - 如果它没有被切断,那将是与分组数据的字节数相同;

然后将包含数据包数据的原始字节,没有填充。