Открыть сервисСервис

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
Заметили ошибку или не согласны с информацией в статье? Напишите нам support@bfometr.ru