为什么pcap_datalink()总是返回1(以太网),即使在无线设备上也是如此?

时间:2015-09-02 12:55:47

标签: c network-programming pcap libpcap

我遇到一个问题:pcap_datalink()始终返回1。根据我的理解,这是LINKTYPE_ETHERNET。但是,我使用的设备是无线网卡,在我的情况下是en0

这使我无法将卡置于监控模式,并阻止我的WLAN过滤器工作。我试图在OSX和Linux上运行它,结果相同。我也是以root身份运行。

这是我的代码导致问题的部分。例如,假设dev设置为en0(Mac上的无线设备)。

#include <stdio.h>
#include <pcap.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    pcap_t *pcap_h;
    char *dev, errbuf[PCAP_ERRBUF_SIZE];
    struct bpf_program fp;
    struct pcap_pkthdr header;
    const u_char *packet;

    if(argc < 2)
    {
        printf("Usage: %s device\n", argv[0]);
        exit(EXIT_FAILURE);
    }

    dev = argv[1];

    if((pcap_h = pcap_create(dev, errbuf)) == NULL)
    {
        printf("pcap_create() failed: %s\n", errbuf);
        exit(EXIT_FAILURE);
    }

    if(pcap_can_set_rfmon(pcap_h) == 0)
    {
        printf("Monitor mode can not be set.\n");
    }

    if(pcap_set_rfmon(pcap_h, 1) != 0)
    {
        printf("Failed to set monitor mode.\n");
        exit(EXIT_FAILURE);
    }

    if(pcap_activate(pcap_h) != 0)
    {
        printf("pcap_activate() failed\n");
        exit(EXIT_FAILURE);
    }

    /*
     * Compile a filter to sniff 802.11 probe requests
     * Filter: type mgt subtype probe-req
     */ 
    if(pcap_compile(pcap_h, &fp, "type mgt subtype probe-req", 0, PCAP_NETMASK_UNKNOWN) == -1)
    {
        printf("pcap_compile() failed: %s\n", pcap_geterr(pcap_h));
        exit(EXIT_FAILURE);
    }

    /*
     * Set the compiled filter
     */ 
    if(pcap_setfilter(pcap_h, &fp) == -1)
    {
        printf("pcap_setfilter() failed: %s\n", pcap_geterr(pcap_h));
        exit(EXIT_FAILURE);
    }

    pcap_freecode(&fp);

    packet = pcap_next(pcap_h, &header);

    printf("Header: %d\n", header.len); 
    pcap_close(pcap_h);
    return 0;
}

任何想法为什么pcap_datalink()总是返回1

修改

更新了代码,并在致电pcap_set_rfmon()之前添加了pcap_activate()。我收到一个错误:

pcap_compile() failed: 802.11 link-layer types supported only on 802.11

1 个答案:

答案 0 :(得分:1)

shure 这是阻止你将卡置于监控模式,阻止WLAN过滤器工作的原因,还是你打电话给pcap_datalink()作为检查试图找出问题?

请注意,来自PCAP-LINKTYPE(7):

  

对于实时捕获或“保存文件”,libpcap提供,作为   返回值为pcap_datalink(3PCAP)例程,该值为   表示链接层头的类型   它提供的数据包。这不一定是链路层的类型   被捕获的数据包在网络上的标头   他们被捕获了;例如,来自IEEE 802.11的分组   网络可能由libpcap提供,带有以太网头   网络适​​配器或网络适配器驱动程序从中生成   802.11标头。

所以我不会将此LINKTYPE_ETHERNET / DLT_EN10MB返回值作为此处问题的确切指示。

修改 此外,pcap_set_rfmon()应该在激活句柄之前调用,这在您的代码中不可见。

pcap对于应该完成的顺序非常敏感。请查看pcap_can_set_rfmonpcap_set_rfmon的手册页。

订单应该是:

  • pcap_create
  • pcap_can_set_rfmon
  • pcap_set_rfmon(如果到目前为止那么好)
  • 然后才这样,pcap_activate