2015-02-25 2 views
0

Я делаю сниффер, используя libpcap, и у меня появляется какое-то странное поведение. Я мало знаю о сети, потому что я делаю сниффера, чтобы узнать, как работает сеть.Установленный беспроводной интерфейс, но захватывает данные Ethernet

Перед тем, как запустить сниффер, я типа ifconfig на терминале, и он возвращается:

eth0  Link encap:Ethernet Endereço de HW 44:87:fc:ec:63:08 
      endereço inet6: fe80::4687:fcff:feec:6308/64 Escopo:Link 
      UP BROADCASTMULTICAST MTU:1500 Métrica:1 
      RX packets:38398 errors:0 dropped:1 overruns:0 frame:0 
      TX packets:28661 errors:0 dropped:0 overruns:0 carrier:2 
      colisões:0 txqueuelen:1000 
      RX bytes:24620500 (23.4 MiB) TX bytes:6922586 (6.6 MiB) 
      IRQ:42 

lo  Link encap:Loopback Local 
      inet end.: 127.0.0.1 Masc:255.0.0.0 
      endereço inet6: ::1/128 Escopo:Máquina 
      UP LOOPBACKRUNNING MTU:16436 Métrica:1 
      RX packets:294 errors:0 dropped:0 overruns:0 frame:0 
      TX packets:294 errors:0 dropped:0 overruns:0 carrier:0 
      colisões:0 txqueuelen:0 
      RX bytes:18540 (18.1 KiB) TX bytes:18540 (18.1 KiB) 

wlan0  Link encap:Ethernet Endereço de HW 00:c1:40:67:04:30 
      inet end.: 192.168.0.102 Bcast:192.168.0.255 Masc:255.255.255.0 
      endereço inet6: fe80::2c1:40ff:fe67:430/64 Escopo:Link 
      UP BROADCASTRUNNING MULTICAST MTU:1500 Métrica:1 
      RX packets:2115 errors:0 dropped:0 overruns:0 frame:0 
      TX packets:2033 errors:0 dropped:0 overruns:0 carrier:0 
      colisões:0 txqueuelen:1000 
      RX bytes:947310 (925.1 KiB) TX bytes:571860 (558.4 KiB) 

Я снял сетевой кабель, так что интерфейс eth0 не имеет IP и не будет работать, если я использую его на моем сниффер.

Таким образом, я передаю интерфейс беспроводной сети в качестве параметра в программу на терминале.

#./sniffer wlan0 

И фрагмент кода:

pcap_t* handler = NULL; 

handler = pcap_open_live(argv[1], 65535, 1, 1000, errbuf); 

if((datalink_value = pcap_datalink(handler)) == DLT_EN10MB) 
    printf("ETHERNET\n"); 
else if (datalink_value == DLT_IEEE802_11) 
    printf("WIRELESS\n"); 

Выход ETHERNET.

Почему это происходит и как я могу его исправить? Устройство преобразует его в ethernet? Или это поведение ядра? Я до сих пор не знаю, является ли проблема моим кодом, или если я плохо знаю, как работает сеть и протокол.

Беспроводное устройство, которое я использую: Mini USB 150Mbps 802.11n/г/б WiFi адаптер COMFAST WU720N

Спасибо.

+1

Потому что инкапсуляция всегда кодируется: Ethernet – LPs

+0

@LPs Это всегда будет происходить в беспроводной сети? Я имею в виду, это правило? Благодарю. – ViniciusArruda

+0

@ Гуй Харрис очень хорошо ответил вам. – LPs

ответ

2

В Linux вам необходимо выполнить захват в режиме монитора, чтобы получить заголовки 802.11. Если адаптер не находится в режиме монитора, вы получите только кадры данных, а не управляющие или управляющие кадры, а заголовок 802.11 будет превращен в поддельный заголовок Ethernet ядром, и пакет будет снабжен этим заголовком.

Новые версии libpcap имеют API для запроса режима мониторинга, но в Linux этот API работает только хорошо, если libpcap был построен с поддержкой libnl. Вы можете попробовать использовать API (используйте pcap_create(), а затем вызовы для установки параметров захвата, а затем pcap_activate(), чтобы открыть устройство, один из этих вызовов должен быть pcap_set_rfmon() для установки режима монитора). Если это не сработает, вам придется использовать воздушный фильтр для включения режима монитора; см. this part of the Wireshark Wiki для получения информации о том, как это сделать.

Смежные вопросы