Сниффер с libpcap на Mac OS X на C

Я пытался создать свой собственный сниффер (ТОЛЬКО ДЛЯ РАЗВЛЕЧЕНИЯ), и я работаю на Mac. Я использую libpcap, очень хорошую библиотеку для сниффинга. Итак, я использовал этот простой сниффер, который нюхает 5 пакетов: (Написано на C)

#include <pcap.h>
#include "hacking.h"

void pcap_fatal(const char *failed_in, const char *errbuf) {
     printf("Fatal Error in %s: %s\n", failed_in, errbuf);
     exit(1);
}

int main() {
    struct pcap_pkthdr header;
    const u_char *packet;
    char errbuf[PCAP_ERRBUF_SIZE];
    char *device;
    pcap_t *pcap_handle;
    int i;

device = pcap_lookupdev(errbuf);
if(device == NULL)
    pcap_fatal("pcap_lookupdev", errbuf);

printf("Sniffing on device %s\n", device);

pcap_handle = pcap_open_live(device, 4096, 1, 0, errbuf);
if(pcap_handle == NULL)
    pcap_fatal("pcap_open_live", errbuf);

for(i=0; i < 5; i++) {
    packet = pcap_next(pcap_handle, &header);
    printf("Got a %d byte packet\n", header.len);
    dump(packet, header.len);
}

pcap_close(pcap_handle);

}

Если вам интересно, да, я взял это из книги (Hacking: The Art of Exploitation) и немного изменил. Проблема в том, что если я запускаю это в Linux, все работает отлично, без проблем. Но если я запускаю это на Mac, это не работает и не захватывает никаких пакетов.

Может ли кто-нибудь из вас помочь? Заранее спасибо!


person jndok    schedule 23.02.2013    source источник
comment
Печатает ли он какие-либо сообщения об ошибках? Вы уверены, что слушаете на правильном сетевом устройстве?   -  person thejh    schedule 23.02.2013
comment
Да, я уверен. Он обнюхивает «en0», что является правильным устройством.   -  person jndok    schedule 23.02.2013
comment
у вас нет доступа к /dev/bpf*, который является сниффинговым устройством в Mac OS X. Запустите его под sudo, и он может сработать для вас.   -  person Petesh    schedule 23.02.2013
comment
Другая проблема заключается в том, что для pcap_open_live существует резервный буфер, и pcap_next может не возвращаться, пока буфер не будет заполнен. Вы должны использовать ненулевой тайм-аут при чтении (например, 1000) и проверять, был ли возвращен пакет.   -  person Petesh    schedule 23.02.2013
comment
Я наблюдаю такое же странное поведение на некоторых компьютерах Mac с моей программой (которая также использует pcap_setfilter, запускаемую с помощью sudo). На двух Маках моя программа работает нормально, на двух других (тоже последняя ОС, тоже все обновления установлены) я не получаю никаких пакетов. Тот же код, другое поведение. И что еще более странно: если я параллельно запускаю tcpdump, то tcdump сбрасывает пакеты и моя программа начинает получать пакеты.   -  person Werner Henze    schedule 30.05.2013
comment
@WernerHenze: ваша программа передает 1 в качестве неразборчивого аргумента в pcap_open_live() или вызывает pcap_set_promisc() после вызова pcap_create() и перед вызовом pcap_activate()? В противном случае вы не работаете в беспорядочном режиме, поэтому вы будете видеть только пакеты, отправленные на ваш компьютер или с него, а также широковещательные/многоадресные пакеты; запуск tcpdump по умолчанию переводит интерфейс в неразборчивый режим, и все программы, включая вашу, могут видеть сторонние пакеты.   -  person    schedule 14.06.2013
comment
@GuyHarris Я не использую беспорядочный режим. Меня интересуют только пакеты, предназначенные для моего ПК или широковещательного адреса. Эти пакеты всегда должны быть доставлены мне. Но у меня был случай, когда я получил их только тогда, когда tcpdump работал параллельно (и мог перевести сетевую карту в неразборчивый режим).   -  person Werner Henze    schedule 14.06.2013


Ответы (3)


Если вы получаете сообщение об ошибке «Fatal Error in pcap_lookupdev», проблема заключается в том, что сказал Саша — у вас нет разрешения на перехват пакетов. Если вы получаете это сообщение, попробуйте запустить программу с помощью sudo или попробуйте, например, изменить право собственности на устройства /dev/bpf* (что вам нужно будет сделать с помощью sudo). ). Однако вы говорите, что «он обнюхивает «en0»», поэтому, по-видимому, вы говорите это, потому что он печатает «обнюхивает устройство en0», и в этом случае pcap_lookupdev() не выходит из строя.

Если вы получаете «Неустранимая ошибка в pcap_open_live», это может также быть проблемой с разрешениями, но вы почти наверняка не получите ошибку из-за разрешений, так как pcap_lookupdev() уже не удалось .

Если вы не получаете сообщение об ошибке "Fatal Error in", вероятно, проблема, как заметил Петеш, заключается в том, что вы указали 0 в качестве времени ожидания. Если в качестве времени ожидания указано 0, pcap_loop(), pcap_dispatch(), pcap_next() и pcap_next_ex() могут бесконечно ждать, прежде чем предоставлять пакеты приложению; на некоторых платформах, таких как Linux и Solaris, он не будет ждать бесконечно, но на других платформах, таких как *BSD и OS X, он может ждать бесконечно долго. Попробуйте тайм-аут 1000, что составляет одну секунду; это то, что делает, например, tcpdump.

person Community    schedule 23.02.2013

В дополнение к Petesh: Подробную информацию можно найти на странице руководства ("man pcap" в Терминале).

Здесь утверждается:

В BSD (включая Mac OS X):

          You must have read access to /dev/bpf* on systems that don't have a cloning
          BPF device, or to /dev/bpf on systems that do.  On BSDs with a devfs  (this
          includes  Mac OS X), this might involve more than just having somebody with
          super-user access setting the ownership or permissions on the BPF devices -
          it  might  involve  configuring  devfs  to set the ownership or permissions
          every time the system is booted, if the system even supports  that;  if  it
          doesn't  support  that,  you might have to find some other way to make that
          happen at boot time.
person Abu Dun    schedule 23.02.2013
comment
Вы должны добавить примечание о «тайм-ауте чтения» — он, вероятно, тоже сталкивается с этой проблемой. - person Petesh; 23.02.2013
comment
На самом деле, вы должны добавить это примечание - если вы отвечаете на его вопрос (что сделали ваши комментарии), вы должны сделать это в ответе, а не в комментарии. - person ; 24.02.2013

Я тестировал код на 10.8.4 и работал с изменением параметра to_ms (тайм-аут чтения) на какое-то ненулевое значение, после чего начал получать пакет.

Спасибо за базовый код. Это сэкономило мое время.

С уважением, Ананд Чуби

person Anand Choubey    schedule 13.06.2013