PCAP捕获文件头怎么写?

发布于 2024-10-20 16:19:27 字数 1513 浏览 7 评论 0原文

在不使用 libpcap 的情况下,我尝试编写一个符合 pcap 文件格式的日志文件(格式)。该文件需要可由 WireShark 读取。到目前为止,我已经用 C++ 编写了这个:

struct pcapFileHeader {
    uint32_t magic_number;   /* magic number */
    uint16_t version_major;  /* major version number */
    uint16_t version_minor;  /* minor version number */
    int16_t  thiszone;       /* GMT to local correction */
    uint32_t sigfigs;        /* accuracy of timestamps */
    uint32_t snaplen;        /* max length of captured packets, in octets */
    uint32_t network;        /* data link type */
};

ofstream fileout;
fileout.open("file.pcap", ios::trunc);

pcapFileHeader fileHeader;
fileHeader.magic_number = 0xa1b2c3d4;
fileHeader.version_major = 2;
fileHeader.version_minor = 4;
fileHeader.thiszone = 0;
fileHeader.sigfigs = 0;
fileHeader.snaplen = 65535; //(2^16)
fileHeader.network = 1;     //Ethernet

fileout <<  fileHeader.magic_number <<
            fileHeader.version_major <<
            fileHeader.version_minor <<
            fileHeader.thiszone <<
            fileHeader.sigfigs <<
            fileHeader.snaplen <<
            fileHeader.network;

fileout.close();

所以这应该创建一个空白捕获文件,但是当我在 Wireshark 中打开它时,我会看到:

文件“hello.pcap”似乎在数据包或其他数据的中间被缩短。

我尝试以二进制模式打开输出文件,但这没有帮助。我会将其发布在 WireShark 论坛中,但我认为这是用户错误,而不是 WireShark 的问题。

非常感谢您的帮助。

Without using libpcap I am trying to write a log file that adheres to the pcap file format (format). This file needs to be readable by WireShark. So far I've written this in C++:

struct pcapFileHeader {
    uint32_t magic_number;   /* magic number */
    uint16_t version_major;  /* major version number */
    uint16_t version_minor;  /* minor version number */
    int16_t  thiszone;       /* GMT to local correction */
    uint32_t sigfigs;        /* accuracy of timestamps */
    uint32_t snaplen;        /* max length of captured packets, in octets */
    uint32_t network;        /* data link type */
};

ofstream fileout;
fileout.open("file.pcap", ios::trunc);

pcapFileHeader fileHeader;
fileHeader.magic_number = 0xa1b2c3d4;
fileHeader.version_major = 2;
fileHeader.version_minor = 4;
fileHeader.thiszone = 0;
fileHeader.sigfigs = 0;
fileHeader.snaplen = 65535; //(2^16)
fileHeader.network = 1;     //Ethernet

fileout <<  fileHeader.magic_number <<
            fileHeader.version_major <<
            fileHeader.version_minor <<
            fileHeader.thiszone <<
            fileHeader.sigfigs <<
            fileHeader.snaplen <<
            fileHeader.network;

fileout.close();

So this should make a blank capture file, but when I open it in Wireshark I am greeted with:

The file "hello.pcap" appears to have been cut short in the middle of a packet or other data.

I've tried opening the output file in binary mode but that didn't help. I would post this in the WireShark forum, but I think this is user error, not something wrong with WireShark.

Help would be much appreciated.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

梦里兽 2024-10-27 16:19:27

<< 写入格式化为文本的数字(例如,五个字符的字符串“65535”,而不是表示该数字的四个字节)。

要输出二进制数据,请使用 ios::binary 打开文件并使用 write。该语句将写入整个标头:

fileout.write(reinterpret_cast<const char*>(&fileHeader),
              sizeof fileHeader);

读取器检测到字节顺序,因此只要结构成员之间没有填充,它就是可移植的。

请注意,thiszone 应为 int32_t

<< writes the numbers formatted as text (e.g., the five-character string "65535" instead of four bytes representing that number).

To output binary data open the file with ios::binary and use write. This statement will write the entire header:

fileout.write(reinterpret_cast<const char*>(&fileHeader),
              sizeof fileHeader);

The endianness is detected by the reader, so this is portable as long as there's no padding between the struct members.

Note that thiszone should be int32_t.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文