我需要将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()检索文件描述符以插入标题?
答案 0 :(得分:5)
你不应该写那个标题,pcap_open_dead
应该为你做。如果您想直接编写文件而不是使用pcap_dump
和朋友,您只需要自己填写并编写该标题。有一个简单程序的here示例写出带有这些函数的pcap文件。
原始回答,关于直接撰写文件:
我不记得究竟是如何工作的,但我前一段时间写了一个补丁redir
写出了pcap文件,你可以用它作为例子。
您可以将其附加到this debian bug。 (错误链接已修复。)
其中一些用于伪造以太网和IP标头,可能不适用于您使用pcap_dump_open
和pcap_dump
,因为上面链接的补丁会写出pcap
文件没有使用任何库,但我会留在这里,以防它有帮助。
答案 1 :(得分:0)
如果您只对UDP和TCP感兴趣,则应使用DLT_EN10MB
代替DLT_RAW
(cf pcap_open_dead to simulate full UDP packets capture)。
在WireShak中进行编辑时要好得多。