libpcap格式究竟是什么?

时间:2015-12-04 09:39:37

标签: interface hex wireshark named-pipes libpcap

我编写了一个程序,可以创建命名管道,然后将数据包写入其中,然后使用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 - 全球标题为AA779F47 90A20400 4d000000 4d000000 -packet标题为00 00 00 00 00 0000 00 00 00 00 00 08 00 -ethernet标题为4500 003f 00 00 40 00 40 3A3c837f 00 00 017f 00 00 01 -ip标题 9B 01 00 01 -icmp标题为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,就会提示它是" 无法识别的libpcap格式"。 根据下面链接中的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嗅探?

1 个答案:

答案 0 :(得分:2)

如果我们查看the man page for the pcap file format,我们发现你需要发送一个字节序列,所有多字节整数值都按照机器的字节顺序写出字节流:

  • 一个4字节幻数,值为0xA1B2C3D4,用于微秒时间戳分辨率,或者A1B23CD4,用于纳秒时间戳分辨率;
  • 一个2字节的主要版本号,值为2;
  • 一个2字节的次要版本号,值为4;
  • 一个4字节的时区偏移,值为0;
  • 一个4字节的时间戳精度指示器,值为0;
  • 一个4字节的快照长度值 - 如果您没有明确地切断任意固定长度的数据包,请在此处输入一个较大的值,例如262144;
  • 来自the list of LINKTYPE_ values的4字节链路层标头类型值。

因此,如果你的机器是小端的 - 任何带有x86兼容处理器的机器都是(即32位IA-32或64位x86-64,AMD或Intel或......),因此,如果您在PC或基于Intel的Mac上执行此操作,则您的计算机是小端的 - 字节序列将用于捕获具有微秒分辨率的时间戳,并且数据包是以太网数据包,每个数据包都以以太网头,以:

开头
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)

然后,在那之后,你会为每个数据包写出一个包含字节的字节流,其中所有多字节整数值都按照机器的字节顺序写出字节流,包头:

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

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