-1

我是 Pcapng 文件的新手。我已经阅读了 40 多页的白皮书,但我仍然摸不着头脑,大汗淋漓。我知道 Pcapng 文件是:

  1. 由部分标题块组成 - 这是每个 Pcapng 文件的开始。

问题1:这个有多大?

看起来它是 BlockType(4 字节)+ BlockTotalLength(4 字节)+ Byte Order Magic(4 字节)+ Mahor 和次要版本(总共 4 字节,每个 2 字节)+ 节长度(4 字节)+ 选项(变量)+块总长度(同样,4 个字节)。

如果我正在构建解析器,我怎么知道需要跳过多少字节才能到达我的第一个数据帧块?

问题2:数据存储在哪里?数据是指包含以太网、IP 和 TCP 数据的整个帧,如下图所示(图 1)。

在此处输入图像描述

该文件指出:

一个节包括由两个节头块分隔的数据。

在进行手动检查时(是的,我逐字节检查文件以查看两帧之间有多少字节:'(),我注意到每条消息之间有 35 个字节(wireshark 上显示的每条消息都有 35 个字节之间)。这些字节与 pcapng 块有关吗?

一旦我了解了如何到达第一个 tcp 帧,以及需要跳过多少字节才能到达下一个,我就可以构建我的解析器了。

我愿意将比特币/门罗币发送给任何可以帮助我了解如何最好地解析这些 pcapng 消息的人。谢谢!

4

3 回答 3

2

如果我正在构建解析器,我怎么知道需要跳过多少字节才能到达我的第一个数据帧块?

这不是你的做法。

如果您正在构建解析器,请注意解析器必须查看的不仅仅是第一个数据框块。

首先,它必须查看Section Header Block (SHB),通过查看Byte-Order Magic 字段来确定所有后续块中数据的字节顺序。

之后,您需要查看所有后续块,查找接口描述块增强数据包块(EPB)、简单数据包块(SPB) 以及可能的数据包块 (PB)(这些已过时,因此任何程序都不应编写它们,但程序应该准备好阅读它们)。每个 EPB 或 PB 都有一个引用 IDB 的接口 ID,该 ID 必须出现在相关 EPB 或 PB 之前;SPB 隐含地指第一个 IDB,同样,它必须出现在所讨论的 SPB 之前。

EPB、SPB 或 PB 中数据包数据的格式取决于它所引用的 IDB 指定的链路层类型,因此您需要阅读相关 IDB。

而且,如上所述,在 SHB 和第一个 EPB、SPB 或 PB之间没有固定数量的字节,因此没有简单的固定数量的字节要跳过以到达第一个数据帧块。一方面,字节数是可变的,您只能通过读取第一个 EPB、SPB 或 PB 之前的所有块来确定。另一方面,您不能跳过它们,您必须阅读它们以获得足够的信息来解释其中的数据包数据。

数据存储在哪里?数据是指包含以太网、IP 和 TCP 数据的整个帧,如下图所示(图 1)。

它存储在 EPB、SPB 或 PB 中。请参阅这三种块类型的描述;帧位于这些块的“数据包数据”字段中。

所以我在我的接口描述块和包含时间戳分辨率 9(10^-9,纳秒?)和 6(10^-6,微秒)的 64 位数字。

正如 Christopher Maynard 所指出的,9 不是时间戳分辨率,它是一种选项类型。Pcapng 块的开头和选项都有固定信息;选项以选项类型和选项值长度开始,然后是选项数据。IDB if_tsresol 选项具有

  • 2个字节的选项类型,值为9;
  • 2 个字节的选项值长度,值为 1;
  • 1 个字节的选项值,其值在该选项的描述中指定。

值 6 表示时间戳分辨率为 1/10^6 秒,即 1 微秒。

于 2020-03-15T08:42:08.583 回答
1

我认为@tee-zad-awk 在https://ask.wireshark.org/question/15159/how-can-i-display-as-much-pcapng-information-as-possible/找到了一个有帮助的答案,但为了其他任何人都在寻找这个问题的答案,我已经在这里链接并在下面提供了我的答案,以防万一有一天链接被破坏。


看来,在阅读了关于 Pcapng 的 40 页白皮书之后......

当前的PCAP Next Generation (pcapng) Capture File Format草稿文档有 52 页,所以您可能没有查看最新版本?确实存在其他版本,例如https://datatracker.ietf.org/doc/html/draft-tuexen-opswg-pcapng-00https://pcapng.github.io/pcapng/https:// www.tcpdump.org/pcap/pcap.html可能还有其他,但它们都已过时。

如果您正在寻找 pcapng 解析器来帮助您破译文件,那么只需 Wireshark 本身就可以了。如果您已将 pcapng 文件加载到 Wireshark 中,则可以使用“查看 -> 重新加载为文件格式/捕获”Ctrl+Shift+F. 这应该使您能够看到各种 pcapng 块并能够深入了解它们。例如:

帧 1:线上 184 字节(1472 位),捕获的 184 字节(1472 位)
MIME 文件
PCAPNG 文件格式
    块:节标题块 1
    块:接口描述块 ​​0
    块:增强数据包块 1

您还可以查看 Wireshark 源代码,例如epan/dissectors/file-pcapng.cwiretap/pcapng.c文件。

顺便说一句,如果您希望支持所有扩展,Wireshark [PcapNg wiki 页面] ( https://wiki.wireshark.org/Development/PcapNg ) 有一个链接到您的增强 PCAP 下一代转储文件格式页面可能还想看看。我不知道有多少其他扩展可能已经实现但未包含在主要的 pcapng 文件格式规范中,但希望不会很多,因为这可能会很快成为不同项目的问题,可能对不同的块使用相同的块类型。应该强烈反对这种做法。

于 2020-03-13T15:41:33.070 回答
0

为了找到它,阅读网络设备的协议规范和已发送的包是有帮助的。例如,为了理解原始数据,我们需要知道以太网设备的帧描述和 TCP/IP 包的包描述。研究了这一点,我们在 Wireshark 中记录了一些流量,并在 Wireshark 的上部窗口中选择了一个块。中间的窗口会以明文形式告诉你 Wireshark 收到了什么。单击中间窗口中的任何行时,Wireshark 将在下部窗口中标记原始数据的字节,其中包含单击行的信息。此外,您可以单击原始数据,然后标记明文。此外,状态行也会通知您。这对于理解数据非常有帮助。

我需要阅读以太网流量的 TCP / IPv4 包。该块以标识块类型 = 0x00000006和块的长度开始。该设备是以太网,所以我有链接类型LINKTYPE_ETHERNET。节长度可以从字节 16-23 中获取。块头的其他条目可以从这里获取。

在块头或 28 字节之后,以太网帧带有以下条目(请参阅此处了解说明):

  • mac地址目标,6字节
  • mac地址源,6字节
  • 类型:0x0800 表示 IPv4,0x0806 表示 ARP,0x86DD 表示 IPv6,0x8100 表示是否存在 IEEE 802.1Q 标签。

对于 IPv4 包或type = 0x0800,以下字节是 IPv4 标头(有关说明,请参见此处):

  • IP 版本和报头长度,1 字节
  • 区分服务字段,1字节
  • 总长度,2 个字节
  • 标识,2 个字节
  • 标志,1 个字节
  • 片段偏移量,1 字节
  • 生存时间,1 个字节
  • TCP 协议为 0x06,1 字节
  • 标头校验和,2 个字节
  • 源 IP 地址
  • 目标 IP 地址
  • 选项

长度非常重要:IPv4 + TCP 包的最后一个字节之后的字节位于条目IP 版本和标头长度之后的总长度字节。但是,此条目可能很棘手。尽管 IP 标头长度已经有 20 个字节,但我标头了一个长度为 0 的条目。在这种情况下,Wireshark 很有帮助。据报道

[总长度:1547字节(报告为0,推测是因为“TCP分段卸载”(TSO))]

可以从这里获得对这种现象的详细描述。在这种情况下,我可以通过上面的部分长度减去以太网帧的长度(14 字节)减去 IP 报头的长度减去 TCP 报头的长度来计算有效负载长度。但是,尽管我没有这些问题,但可能会出现填充问题。当包长度扩展为 4 字节的倍数之类的时候,就会出现填充问题。

如果 IPv4 头的协议是 0x06,则 TCP 包如下。可以从此处获取 TCP 包的详细信息。当然,Wireshark 还可以帮助您解释 TCP 包:只需单击中间窗口中属于 TCP 包的行或单击原始数据。

如此处所述,pcapng 文件的解释有许多 if 和 whens。

于 2021-07-28T07:46:14.693 回答