![]() |
Сниффер на Perl
Создание сниффера на PERL под Windows, используя модуль Win32::NetPacket
Программы и модули, необходимые для этого, следующие. * WinPCAP – архитектура захвата пакетов, которая обходит стандартный стек протоколов Windows и предназначена для предоставления API соответствующим модулям PERL по захвату и отправке пакетов. Скачать соответствующий install можно с: http://www.winpcap.org/install/default.htm. * Модуль Win32::NetPacket – предоставляет объектно-ориентированный интерфейс к API библиотеки Packet.dll. Скачать можно либо с http://search.cpan.org, либо воспользовавшись диспетчером пакетов PERL, набрать на консоле: ppm install http://www.bribes.org/perl/ppm/Win32-NetPacket.ppd. Основные методы Win32::NetPacket. new Код:
$nic = Win32:: NetPacket- >new ([option = > value]);Опции передаются в хеш, используя ключи и значения парами. Возможные опции: * adapter_name Устанавливает название сетевого адаптера, который будет открыт. Если эта опция не установлена, название адаптера, возвращенное функцией GetAdapterNames() используется по умолчанию. Список всех сетевых плат, установленных в системе может быть получен функцией GetAdapterNames() в контексте списка. * driver_buffer_size Задает размер, в байтах, буфера драйвера, связанного с адаптером. Значение по умолчанию - 256 килобайт. Может быть изменено позже с помощью метода SetDriverBufferSize(). * read_timeout Задает время ожидания в миллисекундах, после которого метод ReceivePacket() возвратит значение, даже если не один пакет не был захвачен. Значение по умолчанию 1 секунда (1000 милисекунд). Может быть изменено позже методом SetReadTimeout(). * min_to_copy Задает минимальное количество данных, в байтах, в буфере драйвера, которое заставит метод ReceivePacket() возвратить значение. Значение по умолчанию - 0. Может быть изменен позже методом SetMinToCopy(). (Работает только на системах WinNT/2000/XP) * mode Задает режим адаптера: MODE_CAPT для стандартного режима захвата или MODE_STAT для режима статистики. Подробности: см. SetMode(). Значение по умолчанию - MODE_CAPT. SetUserBuffer Код:
$nic->SetUserBuffer($Buffer, $size);SetHwFilter Код:
$success = $nic->SetHwFilter(CONSTANT);Константы, которые определяют фильтры: Код:
NDIS_PACKET_TYPE_DIRECTEDЭтот метод также работает, если адаптер работает в статистическом режиме, и может использоваться, чтобы установить интервал времени между двумя статистическими сообщениями. SetMinToCopy Код:
$success = $nic->SetMinToCopy($nbytes)Этот метод реализован только в Windows NT/2000/XP. Драйвер для Windows 95/98/ME не поддерживает эту возможность, поэтому этот вызов осуществлен под эти системы только для совместимости. ReceivePacket Код:
$BytesReceived = $nic->ReceivePacket();Формат, используемый драйвером, чтобы послать пакеты приложению следующий: Пакет #1 - > --------- ----- bpf_hdr структура ------ | Bpf_hdr | --- > | tv_sec l = int | --------- | tv_usec l = int | | Данные | | bh_caplen I = unsigned int | --------- | bh_datalen I = unsigned int | | Выравнивание | | bh_hdrlen S = unsigned short| Пакет #2 - > --------- ------------------------------ | Bpf_hdr | --------- | Данные | --------- | Выравнивание | --------- ... И т.д Каждый пакет имеет заголовок, находящийся в структуре bpf_hdr, которая определяет ее длину и вмещает ее временной штамп (timestamp). Поле выравнивание используется для выравнивания данных в буфере по границе слова. Структура Bpf_hdr имеет следующие поля: * tv_sec дата захвата в стандарте времени UNIX, * tv_usec микросекунды захвата, * bh_caplen длина захваченной порции, * bh_datalen истинная длина пакета, * Bh_hdrlen длина заголовка формирующего (инкапсулирующего) пакет. Например, можно получить значения первого заголовка буфера пользователя $buffer: Код:
($tv_sec, $tv_usec, $caplen, $datalen, $hdrlen)=unpack ‘llIIS’, $buffer;Код:
my $packet = substr $buffer, 0, $datalen;GetInfo Код:
($name, $description, $type, $speed, $ip, $mask) = $nic->GetInfo();Используя вышеперечисленные методы, можно написать такую программу. Код:
use Win32::NetPacket qw/:ndis/;http://citforum.univ.kiev.ua/operati.../perl_sniffer/ © Baranov Artem |
| Время: 17:10 |