Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #96, ДЕКАБРЬ 2006 г.

Создаем продвинутый боевой софт!

Иван Скляров

Хакер, номер #096, стр. 096-080-2


Пассивный снифер с использованием библиотеки libpcap

Во всех программах, которые используют библиотеку libpcap, должен быть включен заголовочный файл pcap.h. Типичная последовательность шагов, которую должна выполнить программа, использующая библиотеку libpcap для выполнения своей задачи, выглядит так:

1. идентифицировать сетевой интерфейс;

2. открыть сетевой интерфейс и создать сессию перехвата;

3. создать фильтр, если он необходим;

4. захватить и обработать пакеты;

5. закрыть сессию перехвата.

Рассмотрим подробно каждый шаг.

Идентификация сетевого интерфейса

Существует 3 основных способа идентификации сетевого интерфейса, на котором будет осуществляться прослушивание.

Первый способ - без использования библиотеки libpcap. Имя интерфейса задается жестко в программе: «#define DEVICE "eth0"». Оно может также передаваться в программу пользователем через командную строку.

Второй способ - использовать функцию pcap_lookupdev() из библиотеки libpcap:

#include <pcap.h>

...

char *dev;

char errbuf[PCAP_ERRBUF_SIZE];

dev = pcap_lookupdev(errbuf);

if (dev == NULL) {

fprintf(stderr, "%s", errbuf);

exit(-1);

}

В этом случае переменной dev присвоится имя подходящего интерфейса. В буфер errbuf будет передано описание ошибки, если таковая возникнет при работе pcap_lookupdev(). Прототип функции pcap_lookupdev() выглядит следующим образом:

char *pcap_lookupdev(char *errbuf)

Третий способ - предложить пользователю выбрать интерфейс из предложенного списка. Такой список формирует функция pcap_findalldevs(), ее прототип:

pcap_findalldevs(pcap_if_t **alldevsp, char *errbuf)

Подробности об этой функции смотри в мануалах. Замечу, что функция pcap_findalldevs() отсутствует в устаревших версиях библиотеки libpcap.

Открытие сетевого интерфейса и создание сессии перехвата

Открывает сетевой интерфейс и создает сессию перехвата функция pcap_open_live(), ее прототип выглядит следующим образом:

pcap_t *pcap_open_live(const char *device, int snaplen, int promisc, int to_ms, char *errbuf).

Здесь:

device — это имя интерфейса, которое мы определили на первом шаге;

snaplen — целое число, определяющее максимальное количество байт сетевого пакета, которое будет захватываться библиотекой;

promisc — флаг, переводящий интерфейс в неразборчивый режим (promiscuous mode) (1 — установлен, 0 — нет);

to_ms — тайм-аут в миллисекундах (0 — чтение осуществляется до первой ошибки, -1 — бесконечно);

errbuf — буфер, в который заносится сообщение об ошибке.

Демонстрационный фрагмент кода

#include <pcap.h>

...

pcap_t *handle;

char errbuf[PCAP_ERRBUF_SIZE];

handle = pcap_open_live(dev, BUFSIZ, 1, 0, errbuf);

if (handle == NULL) {

fprintf(stderr, "%s", errbuf);

exit(-1);

Назад на стр. 096-080-1  Содержание  Вперед на стр. 096-080-3