Лабораторная работа № 12. Снифферы. Определение сетевых устройств
Цель работы: Практическое изучение протокола TCP/IP. Получение навыков программирования сетевого уровня модели семиуровневой модели OSI.
Теоретическая справка.
Пакетный сниффер - это программа, которая принимает и сохраняет пакеты из сети, причем не всегда адресованные данному интерфейсу.
Утилиты для сниффинга появились с первых дней появления самих локальных сетей и предназначались для облегчения сетевого администрирования. Традиционно снифферы считаются довольно сложными утилитами, требующими определенного умения для работы с ними, зачастую еще и с непростыми руководствами.Написать сниффер без прямого доступа к сетевой карте или пакетам не возможно. Для прямого доступа существует готовая библиотека packet.dll в составе WinPcap. WinPcap – это архитектура для захвата пакетов и анализа сети для Windows системах (win32). Программа включает в себя пакетный фильтр, работающий на уровне ядра, низкоуровневую динамически подключаемую библиотеку (packet.dll) и системно-независимую библиотеку wpcap.dll (основанную на libpcap версии 0.5).
Пакетный фильтр является драйвером устройства, который добавляет в Windows 95, Windows 98, Windows МЕ, Windows NT и Windows 2000 возможность захватывать и посылать данные напрямую с сетевой карты с возможностью фильтровать и сохранять в буфере захваченные пакеты /6/.
В библиотеке packet.dll описаны и используются следующие структуры данных:
- структура PACKET описывает принимаемый или передаваемый пакет. Состоит из следующих полей:
- OVERLAPPED OverLapped – структура, описанная в DDK Windows, используется для поддержки синхронных вызовов драйвера;
- PVOID Buffer – указатель на буфер, содержащий пакет;
- UINT Length – размер буфера;
- PVOID Next – указатель на следующий пакет;
- UINT ulBytesReceived – размер части буфера, содержащей «верные» данные;
- BOOLEAN bIoComplete – показывает, содержит ли буфер «верные» данные после асинхронного вызова;
- структура ADAPTER содержит описание сетевого адаптера:
- HANDLE hFile – указатель на дескриптор драйвера адаптера;
- TCHAR SymbolicLink – строка, содержащая имя сетевого адаптера, открытого в данный момент.
- структура bpf_hdr описывает заголовок, используемый драйвером при передаче принятого пакета приложению:
- struct timeval:
- tv_sec – дата захвата в стандартном формате UNIX (число секунд, начиная с 1/1/1970);
- tv_usec – микросекунды захвата;
- UINT bh_caplen – длина снимка (захваченной порции данных);
- UINT bh_datalen – реальная длина захваченного пакета;
- USHORT bh_hdrlen – размер структуры bpf_hdr /2/.
Ход работы.
Для выполнения данной лабораторной работы необходимо использовать функцию PacketGetAdapterNames из библиотеки packet.dll.
Описание функции:
function PacketGetAdapterNames(pAdapterDescs: PChar; nAdapterDescs: USLONG; pnAdapterDescsMax: PUINT): BOOL; stdcall;
Эта функция возвращает список доступных сетевых адаптеров. Функция возвращает TRUE, если определены сетевые адаптеры и FALSE - если произошла ошибка.
PAdapterDescs - после вызова будет содержать имена и адреса доступных адаптеров.
NadapterDescs - длина массива.
PnAdapterDescsMax – будет содержать, сколько адаптеров установлено в компьютере.
Функция
function PacketOpenAdapter(AdapterName: LPSTR): DWORD; stdcall;
используется для открытия инсталлированных адаптеров. В качестве параметра нужно указать имя, которое получаются после вызова PacketGetAdapterNames. Функция возвращает указатель на адаптер.
Список возвращенных сетевых адаптеров необходимо поместить на форму посредством любой стандартной компоненты /2/.
Оформление работы.
Отчет по лабораторной работе должен содержать:
- название и цель работы;
- руководство для пользователя программы;
- руководство для программиста;
- алгоритм программы;
- листинг программы;
- экранные формы работы программы;
- вывод по выполненной работе;
- список использованных источников.
Контрольные вопросы:
- семиуровневая модель OSI?;
- структура TCP/IP пакета?.
13 Лабораторная работа № 13. Снифферы. Переключение сетевого адаптера в режим прослушивания ("promisc mode")
Цель работы: Практическое изучение протокола TCP/IP. Получение навыков программирования сетевого уровня модели семиуровневой модели OSI.
Теоретическая справка.
Сниффинг в локальной сети без коммутаторов - хорошо проработанная технология. Большое количество коммерческих и некоммерческих утилит делает возможным прослушивание сетевого трафика и извлечение необходимой информации. Идея заключается в том, что для прослушивания сетевого трафика, сетевая карта компьютера переводится в специальный режим "promisc mode". После этого весь сетевой трафик (несмотря на его предназначение), достигший сетевой карты, может быть доступен снифферу. В локальной сети с коммутаторами для прослушивания сетевого трафика потребуется больше изобретательности, поскольку коммутатор направляет только тот трафик, который предназначен для конкретного компьютера. Однако, существует ряд технологий, которые позволяют преодолеть это ограничение.Библиотека packet.dll предоставляет набор функций, которые позволяют принять или отправить пакет произвольной структуры, запросить или установить параметры сетевого адаптера, получить дескрипторы динамически размещаемых структур типа PACKET, установить или снять BPF-фильтр, изменить размер буфера драйвера и получить статистическую информацию о текущей сессии /7/.
Имеются следующие функции:
1. ULONG PacketGetAdapterNames (PTSTR pStr, PULONG BufferSize) – предназначена для получения информации об адаптерах, установленных в системе. Функция опрашивает регистр ОС, производит OID-вызовы драйвера пакетов и записывает имена установленных сетевых адаптеров и их описание в заданный пользователем буфер pStr. BufferSize – размер этого буфера. Формат данных, записываемых в буфер, отличен для версий Windows 95/98 и WindowsNT/2000, из-за разницы в кодировках строк у этих ОС (Windows 95/98 использует кодировку ASCII, Windows NT/2000 – UNICODE).
2. LPADAPTER PacketOpenAdapter (LPSTR AdapterName) – предназ-начена для инициализации адаптера. Функции передается имя адаптера в качестве аргумента AdapterName (получено с помощью PacketGetAdapterNames), результатом функции является указатель на структуру ADAPTER открытого адаптера.
3. VOID PacketCloseAdapter (LPADAPTER lpAdapter) – высвобождает структуру ADAPTER, связанную с указателем lpAdapter, и закрывает адаптер, связанный с ней.
4. LPPACKET PacketAllocatePacket (void) – определяет положение структуры PACKET, инициализированной функцией PacketInitPacket, и возвращает указатель на нее.
5. VOID PacketInitPacket (LPPACKET lpPacket, PVOID Buffer, UINT Length) – инициализирует структуру PACKET и имеет следующие аргументы:
- lpPacket – указатель на инициализируемую структуру;
- Buffer – указатель на буфер, задаваемый пользователем и содержащий данные пакета;
- Length – длина буфера – максимальный размер данных, которые могут быть переданы драйвером приложению за один сеанс чтения.
6. VOID PacketFreePacket (LPPACKET lpPacket) – высвобождает структуру PCAKET, связанную с указателем lpPacket.
7. VOID PacketReceivePacket (lpAdapter AdapterObject, LPPACKET lpPacket, BOOLEAN Sync) – выполняет захват группы пакетов, и имеет следующие аргументы:
- AdapterObject – указатель на структуру ADAPTER, определяющую адаптер, который будет задействован в текущей сессии;
- lpPacket – указатель на структуру PACKET, используемую для записи принятых пакетов;
- Sync – флаг, определяющий режим выполнения операции /2/.
Если выбран синхронный режим (True), функция блокирует программу до завершения операции. Если выбран асинхронный режим (False), блокировки не происходит. В последнем случае необходимо использовать функцию PacketWaitPaket для корректного выполнения операции.
Число принятых пакетов зависит от количества пакетов, сохраненных в буфере драйвера, размера этих пакетов и размера буфера, связанного со структурой lpPacket. Формат передачи данных приложению драйвером приведен на рисунке 21.
Рисунок 21 - Формат передачи данных приложению драйвером
Пакеты сохраняются в буфере структуры lpPacket. Каждый пакет имеет трейлер, состоящий из структуры bpf_hdr и содержащий информацию о длине пакета и времени его приема. Поле Padding используется для выравнивания данных в буфере. Поля bf_datalen и bf_hdrlen структуры bpf_hdr используются для извлечения пакетов из буфера. Заметим, что Pcap извлекает каждый пакет до того, как передать его приложению.
- BOOLEAN PacketSetHwFilter (LPADAPTER AdapterObject, ULONG Filter) – устанавливает аппаратный (hardware) фильтр входящих пакетов. Константы, с помощью которых задается фильтр, объявлены в файле ntddndis.h. В качестве аргументов функции задается адаптер, на который устанавливается фильтр, и идентификатор фильтра. Функция возвращает значение True, если операция выполнена успешно. Ниже перечислены наиболее часто используемые фильтры:
- NDIS_PACKET_TYPE_PROMISCUOUS: каждый входящий пакет принимается адаптером;
- NDIS_PACKET_TYPE_DIRECTED: принимаются пакеты, предназначенные для данной рабочей станции;
- NDIS_PACKET_TYPE_BROADCAST: принимаются только широковещательные запросы;
- NDIS_PACKET_TYPE_MULTICAST: принимаются пакеты, предназначенные группе, которой принадлежит рабочая станция;
- NDIS_PACKET_TYPE_ALL_MULTICAST: принимаются пакеты любой группы;
- BOOLEAN PacketSetBuff (LPADAPTER AdapterObject, int dim) - устанавливает новый размер буфера драйвера, связанного с адаптером AdapterObject. dim – новый размер буфера. Функция возвращает True, если операция была выполнена успешно, False – если для выполнения операции недостаточно памяти. При установке нового размера буфера все данные, находящиеся в нем, стираются /2/.
Ход работы.
В данной лабораторной работе необходимо выполнить несколько последовательных действий:
1. Необходимо определить текущий сетевой адаптер.
2. При помощи нажатия какой-либо клавиши/кнопки приложения, переключить адаптер в режим «прослушивания».
3. Сохранить несколько пакетов переданных по сети в файл.
4. При помощи другой клавиши/кнопки вернуть исходный режим работы сетевой карты.
5. Обеспечить возможность просмотра сохраненного лога (log) пакетов.
Оформление работы.
Отчет по лабораторной работе должен содержать:
- название и цель работы;
- руководство для пользователя программы;
- руководство для программиста;
- алгоритм программы;
- листинг программы;
- экранные формы работы программы;
- вывод по выполненной работе;
- список использованных источников.
Контрольные вопросы:
- семиуровневая модель OSI;
- структура TCP/IP пакета;
- используемые функции и структуры пакета WinPcap.