【问题标题】:Pcap magic number on live capture实时捕获的 Pcap 幻数
【发布时间】:2015-11-22 09:36:00
【问题描述】:

是否可以在实时捕获时捕获正确的 pcap 标头,还是仅放入文件中?所有文档都与文件有关...

我已经设法从 .pcap 文件中轻松提取幻数,在 Linux 中使用 libpcap 和 C,在 Windows 中使用 Java acc。到 [1][2]。 但是,当通过实时捕获(通过 printf 或调试)的标头结构时,字段值似乎搞砸了。例如 snaplen 值在时区字段中结束,其他值没有意义。

我正在使用

int pcap_loop(pcap_t *p, int cnt, pcap_handler my_callback, u_char *user) 

void my_callback (u_char *args, const struct pcap_file_header *header,   const u_char *packet)

Pcap.h:

struct pcap_file_header { bpf_u_int32 magic; u_short version_major; u_short version_minor; bpf_int32 thiszone; /* gmt to local correction */ bpf_u_int32 sigfigs; /* accuracy of timestamps */ bpf_u_int32 snaplen; /* max length saved portion of each pkt */ bpf_u_int32 linktype; /* data link type (LINKTYPE_*) */ };

[1]http://www.tcpdump.org/pcap/pcap.html [2]http://www.tcpdump.org/manpages/pcap-savefile.5.txt

【问题讨论】:

    标签: c header-files pcap libpcap


    【解决方案1】:

    Savefiles 有一个文件头,然后是数据包记录,每个记录都有一个数据包头。文件头包含一个幻数和其他几个字段。

    实时捕获没有有文件头,而且永远不会有文件头,所以它们没有幻数或文件头中的任何其他字段。

    如果您想知道pcap_t 的快照长度,请致电pcap_snapshot()。如果您正在读取保存文件,它将返回 libpcap 从文件头读取的快照长度。如果您有实时捕获,它将返回在pcap_open_live()pcap_set_snaplen() 调用中指定的快照长度,或者,如果在没有pcap_set_snaplen() 调用的情况下使用pcap_create()pcap_activate(),则返回使用的默认快照长度.

    libpcap 不返回时区值;大多数捕获文件中都没有设置。

    void my_callback (u_char *args, const struct pcap_file_header *header,
                      const u_char *packet)
    

    pcap_loop() 手册页说:

       typedef void (*pcap_handler)(u_char *user, const struct pcap_pkthdr *h,
                                   const u_char *bytes);
    

    所以回调的第二个参数应该是const struct pcap_pkthdr *不是 const struct pcap_file_header *pcap_loop() 将返回一个数据包,不是一个文件头;正如我所说,实时捕获没有文件头。

    【讨论】:

    • 我使用 pcap_handler 的方式与您和手册页为我的“真实”实时捕获所建议的方式相同。我想提取幻数的原因是它会指示数据包头时间戳是否以 sec 和 usec 为单位或以 sec 和 nsec 为单位。所以这是一种捕获一个数据包,确定时间戳分辨率然后继续的方法。我知道我的系统以 sec 和 usec 为单位定义 timeval 但想要一种自动检查的方法。我当然可以将第一个数据包转储到文件中并提取幻数,但是eeeh。或者我可以以某种方式解析时间结构。 ..
    • 除非您调用pcap_set_tstamp_precision(),否则您的回调将获得的时间戳将始终以秒和微秒为单位,即使系统可以提供您可以在实时捕获上使用更高精度的时间戳,或者文件是否具有更高的精度。如果您想要在实时捕获中使用秒/纳秒时间戳,您必须尝试使用​​ pcap_set_tstamp_precision() 设置精度 - 如果成功,则返回 0,时间戳将以秒和纳秒为单位,否则返回 PCAP_ERROR_TSTAMP_PRECISION_NOTSUP,时间戳将以秒和微秒为单位。
    猜你喜欢
    • 2013-08-07
    • 1970-01-01
    • 1970-01-01
    • 2012-01-02
    • 1970-01-01
    • 2011-09-17
    • 2010-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多