首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用libpcap和libnet解码ICMPv4包

用libpcap和libnet解码ICMPv4包
EN

Stack Overflow用户
提问于 2022-01-12 20:56:52
回答 1查看 64关注 0票数 1

我的程序从无线接口捕获数据包,我可以使用类似于十六进制-C的函数查看所有人类可读的字节。首先,我无法破解BPF字符串的正确语法,因此所有发送到我的机器的数据包都在不过滤的情况下涌入--只是我没有使用杂乱模式。让我们假设我有BPF字符串,因为它只会使事情进一步复杂化。

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

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

代码语言:javascript
运行
复制
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字符串,我也可以通过执行以下有用的检查来最小化输出:

代码语言:javascript
运行
复制
if(icmp_hd->icmp_type == ICMP_ECHO_REPLY)

如果这是真的,则很有可能数据包是ICMP Echo回复。一个ICMP_ECHO_REPLY等于零,很多数据包都包含空字节,所以不能保证。尽管如此,这将使我能够更容易地识别ICMP Echo答复。我发现,序列号通常超过10,000,甚至对于与我在Wireshark中观察到的数据包大小相似的数据包也是如此。

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

icmp-echoreply

  • ip

  • ip proto icmp和ICMP = proto ICMP.
  • ip proto \icmp .
  • ip proto \ICMP \ICMP.
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-13 15:01:59

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70688317

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档