我的程序从无线接口捕获数据包,我可以使用类似于 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 ...