1

我的程序从无线接口捕获数据包,我可以使用类似于 hexdump -C 的函数查看所有人类可读的字节。一方面,我无法破解 BPF 字符串的正确语法,因此所有发往我机器的数据包都在没有过滤的情况下涌入 - 除了我没有使用混杂模式。假设我确实有 BPF 字符串,因为它只会使事情变得更加复杂。

因为我只想要 ICMP 回显回复,所以我并行运行 Wireshark 和我的程序。我通过在环回接口上检查 Wireshark 中的数据包来验证 ICMP 回显请求和回复是否有效。但是,该程序转储的标头字段不能是 ICMP 回显,并且与在 Wireshark 中看到的有效数据包不匹配。

编辑:我应该注意到 pcap_hdl 正在侦听所有设备;包括用于测试目的的环回接口。

pcap_t *pcap_hdl;
struct pcap_pkthdr cap_info;
const u_char *reply_pkt;
struct libnet_icmpv4_hdr *icmp_hd;
...
...
...

reply_pkt = pcap_next(pcap_hdl, &cap_info);
if(reply_pkt == NULL)
        printf("skipped - no response.\n");
else {
        icmp_hd = (struct libnet_icmpv4_hdr *) (reply_pkt + LIBNET_IPV4_H);
        dump((const unsigned char *) reply_pkt, cap_info.caplen);
        printf("%d bytes; icmp_seq=%d\n", cap_info.caplen, icmp_hd->icmp_seq);
}

当我发送 ICMP Echo 请求时,我定义了序列号。它从 1 开始,并且 ICMP Echo Response 共享相同的序列,它是下一个 ICMP Echo Request 递增。但是,即使没有 BPF 字符串,我也可以通过执行有用的检查来最小化输出,例如:

if(icmp_hd->icmp_type == ICMP_ECHO_REPLY)

如果这是真的,那么数据包很可能是 ICMP Echo Reply。ICMP_ECHO_REPLY 等于零,并且很多数据包包含空字节,因此不能保证。尽管如此,这应该让我更容易识别 ICMP Echo Replies。我发现序列号通常超过 10,000,即使对于与我在 Wireshark 中观察到的大小相似的数据包也是如此。

此外,我尝试过的 BPF 字符串是:

  • ip proto icmp 和 icmp[icmptype] = icmp-echoreply
  • ip 原型 ICMP ...
  • ip 原型 \icmp ...
  • ip 原型 \ICMP ...
4

1 回答 1

0

过滤器icmp[icmptype] == icmp-echoreply应该可以完成这项工作,至少它可以tcpdump与 libpcap 一起使用。使用以下命令对其进行了测试sudo tcpdump -i any "icmp[icmptype] == icmp-echoreply"。无需指定 IP 协议应为 ICMP,它在过滤 icmptype 时会隐式检查。

于 2022-01-13T15:01:59.757 回答