我的程序从无线接口捕获数据包,我可以使用类似于十六进制-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回波响应共享相同的序列,它是下一个ICMP回声请求增加。但是,即使没有BPF字符串,我也可以通过执行以下有用的检查来最小化输出:
if(icmp_hd->icmp_type == ICMP_ECHO_REPLY)
如果这是真的,则很有可能数据包是ICMP Echo回复。一个ICMP_ECHO_REPLY等于零,很多数据包都包含空字节,所以不能保证。尽管如此,这将使我能够更容易地识别ICMP Echo答复。我发现,序列号通常超过10,000,甚至对于与我在Wireshark中观察到的数据包大小相似的数据包也是如此。
另外,我尝试过的BPF字符串是:
icmp-echoreply
发布于 2022-01-13 07:01:59
过滤器icmp[icmptype] == icmp-echoreply
应该完成这项工作,至少它与tcpdump
一起工作,所以它也应该与libpcap一起工作。使用以下命令sudo tcpdump -i any "icmp[icmptype] == icmp-echoreply"
测试它。不需要指定IP协议应该是ICMP,而是在对icmptype进行过滤时隐式检查。
https://stackoverflow.com/questions/70688317
复制