С# - как обнюхивать пакеты в приложении, не полагаясь на WinPCap?

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

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

CLARIFICATION. То есть я действительно хочу, чтобы приложение, которое у меня было в настоящее время, но без каких-либо требований, чтобы я мог сказать, что пользователь должен пойти и загрузить/установить XYZ до того, как сможет использовать приложение. Для целей вопроса предполагается, что автоматизация загрузки и установки стороннего приложения/драйверов также не допускается. (с WinPCap я не уверен, если вы можете связать его, однако я считаю, что вы не должны в любом случае, к сожалению)

спасибо

Ответ 1

Лично я буду придерживаться 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-пакетов.

Ответ 2

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

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

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

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

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

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

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

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