创建一个pcap文件。

7

我需要将UDP数据包保存到文件中,并希望使用pcap格式以重用各种可用工具(如wireshark、tcpdump等)。 在这个帖子中有一些信息,但我找不到如何编写全局文件头"结构体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个回答

6
你不需要编写该标头,pcap_open_dead 应该为您完成。如果您想直接编写文件而不使用 pcap_dump 等工具,则只需自己填写和编写该标头即可。这里有一个例子,演示如何使用那些函数编写 pcap 文件。这里
原始答案,关于直接编写文件:
我记不清楚这是如何工作的,但我之前写过一个修补程序,用于将 pcap 文件写出,你可能可以将其用作参考。
您可以在此 Debian 错误报告中找到它。(错误链接已修复。)
其中一些内容用于伪造以太网和 IP 标头,并且可能不适用,因为您正在使用 pcap_dump_openpcap_dump,而上面链接的修补程序则是在不使用任何库的情况下编写 pcap 文件,但是如果有帮助,我还是把它放在这里。

谢谢,但是看起来你已经使用常规的文件write()调用完成了所有操作。我正在使用pcap_dump(),但是无法确定如何获取文件描述符。 - Robert Kubrick
@RobertKubrick 已更新如上。我保留了原始答案,因为即使使用 pcap_dump,您仍需要伪造一个 IP 标头,而上面链接的补丁可能会有所帮助。 - je4d
没错,不需要写全局文件头,我已经验证过了。 - Robert Kubrick
使用 pcap_fileno() 从 pcap_t* 获取文件描述符,但是您可以直接调用 pcap_dump() 将数据包写入 pcap_t。 - nos

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接