Как выполнить сканирование wifi ap, доступного поблизости, используя pcap в c

В принципе, я хочу простой C-код, который иллюстрирует захват пакета в беспорядочном режиме и извлекает из него ssid.

Edit1

Я пишу код, который я написал, чтобы выполнить базовое обнюхивание.

#include  #include  int main(int argc, char *argv[]){ pcap_t *handle; struct pcap_pkthdr header; const u_char *packet; int i; char *dev, errbuf[PCAP_ERRBUF_SIZE]; // dev = pcap_lookupdev(errbuf); dev = argv[1]; if( dev == NULL ){ fprintf(stderr, "Couldn't find default device\n"); return 0; } printf("Device: %s\n", dev); handle = pcap_open_live( dev , BUFSIZ , 0 , 1000 , errbuf); if( handle == NULL ){ fprintf(stderr , "couldn't open device %s: %s\n" , dev , errbuf); return 0; } else{ packet = pcap_next( handle, &header ); printf( "Grabbed a packet with length %d\n" , header.len ); for( i = 0; i < header.len; i++ ) printf( "Packet's content %s\n" , packet + i ); pcap_close( handle ); } return 0; } 

TLD; DR: Вы принципиально ошибаетесь. Пакетный захват с помощью libpcap просто не работает таким образом для Wi-Fi.

  • Поскольку SSID находятся в кадрах управления 802.11, вы хотите захватить в режиме мониторинга , а не в беспорядочном режиме .
  • Затем вам необходимо использовать фильтр pcap для фреймов управления, особенно для маяков и / или зондовых запросов и / или ответов зонда . Вот где SSID.
  • Затем, и только тогда вам придется кодировать parsing этих конкретных пакетов. Нет фиксированного формата (много опциональных полей, как видно из поиска захвата с помощью wirehark), поэтому нет «одного размера подходит для всего parsingа». Но SSID не слишком сложно получить.

Тем не менее, вы далеко от этого синтаксического анализа SSID. На самом деле это последняя из ваших проблем. Итак, теперь подробности.

У вас есть 3 возможности относительно libpcap на Wi-Fi:

1 / Нормальный режим (не parsingчивый, а не монитор):

Вы увидите пакеты в / из вашего интерфейса. Не в / из других точек доступа (точек доступа) или STA (станций).

Эти пакеты будут выглядеть как «обычные Ethernet-кадры» без компонентов 802.11 и чистого пакета управления 802.11, поэтому, если ваша цель – получить SSID вокруг вас, это не хорошо, вы просто их не увидите. Единственным полезным для использования случаем является то, что ваш wlan0 является STA или самой AP, и вы хотите захватить трафик между сетевыми приложениями, запущенными на том же компьютере, на котором выполняется ваша программа захвата.

2 / Промежуточный режим.

Опять же, вам нужно быть STA или AP, а pcap даст вам то, что выглядит как обычные Ethernet-фреймы, а не часть управления 802.11, поэтому снова это бесполезно для SSID. Если вы STA: вы не увидите много похожего на случай 1 / нормальный режим. То, что вы увидите больше, – это трансляция (из слоя 2 / слой 3) кадров из другой STA. Например, ARP-запросы, многоадресный / широковещательный UDP. Но не одноадресный трафик от этих других STA. Если вы AP, то да, вы увидите трафик от подключенных STA (обратите внимание: если вы не используете прямой Wi-Fi https://en.wikipedia.org/wiki/Wi-Fi_Direct , где станции общаются напрямую без пакетов проходящей через точку доступа).

3 / Режим монитора. Сейчас мы говорим.

Вы поместите свой интерфейс в режим мониторинга с помощью API libpcap, см. Некоторые примеры здесь:

Почему pcap_datalink () всегда возвращает 1 (Ethernet), даже на беспроводном устройстве?

… или вы заранее создадите интерфейс мониторинга и запустите процесс pcap. Читать:

https://wiki.wireshark.org/CaptureSetup/WLAN#Turning_on_monitor_mode

Вы не будете подключены (ни STA, ни AP) *, и вы можете захватить все (но … + см. Мое последнее предупреждение ниже): кадры управления 802.11, включая маяки, запросы зонда и ответы зонда, с вашими ценными SSID. И все данные. * Если у вас есть некоторые точки доступа без шифрования, TCP / IP данных из них будет прозрачным.

Теперь «но» части:

3.1 – То, что вы будете захватывать, не будет регулярным Ethernet-фреймами. У вас будет заголовок radiotap (некоторая метаинформация, добавленная kernelм), а затем пучок полей 802.11. Это может быть довольно утомительно для анализа, но если вас просто интересует SSID, это может быть всего несколько десятков строк кода C.

3.2. К сожалению, нет фильтра «SSID» из синтаксиса фильтров pcap, который вы можете применить и просто пойти.

http://www.tcpdump.org/manpages/pcap-filter.7.html

И это потому, что просто нет «SSID-поля» для каждого изображения, это зависит от типа / контекста пакета. Тем не менее, фильтры pcap могут помочь вам: что вы можете сделать, это захват маяков с использованием фильтра type mgt subtype beacon « type mgt subtype beacon ». Вы также можете быть заинтересованы в « type mgt subtype probe-resp » и « type mgt subtype probe-resp ». Затем вам придется вручную разобрать их: формат является «эластичным». К счастью, SSID является одним из первых полей, и это несколько десятков строк кода C, чтобы получить его.

Как только вы доберетесь до этого, но вы все еще далеки от этого, если вы столкнулись с проблемами с parsingом маяков, то вы можете вернуться с более конкретным вопросом.

Заключительное предупреждение: следует предупредить, что если вы хотите выйти за пределы SSID и захватить прикладной трафик данных, даже отбросьте вопрос о шифровании и проанализируйте работу, чтобы перейти от вашего пакета 802.11 + radiotap к слою 3 и выше сочных частей. .. результат не гарантируется. По моему опыту: моя среда чрезвычайно шумная (десятки занятых точек доступа и STA), и большую часть времени захват пропускает некоторые бит: прокрутка разреза на таком захвате показывает «ACKed невидимый сегмент», порядковые номера TCP имеют пробелы и «следуют TCP-диалог “на таком захвате показывает некоторые” [NNN missing bytes from capture] “.

Вы можете использовать что-то вроде exec() или system() для вызова соответствующих инструментов / команд CLI и синтаксического анализа вывода. Вы также можете посмотреть в libpcap, который может быть тем, что вы ищете (?).