Windivert ProcessId на слое NETWORK - PullRequest
       60

Windivert ProcessId на слое NETWORK

0 голосов
/ 18 октября 2019

Я использую Windivert 2.0.

Интересно, смогу ли я построить карту ProcessID с 5-ю кортежами (протокол, исходный ip, исходный порт, dest ip, dest port) с открытым дескриптором Windivert вСлой SOCKET и используйте эту карту с другим открытым дескриптором Windivert на слое NETWORK для фильтрации / блокировки / отклонения пакетов.

Возможно ли это? Я могу вспомнить 2 потенциальные проблемы:

  1. Мне нужно открыть 2 ручки Windivert разных слоев в одном приложении пользователя.

  2. для одногоуказанный сокет, какой слой будет получать события в первую очередь? Потому что мне нужно сначала построить карту и использовать ее в слое NETWORK.

Большое спасибо.

1 Ответ

0 голосов
/ 20 октября 2019

Ваш основной подход верен. Чтобы выполнить фильтрацию на уровне NETWORK на основе идентификатора процесса, необходимо открыть два дескриптора WinDivert:

  1. Один дескриптор на уровне SOCKET, чтобы построить отображение из сетевых 5-кортежей на ProcessID s.
  2. Еще один дескриптор на уровне NETWORK для выполнения фактической фильтрации. Для этого сетевой набор из 5 пакетов сопоставляется с ProcessID с использованием сопоставления SOCKET, и пакет может быть отфильтрован соответствующим образом.

Итак, да, вам действительно нужноto handles.

Другая проблема, о которой вы упомянули, заключается в том, что для нового соединения не гарантируется, что событие SOCKET -layer будет первым. Это тоже правда. Чтобы обойти эту проблему, пользовательское приложение должно ставить в очередь событие NETWORK -layer до тех пор, пока не прибудет соответствующее событие SOCKET -layer, и обрабатывать пакет только по прибытии обоих событий. Это немного сложно, но это решает проблему. Это также подход, используемый Tallow .

...