【问题标题】:Creating a pcap file创建一个 pcap 文件
【发布时间】:2012-04-11 20:44:22
【问题描述】:

我需要将 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() 插入标头?

【问题讨论】:

    标签: c linux udp pcap libpcap


    【解决方案1】:

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


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

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

    您可以在this debian bug 找到它。 (错误链接已修复。)

    其中一些用于伪造以太网和 IP 标头,并且可能不适用,因为您使用的是 pcap_dump_openpcap_dump,因为上面链接的补丁在不使用任何库的情况下写出 pcap 文件,但无论如何我都会把它留在这里以防万一。

    【讨论】:

    • 谢谢,但看起来您已经使用常规文件 write() 调用完成了所有操作。我正在使用 pcap_dump() 并且不知道从哪里获取文件描述符。
    • @RobertKubrick 上面已更新。我留下了原始答案,因为即使使用pcap_dump,您仍然需要伪造 IP 标头,上面链接的补丁可能会有所帮助。
    • 不错,不用写全局文件头,我刚验证过。
    • 使用 pcap_fileno() 从 pcap_t* 获取文件描述符。但是,您可以直接调用 pcap_dump() 将数据包写入 pcap_t
    【解决方案2】:

    如果您只对 UDP 和 TCP 感兴趣,您应该使用 DLT_EN10MB 而不是 DLT_RAW(参见 pcap_open_dead to simulate full UDP packets capture)。

    在 WireShak 中编辑时会好很多。

    【讨论】:

      猜你喜欢
      • 2019-07-23
      • 1970-01-01
      • 2020-07-15
      • 2018-07-29
      • 2023-02-07
      • 1970-01-01
      • 2016-11-15
      • 1970-01-01
      相关资源
      最近更新 更多