Я собираюсь использовать Wireshark для мониторинга трафика на моем Windows компьютер. Работая над этим, мне было интересно, как Wireshark успевает перехватить сетевые пакеты низкого уровня раньше Windows делает.
Прежде всего, сетевой интерфейс моего сетевого адаптера получает пакет. Затем сетевая карта выполняет некоторые начальные проверки (CRC, правильный MAC-адрес и т. Д.). Предполагая, что проверка прошла успешно, сетевая карта пересылает пакет. Но как и где?
Я понимаю, что драйверы являются связующим звеном между сетевой картой и ОС или любым другим приложением. Я также предполагаю, что есть отдельный драйвер для Windows и Wireshark (WinPcap?). В противном случае, Wireshark не смог бы получить Ethernet кадры. Сосуществуют ли одновременно два или более драйверов сетевой карты? Как сетевая карта знает, какой из них использовать?
Модель ввода-вывода в Windows основана на стеке компонентов. Данные должны проходить через различные компоненты этого стека, который существует между физической сетевой картой и приложением, которое будет потреблять данные. Иногда эти различные компоненты проверяют данные (например, TCP-пакет) по мере их прохождения через стек, и в зависимости от содержимого этого пакета данные могут быть изменены или пакет может быть полностью отброшен.
Это упрощенная модель «сетевого стека», через который проходят пакеты, чтобы попасть от приложения к проводу и наоборот.
Одним из наиболее интересных компонентов, показанных на скриншоте выше, является API Callout WFP (Windows Filtering Platform). Если мы увеличим масштаб, это может выглядеть примерно так:
Разработчики могут вставлять свои собственные модули в соответствующие места в этом стеке. Например, антивирусные продукты обычно используют «драйвер фильтра», который подключается к этой модели и проверяет сетевой трафик или предоставляет возможности межсетевого экрана. Служба брандмауэра Windows, очевидно, тоже подходит к этой модели.
Если вы хотите написать приложение, которое записывает сетевой трафик, такое как Wireshark, то подходящий способ сделать это - использовать собственный драйвер и вставить его в стек как можно ниже, чтобы он мог обнаруживать сетевые пакеты. до того, как ваш модуль брандмауэра сможет их сбросить.
Таким образом, в этом процессе задействовано много «драйверов». Также много разных типов драйверов. Кроме того, другие формы ввода / вывода в системе, такие как чтение и запись на жесткий диск, следуют очень похожим моделям.
Еще одно замечание. Вызовы WFP - не единственный способ проникнуть в сетевой стек. WinPCap, например, взаимодействует с NDIS напрямую с драйвером, что означает, что у него есть шанс перехватить трафик до того, как произойдет какая-либо фильтрация.
Ссылки:
Как говорится в ответе Райана Райса:
WinPCap, например, взаимодействует с NDIS напрямую с драйвером, что означает, что у него есть шанс перехватить трафик до того, как произойдет какая-либо фильтрация.
и это описание в документации WinPcap того, как это работает.