Как анализировать / перехватывать пакеты, прежде чем они будут отправлены / получены ОС?
Я всегда задавался вопросом, как программные брандмауэры работают под прикрытием, и хотел бы иметь возможность писать свои собственные инструменты для анализа или перехвата пакетов до того, как они будут отправлены или получены ОС. Я достаточно знаком с основными принципами работы в сети; Я просто понятия не имею, с чего начать, если я хочу написать программное обеспечение, которое вписывается в сетевой стек подобно тому, как это делают брандмауэры. Кто-нибудь может дать мне несколько советов?
Мне было бы особенно интересно, если это можно сделать с помощью C#, но я могу делать и другие языки. Я сосредоточен в основном на Windows, но хотел бы знать, есть ли там кроссплатформенные библиотеки?
РЕДАКТИРОВАТЬ Использование драйвера NDIS (как это делает Wireshark) звучит как хороший вариант, и возможности фильтрации пакетов в Vista звучат хорошо, но как брандмауэры делают это, скажем, в Windows XP? Им не нужно устанавливать специальный драйвер, о котором я знаю.
4 ответа
В Windows Vista и выше вы можете взглянуть на платформу фильтрации Windows. В более ранних версиях Windows вам необходимо использовать драйверы фильтров (ссылка на страницу MSDN указывает, какие технологии заменяет WFP).
Насколько я помню, это связано с написанием драйвера NDIS. Он расположен практически над сетевой картой (Network Interface Card), и вы имеете абсолютный контроль над тем, что входит или выходит из сетевой карты раньше всего - вплоть до уровня пакета Ethernet.
Это не может быть достигнуто с C#. Вам действительно нужно использовать C или C++ для этой задачи.
ОБНОВЛЕНИЕ: я последний раз делал это в дни Windows XP. Из другого ответа я вижу, что появился новый и, по-видимому, более простой API, если вы используете Windows Vista и более поздние версии.
Взгляните на WinPcap - он использует драйвер NDIS для реализации своих возможностей фильтрации пакетов. Эта библиотека, вероятно, может служить отличной базой для любой программы проверки пакетов / брандмауэра, которую вы хотите написать, и она с открытым исходным кодом. С http://www.winpcap.org/docs/docs_40_2/html/group__internals.html:
Во-первых, система захвата должна обойти стек протоколов операционной системы, чтобы получить доступ к необработанным данным, проходящим по сети. Для этого требуется часть, работающая внутри ядра ОС, напрямую взаимодействующая с драйверами сетевого интерфейса. Эта часть очень зависит от системы, и в нашем решении она реализована в виде драйвера устройства, называемого Netgroup Packet Filter (NPF); Мы предоставляем разные версии драйвера для Windows 95, Windows 98, Windows ME, Windows NT 4, Windows 2000 и Windows XP. Эти драйверы предлагают как базовые функции, такие как захват и внедрение пакетов, так и более продвинутые, такие как программируемая система фильтрации и механизм мониторинга. Первый может использоваться для ограничения сеанса захвата подмножеством сетевого трафика (например, возможно захватывать только трафик ftp, генерируемый конкретным хостом), второй предоставляет мощный, но простой в использовании механизм для получения статистики на трафик (например, можно получить нагрузку на сеть или объем данных, которыми обмениваются два хоста).