WinDivert — перехват сетевого трафика в Windows¶
WinDivert (сокращение от Windows Divert) — это свободная программная библиотека и драйвер для операционных систем Windows, предназначенная для перехвата, модификации и повторной отправки сетевых пакетов на уровне ядра. Инструмент позволяет приложениям пользовательского режима управлять сетевым трафиком, встраиваясь в стек обработки пакетов Windows, — фактически выполняя роль пользовательского файрвола или транспортного фильтра без необходимости разработки собственного драйвера ядра.
¶Общие сведения
WinDivert разрабатывается как открытый проект с открытым исходным кодом (лицензия LGPL). Основной компонент — драйвер ядра WinDivert.sys, который регистрируется в сетевом стеке Windows и может перехватывать исходящие и входящие пакеты по заданным правилам фильтрации. Пользовательское приложение подключается к драйверу через API библиотеки WinDivert.dll и получает перехваченные пакеты в виде буферов, которые можно прочитать, изменить и отправить обратно в стек.
Ключевые особенности:
- перехват пакетов на уровне ядра без установки сторонних фреймворков;
- возможность модификации содержимого пакетов, включая заголовки IP и TCP/UDP;
- задержка (delay) и повторная отправка пакетов с изменённым таймингом;
- правила фильтрации на собственном мини-языке, похожем на синтаксис WinDivert filter language;
- поддержка IPv4 и IPv6, протоколов TCP, UDP, ICMP и других.
¶Устройство и принцип работы
Архитектура WinDivert строится на разделении на две части: драйвер ядра и библиотека пользовательского режима.
¶Драйвер ядра
Драйвер устанавливается в системе как служба и перехватывает пакеты в сетевом стеке Windows. Он подключается к механизму WFP (Windows Filtering Platform) — стандартной подсистеме фильтрации трафика, используемой в Windows Vista и более поздних версиях. Благодаря WFP WinDivert может получать копии пакетов до или после их обработки стандартными компонентами стека (включая компоненты IPsec и TCP/IP).
Драйвер поддерживает три основных режима работы:
| Режим | Описание |
|---|---|
WINDIVERT_FLAG_RECV | Перехват входящих пакетов |
WINDIVERT_FLAG_SEND | Перехват исходящих пакетов |
WINDIVERT_FLAG_SNIFF | Пассивный сниффинг без блокировки пакетов |
¶Язык фильтров
Правила фильтрации задаются строковым выражением, описывающим условия совпадения по полям пакета: IP-адреса источника и назначения, номера портов, протокол, интерфейс, направление и другие параметры. Пример простого фильтра:
`` outbound and ip.SrcAddr == 192.168.1.10 and tcp.DstPort == 80 ``
Фильтр компилируется драйвером, и перехватываются только те пакеты, которые ему соответствуют, что снижает накладные расходы.
¶API пользовательского режима
Библиотека WinDivert.dll предоставляет функции открытия перехвата (WinDivertOpen), приёма пакетов (WinDivertRecv), отправки обратно (WinDivertSend) и управления параметрами. Пакеты передаются как «сырые» буферы вместе с метаданными (время приёма, направление, интерфейс), что даёт приложению полный контроль над содержимым.
¶Применение
WinDivert активно используется в нескольких областях:
- Сетевые утилиты и прокси. Инструменты вроде Proxifier, сторонние VPN-клиенты и прокси-серверы используют WinDivert для перенаправления трафика отдельных приложений через заданный шлюз.
- Файрволы и системы мониторинга. Проекты, реализующие пользовательские межсетевые экраны поверх Windows, применяют WinDivert как основу для фильтрации.
- Игровые и P2P-приложения. Для модификации тайминга или маршрутизации пакетов в реальном времени.
- Образовательные и исследовательские проекты. Изучение протоколов, анализ трафика, отладка сетевых приложений.
- Античиты и защитное ПО. Для мониторинга сетевой активности процессов (в том числе в контексте обхода ограничений, что вызывает критику со стороны разработчиков античит-систем).
¶Ограничения и особенности
- Требует прав администратора для установки драйвера и работы с перехватом.
- Поддерживает Windows Vista и новее; на 32-битных и 64-битных системах используются соответствующие версии драйвера.
- Модификация пакетов с нарушением контрольных сумм TCP/IP требует от приложения пересчёта checksum самостоятельно.
- Производительность зависит от объёма трафика и сложности фильтра, но поскольку фильтрация выполняется в ядре, накладные расходы на неподходящие пакеты минимальны.
¶См. также
- Windows Filtering Platform
- Npcap / WinPcap
- libnetfilter_queue (аналогичный инструмент для Linux)
¶Источники
- Официальная документация проекта WinDivert
- MSDN: Windows Filtering Platform
- Исходный код проекта на GitHub
