【问题标题】:BPF program is not valid - pcap sniffingBPF 程序无效 - pcap 嗅探
【发布时间】:2021-03-03 02:48:07
【问题描述】:

大家好,我正在尝试使用 pcap 库来嗅探数据包。我只有一个无法解决的问题:ERROR: BPF program is not valid

我正在尝试开始嗅探,但是这个错误阻止了我我在网上搜索并没有找到任何东西。

我的代码基于这个程序:https://github.com/levans248/packetSniffingAndSpoofing/blob/master/sniff.c

由于 SEED 实验室,我知道人们在做作业时不会提供帮助,但我只需要弄清楚为什么会发生这种情况,我不知道。

#include <pcap.h>
#include <stdio.h>
#include <stdlib.h>
#include <arpa/inet.h>

void got_packet(u_char *args, const struct pcap_pkthdr *header, const u_char *packet)
{
    printf("Got a packet \n");
}

int main()
{
    pcap_t *handle;
    char errbuf[PCAP_ERRBUF_SIZE];
    struct bpf_program fp;
    char filter_exp[] = "ip proto icmp";
    bpf_u_int32 net;

    // Open live pcap session
    handle = pcap_open_live("enp0s3", BUFSIZ, 1, 1000, errbuf);
    // Compile Filter into the Berkeley Packet Filter (BPF)
    pcap_compile(handle, &fp, filter_exp, 0, net);

    if (pcap_setfilter(handle, &fp) == -1)
    {
        pcap_perror(handle, "ERROR");
        exit(EXIT_FAILURE);
    }

    // Sniffing..
    pcap_loop(handle, -1, got_packet, NULL);
    pcap_close(handle);

    return 0;
}

【问题讨论】:

  • 该错误仅表示您的过滤器ip proto icmp 的语法不正确。检查文档以修复它。
  • 这是正确的语法,我检查了 BPF 语法,这是针对 IPV4 ip proto p 而 p 可以是 tcp,udp,icmp
  • 语法正确,pchaigno 正确。如果您费心阅读man pcap-filterip proto 的文档,您会发现the identifiers tcp, udp, and icmp are also keywords and must be escaped via backslash (\). 所以您的过滤器应该类似于ip proto \icmp 或只是icmp
  • 请注意,尝试过滤器表达式的一种简单方法是使用 tcpdump 运行它。 tcpdump -i eth0 ip proto '\icmp' 有效,没有反斜杠(和引号,以防止 shell 解释反斜杠)的版本不会。
  • 好吧,先生,我尝试了各种方法,但仍然给出错误,我删除了退出行,它是没有过滤器的嗅探,真的明白该怎么做,这是这个过滤器提供的代码

标签: pcap packet-sniffers sniffing bpf


【解决方案1】:

filter_exp 中存在语法错误, 我正在研究 C-Shell,因此需要更改为 ip proto \icmp

非常感谢大家!

【讨论】:

  • 很高兴你修好了!如果可以的话,请尝试复制文本错误消息或文档摘录,而不是为以后的帖子插入图片。这使它对未来的用户更好(没有链接断开的风险),更易于访问(不是每个人都可以在浏览器中显示/可以看到图片),并且更容易复制粘贴以供进一步研究。
猜你喜欢
  • 1970-01-01
  • 2011-02-24
  • 2013-01-01
  • 1970-01-01
  • 2022-01-23
  • 2017-05-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多