Pull to refresh

Перехват сетевых пакетов используя C#

Любым программам для мониторинга сети, инструментам безопасности необходим перехват сетевых пакетов. В данном топике я расскажу о двух библиотеках для перехвата: SharPcap и WinPKFilter.


SharpPcap

SharpPcap — библиотека для .NET, которая позволяет перехватывать пакеты. По сути, это обертка над библиотекой Pcap, которая используется во многих популярных продуктах. Например, сниффер Wireshark, IDS Snort.
С SharpPCap также поставляется замечательная библиотека для парсинга пакетов — Packet.Net.

Packet.Net поддерживает следующий протоколы:
  • Ethernet
  • LinuxSLL
  • Ip (IPv4 and IPv6)
  • Tcp
  • Udp
  • ARP
  • ICMPv4 и ICMPv6
  • IGMPv2
  • PPPoE
  • PTP
  • Link Layer Discovery Protocol (LLDP)
  • Wake-On-LAN (WOL)


Работать с библиотекой достаточно просто:

// метод для получения списка устройств
CaptureDeviceList deviceList = CaptureDeviceList.Instance;
// выбираем первое устройство в спсике (для примера)
ICaptureDevice captureDevice = deviceList[0];
// регистрируем событие, которое срабатывает, когда пришел новый пакет
captureDevice.OnPacketArrival += new PacketArrivalEventHandler(Program_OnPacketArrival);
// открываем в режиме promiscuous, поддерживается также нормальный режим
captureDevice.Open(DeviceMode.Promiscuous, 1000);
// начинаем захват пакетов
captureDevice.Capture();


Теперь в обработчике события device_OnPacketArrival мы можем работать с пакетом:

static void Program_OnPacketArrival(object sender, CaptureEventArgs e)
{
// парсинг всего пакета
Packet packet = Packet.ParsePacket(e.Packet.LinkLayerType, e.Packet.Data);
// получение только TCP пакета из всего фрейма
var tcpPacket = TcpPacket.GetEncapsulated(packet);
// получение только IP пакета из всего фрейма
var ipPacket = IpPacket.GetEncapsulated(packet);
if (tcpPacket != null && ipPacket != null)
{
DateTime time = e.Packet.Timeval.Date;
int len = e.Packet.Data.Length;

// IP адрес отправителя
var srcIp = ipPacket.SourceAddress.ToString();
// IP адрес получателя
var dstIp = ipPacket.DestinationAddress.ToString();

// порт отправителя
var srcPort = tcpPacket.SourcePort.ToString();
// порт получателя
var dstPort = tcpPacket.DestinationPort.ToString();
// данные пакета
var data = tcpPacket.PayloadPacket;
}
}


Так же библиотека позволяет создавать пакеты и отправлять, работать с дампами и многое другое. Без проблем работает на mono. Для более подробной информацией прошу на CodeProject. У SharpPcap есть конкурент Pcap.net. По описанию возможности совпадают. Хотя, судя по вопросам и ответах на различных форумах, создание пакетов в нем легче.

WinPKFilter

WinPKFilter — NDIS драйвер для перехвата пакетов. Поддерживаются различные операционные системы:x/ME/NT/2000/XP/2003/Vista/2008/Windows 7/2008R2. Плюсом драйвера является то, что он позволяет модифицировать и блокировать пакеты. Для некоммерческих проектов библиотека бесплатна.
Для удобной работы с драйвером предоставляется библиотека. На сайте можно скачать обертки для этой библиотеки для следующих языков — C#, Delphi, VB, MS VC++, C++ Builder.
Работать с WinPkFilter сложнее, чем SharpPcap, нужны хорошие знания в работе с неуправляемым кодов и маршалинге. Да и размер кода получается намного больше. На официальном сайте можно задать вопрос на который Вы без проблем получите от автора (кстати русский). Здесь выложил пример программы, которая блокирует пакеты в которых содержится слово «porn».

Спасибо за чтение.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.