6

我需要将 UDP 数据包保存到文件中,并希望使用 pcap 格式来重用各种可用的工具(wireshark、tcpdump、...)。此线程中有一些信息,但我找不到如何编写全局文件头“struct pcap_file_header”。

pcap_t* pd = pcap_open_dead(DLT_RAW, 65535);
pcap_dumper_t* pdumper = pcap_dump_open(pd, filename);

struct pcap_file_header file_hdr;
file_hdr.magic_number = 0xa1b2c3d4;
file_hdr.version_major = 2;
file_hdr.version_minor = 4;
file_hdr.thiszone = 0;
file_hdr.sigfigs = 0;
file_hdr.snaplen = 65535;
file_hdr.linktype = 1;

// How do I write file_hdr to m_pdumper?

while( (len = recvmsg(sd, &msg_hdr, 0)) > 0 )
  pcap_dump((u_char*)m_pdumper, &m_pcap_pkthdr, (const u_char*)&data);

我应该如何编写全局文件头?如果没有可用的特定 pcap 函数,我如何检索文件描述符以使用 write() 插入标头?

4

2 回答 2

6

你不应该写那个标题,pcap_open_dead应该为你做。pcap_dump如果您想直接写文件而不是使用和朋友,您只需要自己填写并编写该标题。这里有一个简单程序的例子,用这些函数写出一个 pcap 文件。


原始答案,关于直接写入文件:

我不记得它是如何工作的,但是我redir前一段时间写了一个补丁,可以写出 pcap 文件,您可以将其用作示例。

你可以在这个 debian bug中找到它。(错误链接已修复。)

其中一些是用于伪造以太网和 IP 标头,并且可能不适用于您正在使用的pcap_dump_open以及pcap_dump上面链接的补丁在不使用任何库的情况下写出pcap文件的位置,但无论如何我都会将其留在这里以防万一它有帮助.

于 2012-04-11T20:57:01.730 回答
0

如果你只对 UDP 和 TCP 感兴趣,你应该使用DLT_EN10MB而不是DLT_RAW(cf pcap_open_dead 来模拟完整的 UDP 数据包捕获)。

在 WireShak 中编辑时要好得多。

于 2015-08-12T12:40:38.523 回答