Как вынюхивать пакеты в приложении, не полагаясь на WinPCap? - PullRequest
12 голосов
/ 15 августа 2010

ОБЩАЯ ИНФОРМАЦИЯ : Теперь я понимаю, как написать приложение на C #, которое может отслеживать пакеты, входящие и исходящие из сетевой карты на ПК, на котором запущено приложение.Однако известный мне подход основан на том, что http://www.winpcap.org/ уже установлен на ПК, а затем я использую оболочку C #, например http://pcapdotnet.codeplex.com/ или http://sourceforge.net/projects/sharppcap/.

ВОПРОС : Однако, мой вопрос, что мне нужно сделать, чтобы иметь приложение C #, которое может прослушивать пакеты, для которых НЕ требуется предварительно устанавливать стороннее приложение / драйверы?

РАЗЪЯСНЕНИЕ : То есть я действительно хочу приложение, которое у меня есть в данный момент, но без каких-либо требований, чтобы я сказал пользователю, что нужно перейти и загрузить / установить XYZ, прежде чем он сможет использоватьприложение.Для целей данного вопроса предположим, что автоматизация загрузки и установки сторонних приложений / драйверов также не допускается.(с WinPCap я не уверен, что вы можете связать его, но, к сожалению, вы ни в коем случае не должны)

спасибо

Ответы [ 2 ]

6 голосов
/ 11 ноября 2010

Существует способ захвата входящих / исходящих пакетов в .NET, используя только стандартную реализацию winsocks.Я видел блог с примером того, как, но у меня больше нет ссылки.

Короче говоря, это крайний крайний случай, потому что это не то, для чего предназначен winsocks (стандартный сетевой драйвер Windows).

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

IE, драйвер будет игнорировать пакеты определенного типа на уровне ядра вместоуровень пользовательского режима.Таким образом, вы сможете фильтровать пакеты намного эффективнее и захватывать при больших нагрузках в сети.

В .NET для фильтрации пакетов вам потребуется собственная схема фильтрации пакетов прикладного уровня, котораябудет гораздо менее эффективным.

Windows блокирует доступ к нестандартным протоколам по «соображениям безопасности», поэтому они не поддерживают использование пакетов RAW для работы в сети (даже если для этого существует код),Пакеты RAW всегда предназначались для исследования разработки новых протоколов, а не общего использования.

По всем этим причинам обычно рекомендуется выбрать Winpcap и оболочку для вашего конкретного языка для реализации любого типа.Захват приложения.

Примечание. Я лично предпочитаю SharpPcap, но я также склонен к разработке проекта.Pcap.net очень похож в своей реализации, когда дело доходит до захвата, он в основном расходится, когда речь идет о том, как анализируются пакеты.

6 голосов
/ 15 августа 2010

Лично я бы придерживался WinPCap.Но так как вы спросили, можно прослушивать пакеты из сети, используя следующий код для включения необработанных сокетов.

Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);
s.Bind(new IPEndPoint(IPAddress.Parse("<IP Address Here of NIC to sniff>"), 0));
s.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.HeaderIncluded, 1);
byte[] inBytes = new byte[] { 1, 0, 0, 0 };
byte[] outBytes = new byte[] { 0, 0, 0, 0 };
s.IOControl(IOControlCode.ReceiveAll, inBytes, outBytes);

После того, как это будет сделано, вы можете использовать Socket.Receive или Socket.BeginReceive для чтениянеобработанные IP-пакеты.

...