2015-09-02 7 views
3

У меня проблема, когда pcap_datalink() всегда возвращается 1. Насколько я понимаю, это LINKTYPE_ETHERNET. Но устройство, которое я использую, - это беспроводная карта, а в моем случае - en0.Почему pcap_datalink() всегда возвращает 1 (Ethernet), даже на беспроводном устройстве?

Это останавливает меня от установки карты в режим монитора и прекращения работы моих фильтров 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 
+0

Какую ошибку вы получаете и где? –

+0

Я не получаю сообщение об ошибке, любые ошибки, которые я получаю, такие как режим монитора и фильтры, связаны с тем, что у моего беспроводного устройства есть слой связи Ethernet (который является заголовком этого вопроса) ... где не поддерживается режим мониторинга , –

+0

'en0' должно быть именем интерфейса Ethernet, а не беспроводным интерфейсом. В этом случае, если вы запросите PCAP для его типа ссылки, то 'LINKTYPE_ETHERNET' (== 1) является совершенно разумным результатом. В наши дни почти каждая машина имеет интерфейс Ethernet, включая те, которые также имеют беспроводные интерфейсы. Вы уверены, что ищете интерфейс, на который собираетесь смотреть? –

ответ

1

ARE YOU Shure это то, что мешает вам положить карту в режим монитора, и останавливая свои WLAN фильтры от работы, или вы делаете этот призыв к pcap_datalink(), как проверка, пытаясь определить проблему?

Имейте в виду, что из-PCAP LinkType (7):

For a live capture or ``savefile'', libpcap supplies, as the return value of the pcap_datalink(3PCAP) routine, a value that indicates the type of link-layer header at the beginning of the packets it provides. This is not necessarily the type of link-layer header that the packets being captured have on the network from which they're being captured; for example, packets from an IEEE 802.11 network might be provided by libpcap with Ethernet headers that the network adapter or the network adapter driver generates from the 802.11 headers.

Так что я бы не воспользоваться этой LINKTYPE_ETHERNET/DLT_EN10MB возвращаемое значение как верный признак проблемы здесь.

EDIT: Кроме того, pcap_set_rfmon(), как предполагается, называют перед тем ручка активируется, которая не видна в вашем коде.

pcap довольно трогательно о порядке вещей. Посмотрите на страницы руководства для pcap_can_set_rfmon и pcap_set_rfmon.

Заказ должен быть:

  • pcap_create
  • pcap_can_set_rfmon
  • pcap_set_rfmon (если до сих пор так хорошо)
  • тогда и только тогда, pcap_activate
+0

Обновленный код. Все еще сталкиваются с проблемами. –

+0

Интересно. Но я не понимаю, как вы вызываете pcap_set_rfmon (pcap_h, 0). Из man-страницы я предпочитаю pcap_set_rfmon (pcap_h, 1): man-страница говорит: «Если rfmon (второй параметр) не равен нулю, будет установлен режим монитора, иначе он не будет установлен». Кроме того, в этот момент в преследовании проблемы я попробую pcap_can_set_rfmon() до этого. – jbm

+0

Я пробовал 'pcap_can_set_rfmon()'. Будет обновлять код, чтобы показать его там, и, наверное, лучше всего я его тоже там храню :). Я пробовал с «1» и все еще имел ту же проблему. –