Помощничек
Главная | Обратная связь


Археология
Архитектура
Астрономия
Аудит
Биология
Ботаника
Бухгалтерский учёт
Войное дело
Генетика
География
Геология
Дизайн
Искусство
История
Кино
Кулинария
Культура
Литература
Математика
Медицина
Металлургия
Мифология
Музыка
Психология
Религия
Спорт
Строительство
Техника
Транспорт
Туризм
Усадьба
Физика
Фотография
Химия
Экология
Электричество
Электроника
Энергетика

Функции библиотеки packet.dll



Основные функции, описанные в библиотеке:

· ULONG PacketGetAdapterNames (PTSTR pStr, PULONG BufferSize) –получение информации об адаптерах, установленных в системе. Функция опрашивает реестр ОС, производит OID-вызовы драйвера пакетов и записывает имена установленных сетевых адаптеров и их описание в заданный пользователем буфер pStr. BufferSize – размер этого буфера. Формат данных, записываемых в буфер, отличен для версий Windows 95/98 и WindowsNT/2000, из-за разницы в кодировках строк у этих ОС (Windows 95/98 использует кодировку ASCII, Windows NT/2000 – UNICODE). Один ноль ASCII разделяет имена адаптеров, два нуля ASCII – конец списка.

· LPADAPTER PacketOpenAdapter (LPSTR AdapterName) – инициализации адаптера. AdapterName - имя адаптера. Возвращает указатель на структуру ADAPTER открытого адаптера.

· VOID PacketCloseAdapter (LPADAPTER lpAdapter) – высвобождает структуру ADAPTER, связанную с указателем lpAdapter, и закрывает адаптер, связанный с ней.

· LPPACKET PacketAllocatePacket (void) – определяет положение структуры PACKET, инициализированной функцией PacketInitPacket, и возвращает указатель на нее.

· VOID PacketInitPacket (LPPACKET lpPacket, PVOID Buffer, UINT Length) – инициализирует структуру PACKET и имеет следующие аргументы:

o lpPacket – указатель на инициализируемую структуру;

o Buffer – указатель на буфер, задаваемый пользователем и содержащий данные пакета;

o Length – длина буфера – максимальный размер данных, которые могут быть переданы драйвером приложению за один сеанс чтения.

· VOID PacketFreePacket (LPPACKET lpPacket) – высвобождает структуру PAСKET, связанную с указателем lpPacket.

· VOID PacketReceivePacket (lpAdapter AdapterObject, LPPACKET lpPacket, BOOLEAN Sync) – выполняет захват группы пакетов, и имеет следующие аргументы:

o AdapterObject – указатель на структуру ADAPTER, определяющую адаптер, который будет задействован в текущей сессии;

o lpPacket – указатель на структуру PACKET, используемую для записи принятых пакетов;

o Sync – флаг, определяющий режим выполнения операции. Если выбран синхронный режим (True), функция блокирует программу до завершения операции. Если выбран асинхронный режим (False), блокировки не происходит. В последнем случае необходимо использовать функцию PacketWaitPaket для корректного выполнения операции.

Число принятых пакетов зависит от количества пакетов, сохраненных в буфере драйвера, размера этих пакетов и размера буфера, связанного со структурой lpPacket.

Пакеты сохраняются в буфере структуры lpPacket. Каждый пакет состоит из структуры bpf_hdr и содержащий информацию о длине пакета и времени его приема. Поле Padding используется для выравнивания данных в буфере. Поля bf_datalen и bf_hdrlen структуры bpf_hdr используются для извлечения пакетов из буфера

Функция перехватывает пакеты канального уровня. Первые 12 байт поля data – MAC адреса приемника и источника по 6 байт соответсвенно, следующие 2 ба та – идентификатор следующего пакета 0806 – ARP, 0800 – IP, далее располагаются пакеты более высоких уровней. Для анализа IP-пакета рекомендуется использовать следующую структуру:

struct ipHeader{

BYTE mac[14];

BYTE ip_verlen;

BYTE ip_tos;

WORD ip_length;

WORD ip_id;

WORD ip_offset;

BYTE ip_ttl;

BYTE ip_protocol;

WORD ip_xsum;

DWORD ip_src;

DWORD ip_dest;

};

· BOOLEAN PacketWaitPacket (LPADAPTER AdapterObject, LPPACKET lpPacket) – используется для корректного завершения операции ввода/вывода драйвера захвата пакетов. Она является блокирующей в том случае, если драйвер выполняет операцию ввода/вывода. Функция возвращает значение True, если операция завершена успешно, в противном случае – False. Используя функцию GETLASTERROR, можно получить код возникшей ошибки.

· BOOLEAN PacketResetAdapter (LPADAPTER AdapterObject) - сбрасывает адаптер, указанный в качестве аргумента.

· BOOLEAN PacketSetHwFilter (LPADAPTER AdapterObject, ULONG Filter) – устанавливает аппаратный (hardware) фильтр входящих пакетов. Константы, с помощью которых задается фильтр, объявлены в файле ntddndis.h. В качестве аргументов функции задается адаптер, на который устанавливается фильтр, и идентификатор фильтра. Функция возвращает значение True, если операция выполнена успешно. Ниже перечислены наиболее часто используемые фильтры:

o NDIS_PACKET_TYPE_PROMISCUOUS: каждый входящий пакет принимается адаптером;

o NDIS_PACKET_TYPE_DIRECTED: принимаются пакеты, предназначенные для данной рабочей станции;

o NDIS_PACKET_TYPE_BROADCAST: принимаются только широковещательные запросы;

o NDIS_PACKET_TYPE_MULTICAST: принимаются пакеты, предназначенные группе, которой принадлежит рабочая станция;

o NDIS_PACKET_TYPE_ALL_MULTICAST: принимаются пакеты любой группы.

· BOOLEAN PacketRequest (LPADAPTER AdapterObject, BOOLEAN Set, PACKET_OID_DATA OidData) – предназначена для выполнения запроса/установки параметров адаптера AdapterObject. Эта функция используется для получения значений различных параметров сетевого адаптера (размер внутреннего буфера, скорость соединения, значение счетчика пакетов и др.) или их изменения. Второй аргумент определяет тип операции (Set=1 – установка параметра, Set=0 – запрос на получение значения параметра). Третий аргумент – указатель на структуру PACKET_OID_DATA, определяющую параметр адаптера. Функция возвращает True, если операция была выполнена без ошибок.

· BOOLEAN PacketSetBuff (LPADAPTER AdapterObject, int dim) - устанавливает новый размер буфера драйвера, связанного с адаптером AdapterObject. dim – новый размер буфера. Функция возвращает True, если операция была выполнена успешно, False – если для выполнения операции недостаточно памяти. При установке нового размера буфера все данные, находящиеся в нем, стираются.

· BOOLEAN PacketSetBpf (LPADAPTER AdapterObject, struct bpf_program *fp) – связывает новый BPF-фильтр с адаптером AdapterObject. Фильтр, указанный *fp, представляет собой набор инструкций, которые будут выполняться после приема каждого входящего пакета. Функция возвращает значение True, если фильтр установлен успешно, False – если программа-фильтр не принята драйвером.

· BOOLEAN PacketGetStats (LPADAPTER AdapterObject, struct bpf_stat *s) – с помощью этой функции программист может получить значение двух внутренних переменных драйвера:

o число пакетов, принятых адаптером AdapterObject, с момента его открытия при помощи функции PacketOpenAdapter;

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

В структуру bpf_stat драйвер записывает два значения:

· большое значение переменной bs_receive означает, что трафик сети весьма высок. Если приложению нет необходимости принимать все входящие пакеты, рекомендуется установить избирательный фильтр BPF для уменьшения числа обрабатываемых приложением пакетов.

· если значение переменной bs_drop выше нуля, приложение пользователя не успевает обрабатывать входящие пакеты и теряет их. В этом случае рекомендуется увеличить размер буфера при помощи функции PaсketSetBuff, увеличить размер буфера в структуре PACKET либо оптимизировать алгоритм приложения.

· BOOLEAN PacketSetReadTimeout (LPADAPTER AdapterObject, int timeout) – устанавливает время ожидания (аргумент timeout) входящего пакета, по истечении которого все пакеты, сохраненные в буфере, будут переданы приложению.

· BOOLEAN PacketSetMode (LPADAPTER AdapterObject, int mode) - переводит адаптер AdapterObject в режим работы mode, имеющий два возможных значения:

o MODE_CAPT – стандартный режим захвата, устанавливается по умолчанию после вызова функции PacketOpenAdapter;

o MODE_STAT – режим статистики. В этом режиме драйвер не перехватывает пакеты, а производит лишь подсчет принятых пакетов и принятых байт. Эти значения могут быть запрошены приложением путем вызова функции PacketReceivePacket. Приложение имеет возможность получать данную информацию периодически по истечении времени ожидания, которое по умолчанию составляет 1 секунду, но может быть изменено на другое значение с дискретностью 1 мС при помощи функции PacketSetReadTimeout.

Для того, чтобы работать в режиме статистики, приложению необходимо выполнить следующие операции:

o открыть адаптер

o установить режим статистики функцией PacketSetMode

o установить фильтр, определяющий тип подсчитываемых пакетов, функцией PacketSetBpf

o установить необходимое время ожидания при помощи PacketSetReadTimeout

o принять результаты при помощи PacketReceivePacket.

При этом функция PacketReceivePacket возвращает число принятых пакетов и число принятых байт, удовлетворяющих требованиям установленного фильтра, за последний временной интервал. Эти значения являются 64-битными целыми числами, и снабжены заголовком, определяемым структурой bpf_hdr:

struct timeval bh_tstamp
UINT bh_caplen=16
UINT bh_datalen=16
USHORT bh_hdrlen=18
LARGE_INTEGER PacketsAccepted
LARGE_INTEGER BytesAccepted

 

Фрагменты программы для перехвата пакетов

PacketGetAdapterNames(AdapterNamea,&AdapterLength); // Получение списка адаптеров

…//Формирование списка адаптеров

lpAdapter = PacketOpenAdapter(AdapterList[Open]);// открывание адаптер

…//Обработка ошибки, если таковая возникла

CommErr = PacketSetHwFilter(lpAdapter,NDIS_PACKET_TYPE_PROMISCUOUS); //Режим работы адаптера – прием всех пакетов

 

CommErr = PacketSetBuff(lpAdapter,512000); //Установка размера буфера

//PacketSetReadTimeout(lpAdapter,1000); //Можно установить таймер

lpPacket = PacketAllocatePacket(); //Определение структуры

PacketInitPacket(lpPacket,(char*)packetbuff,5000); //инициализации структуры

CommErr = PacketReceivePacket(lpAdapter, lpPacket, true);//Прием блока данных

 




©2015 studenchik.ru Все права принадлежат авторам размещенных материалов.