Взаимодействие с NDIS

NDIS поддерживает три типа сетевых драйверов:

1. Драйверы сетевых карт (NIC – Network Interface Card) – низший уровень сетевой подсистемы.

2. Промежуточные драйверы – обеспечивают взаимодействие драйверов верхнего уровня (например, драйверов протоколов) с драйверами NIC.

3. Драйверы транспортного уровня (драйверы протоколов) – обеспечивают прием и передачу данных приложения верхнего уровня, используя стек стандартных сетевых протоколов (например, TCP/IP).

Общий вид структуры NDIS с двумя стеками захвата пакетов, привязанных к одному сетевому адаптеру, представлен на рис. 3. Один из них состоит из драйвера NIC и драйвера протокола, другой – из драйвера NIC, промежуточного драйвера и драйвера протокола.

Рисунок 3: структура NDIS

Для нормальной работы драйверу захвата пакетов необходимо взаимодействовать как с драйвером сетевого устройства (для передачи и приема данных), так и с приложением пользователя (для получения от него данных или передачи ему принятых от сетевого устройства пакетов). Поэтому драйвер захвата пакетов разработан как драйвер протокола в структуре NDIS

Рисунок 4: положение драйвера захвата пакетов в структуре NDIS

Это позволяет ему работать со всеми сетевыми устройствами, поддерживаемыми ОС Windows (адаптерами Ethernet и т. д.). Тем не менее, на данный момент драйвер работает только с адаптерами Ethernet, loopback-адаптерами и поддерживает подключение к глобальной сети через Ethernet-адаптер. Пакет протоколов PPP NCP-LCP «прозрачен» для драйверов протоколов, поскольку PPP-соединения устанавливаются виртуально. Поэтому драйвер захвата пакетов не может работать с такого рода соединениями.

6. Основные функции библиотеки libpcap.

· PCAP_T pcap_open_live (char *device, int snaplen, boolean promisc, int to_ms, char *ebuf)

Функция предназначена для получения дескриптора структуры захвата пакетов, используемой для записи и просмотра пакетов, передаваемых по сети (режим он-лайн). Device – это строка, задающая открываемый сетевой адаптер. Переменная Snaplen задает максимальное число захватываемых байт. Флаг Promisc переводит адаптер в режим работы “прием всех входящих пакетов”. Переменная to_ms содержит время ожидания пакета в миллисекундах. При возникновении ошибки функция возвращает значение NULL и записывает строку, характеризующую ошибку, в буфер ebuf.

· PCAP_T pcap_open_offline (char *fname, char *ebuf)

Функция предназначена для получения дескриптора структуры захвата пакетов, используемой для записи и просмотра пакетов, сохраненных в файле (режим офф-лайн). Имя файла указывается в переменной fname. Если в качестве имени файла указан символ ‘-‘, информация будет считываться из устройства, определяемого системной переменной stdin.

· PCAP_DUMPER_T pcap_dump_open (pcap_t *p, char *fname)

Функция открывает файл, имя которого указано в переменной fname, для записи всех принятых пакетов (дампа). Имя файла ‘-‘ означает запись в stdout. Переменная p – это указатель на дескриптор структуры pcap, полученный при помощи функции pcap_open_live(). Функция возвращает дескриптор открытого для записи файла. При возникновении ошибки функция возвращает значение NULL, при этом описание ошибки может быть получено при помощи pcap_geterr().

· CHAR pcap_lookupdev (char *errbuf)

Функция возвращает указатель на сетевое устройство, которое возможно использовать совместно с pcap_open_live() и pcap_lookupnet().

· INT pcap_lookupnet (char *device, bpf_u_int32 *netp, bpf_u_int32 *maskp, char *ebuff)

Функция используется для определения сетевого адреса и сетевой маски устройства, заданного в переменной device. Эти данные записываются соответственно в переменные netp и maskp. При возникновении ошибки функция возвращает значение “–1”.

· INT pcap_dispatch (pcap_t *p, int cnt, pcap_handler callback, u_char *user)

Функция используется для сбора и обработки принятых пакетов. Аргумент cnt задает максимальное число принимаемых и обрабатываемых пакетов за один сеанс работы подпрограммы. Значение cnt = -1 означает, обрабатываются все пакеты, принятые одним буфером. Значение cnt = 0 означает обработку всех пакетов до возникновения ошибки, достижения конца файла (при работе в режиме офф-лайн) или до окончания времени ожидания пакета (при приеме пакетов из сети и ненулевом значении to_ms). Переменная callback задает подпрограмму, вызываемую с тремя аргументами: указатель u_char user, передаваемый функцией pcap_dispatch(), указатель на структуру pcap_pkthdr, содержащую сетевые заголовки и данные принятых пакетов, и указатель u_char на данные этих пакетов. Функция возвращает число считанных пакетов. При достижении конца файла функция возвращает нулевое значение, значение функции “–1” означает возникновение ошибки. В последнем случае описание ошибки может быть получено при помощи функций pcap_geterr() или pcap_perr().

· VOID pcap_dump (u_char *user, struct pcap_pkthdr *h, u_char *sp)

Функция записывает принятые пакеты в файл, открытый функцией pcap_dump_open(). Аргументы функции позволяют использовать ее совместно с pcap_dispatch(). Формат записываемых в файл данных аналогичен формату программы TCPDUMP и ее аналога WinDump, включенной в состав дистрибутива WinPCap (см. руководство пользователя по данной программе).

· INT pcap_compile (pcap_t *p, struct bpf_program *fp, char *str, int optimize, bpf_u_int32 *netmask)

Функция компилирует текстовое описание фильтра str в псевдокод (см. далее). Переменная fp содержит указатель на структуру bpf_program и заполняется функцией pcap_compile(). Переменная optimize определяет наличие оптимизации псевдокода компилируемой программы. Переменная netmask задает сетевую маску локальной сети.

· INT pcap_setfilter (pcap_t *p, struct bpf_program *fp)

Функция устанавливает программу фильтра для вызвавшего ее приложения. Переменная fp содержит указатель на программу фильтра, полученный при вызове функции pcap_compile().

· INT pcap_loop (pcap_t *p, int cnt, pcap_handler callback, u_char *user)

Действия данной функции аналогичны pcap_dispatch(), за тем исключением, что она считывает пакеты до тех пор, пока не обнулится счетчик cnt или не возникнет ошибка, и не прекращает работы при окончании времени ожидания. Отрицательное значение cnt заставит функцию работать бесконечно, до возникновения первой ошибки.

· U_CHAR pcap_next (pcap_t *p, struct bpf_program *fp)

Функция возвращает указатель на следующий принятый пакет.

· INT pcap_datalink (pcap_t *p)

Функция возвращает имя устройства сетевого уровня, например DLT_EN10MB.

· INT pcap_snapshot (pcap_t *p)

Функция используется для получения «снимка», т.е. для захвата определенного количества пакетов. Длина «снимка» указывается при вызове функции pcap_open_live.

· INT pcap_is_swapped (pcap_t *p)

Функция возвращает значение TRUE, если открытый для записи файл имеет порядок байт, не совпадающий с используемым в операционной системе.

· INT pcap_major_version (pcap_t *p)

Функция возвращает старшее число номера версии PCAP, записываемого в файл.

· INT pcap_minor_version (pcap_t *p)

Функция возвращает младшее число номера версии PCAP, записываемого в файл.

· FILE *pcap_file (pcap_t *p)

Функция возвращает имя открытого для записи файла.

· INT pcap_stats (pcap_t *p, struct pcap_stat *ps)

Функция возвращает 0 и заполняет структуру pcap_stat значениями, которые несут различную статистическую информацию о входящих пакетах с момента запуска процесса до момента вызова этой функции. При возникновении какой-либо ошибки, а также в случае, когда используемый драйвер не поддерживает статистический режим, функция возвращает значение “–1”. При этом код описание ошибки можно получить с помощью функций pcap_perror() или pcap_geterr().

· INT pcap_fileno (pcap_t *p)

Функция возвращает дескриптор открытого для записи файла.

· VOID pcap_perror (pcap_t *p, char *prefix)

Функция выводит текст последней возникшей ошибки библиотеки PCAP на устройстве stderr с префиксом, определяемым переменной prefix.

· CHAR *pcap_geterr (pcap_t *p)

Функция возвращает строку с описанием последней ошибки библиотеки PCAP.

· CHAR *pcap_strerror (int error)

Функция используется в том случае, когда strerror по каким-либо причинам недоступно.

· VOID pcap_close (pcap_t *p)

Функция закрывает файл, связанный с адаптером p, и высвобождает занимаемые библиотекой ресурсы.

· VOID pcap_dump_close (pcap_dumper_t *p)

Функция закрывает открытый для записи файл.

Функции, присутствующие только в версии для WIN32

· INT pcap_setbuff (pcap_t *p, int dim)

Функция устанавливает размер буфера задержки и буфера сохранения, связанных с адаптером p, равным значению, указанному в переменной dim. При этом оба старых буфера уничтожаются, и информация в них теряется. В случае успешного выполнения операции функция возвращает значение “0”, иначе “–1”. Первоначально оба буфера создаются при вызове функции pcap_open_live(), по умолчанию размер буфера задержки и буфера сохранения равен 1 Мб.

· INT pcap_setmode (pcap_t *p, int mode)

Функция устанавливает режим работы адаптера p в соответствии с заданным в переменной mode. Допустимые значения переменной mode – это “0” (режим захвата пакетов) и “1” (статистический режим). Если адаптер находится в статистическом режиме, сетевая ловушка, заданная при помощи функций pcap_dispatch() или pcap_loop(), вызывается драйвером каждые to_ms миллисекунд (параметр задается при вызове функции pcap_open_live()) и передает библиотеке два 64-битных числа, содержащих число пакетов и полное количество байт, удовлетворяющих условиям фильтра.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: