如何在C#中解析Pcapng文件?

问题描述 投票:-1回答:2

我是Pcapng文件的新手。我已经阅读了40多页的白皮书,但仍在挠头,大汗淋漓。我了解Pcapng文件是:

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

问题1:这有多大?

[似乎是BlockType(4字节)+ BlockTotalLength(4字节)+ Byte Order Magic(4字节)+ Mahor和Minor Version(总共4字节,每个2字节)+ Section Length(4字节)+ Options(变量) )+块总长度(再次为4个字节)。

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

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

enter image description here

文档指出:

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

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

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

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

c# networking wireshark pcap pcap-ng
2个回答
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://tools.ietf.org/html/draft-tuexen-opswg-pcapng-00https://pcapng.github.io/pcapng/https://www.tcpdump.org/pcap/pcap.html的版本,可能还有其他版本,但它们都已过时。

[如果您正在寻找一个pcapng解析器来帮助您解密文件,那么看上去仅是Wireshark本身。如果已将pcapng文件加载到Wireshark中,则可以使用“ View->以文件格式/捕获方式重新加载”Ctrl+Shift+F)使Wireshark加载并显示原始文件内容本身而不是加载并显示文件中的数据包。这应该使您能够看到各种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)包含指向Augmented PCAP Next Generation Dump File Format页面的链接,您可能也想看看。我不知道可能已经实现了多少其他扩展名,但未包含在主要的pcapng文件格式规范中,但希望数量不多,因为对于不同的项目而言,这可能很快成为问题,可能对不同的块使用相同的块类型。强烈建议不要这样做。


0
投票

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

这不是您的操作方式。

如果要构建解析器,请注意,解析器不仅要查看第一个数据帧块,还需要查看更多。

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

[此后,您需要查看所有后续块,查找Interface Description BlocksEnhanced Packet Blocks(EPB),Simple Packet Blocks(SPB),可能还有Packet Blocks(PB)(这些都是过时的,因此没有程序应该write

它们,但是程序应该准备好read它们)。每个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中。请参见对这三种块类型的描述。帧位于这些块的“数据包数据”字段中。

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

正如克里斯托弗·梅纳德(Christopher Maynard)所指出的那样,9不是时间戳分辨率,它是一种选项类型。 Pcapng块在开头和options处都有固定的信息;选项以选项类型和选项值长度开头,后跟选项数据。 IDB if_tsresol选项具有

    选项类型的2个字节,值为9;
  • 选项值长度的2个字节,值为1;
  • 1个选项值字节,其值在该选项的说明中指定。
  • 值为6表示时间戳分辨率为1/10 ^ 6秒,即1微秒。
© www.soinside.com 2019 - 2024. All rights reserved.