创建一个pcap文件

时间:2012-04-11 20:44:22

标签: c linux udp pcap libpcap

我需要将UDP数据包保存到文件中,并希望使用pcap格式重用各种可用工具(wireshark,tcpdump,...)。 this thread中有一些信息,但我找不到如何编写全局文件头'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()检索文件描述符以插入标题?

2 个答案:

答案 0 :(得分:5)

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


原始回答,关于直接撰写文件:

我不记得究竟是如何工作的,但我前一段时间写了一个补丁redir写出了pcap文件,你可以用它作为例子。

您可以将其附加到this debian bug。 (错误链接已修复。)

其中一些用于伪造以太网和IP标头,可能不适用于您使用pcap_dump_openpcap_dump,因为上面链接的补丁会写出pcap文件没有使用任何库,但我会留在这里,以防它有帮助。

答案 1 :(得分:0)

如果您只对UDP和TCP感兴趣,则应使用DLT_EN10MB代替DLT_RAW(cf pcap_open_dead to simulate full UDP packets capture)。

在WireShak中进行编辑时要好得多。