Как перенаправить TCP-пакеты с уровня протокола с помощью драйвера фильтра NDIS?

#windows #tcp #driver #ndis

#Windows #tcp #драйвер #ndis

Вопрос:

Я пишу драйвер фильтра NDIS для Windows. Теперь я столкнулся с проблемой.

Я собираюсь перенаправить TCP-пакеты на TCP-сервер на текущем компьютере, на котором установлен драйвер фильтра NDIS. Например, IP-адрес текущего компьютера есть 192.168.1.1 , и на нем есть TCP-сервер, который является прослушивающим портом 8000 .

Пользователь вводит URL: http://192.168.1.10/xxxx в браузере IE и моем драйвере фильтра NDIS можно абсолютно точно увидеть TCP SYN пакет. Я изменяю IP-адрес назначения пакета на 192.168.1.1 и порт назначения на 8000 , потому что я ожидаю, что пакет может быть перенаправлен на локальный TCP-сервер.

Затем я использую NdisFIndicateReceiveNetBufferLists() to для ввода NBL в принимающий путь вместо отправки его базовому драйверу минипорта.

Однако, похоже, что локальный TCP-сервер никогда не сможет получить перенаправленный SYN пакет. Я не знаю, что происходит не так. Кто-нибудь поможет мне или даст мне несколько советов?

Большое вам спасибо!

Ответ №1:

В общем, вы не можете взять NBL с одного пути (пути передачи) и просто перенести его на другой путь (путь приема). Вам нужно будет клонировать NBL и указать клон. Кроме того, вам придется отредактировать заголовки IP и TCP, чтобы исправить контрольные суммы.

Но прежде чем вы пойдете по этому пути, имейте в виду, что выноска WFP является более подходящим типом драйвера для этого проекта. Выноски WFP предназначены для работы на уровне 3 и уровне 4 сетевого стека, в то время как NDIS работает на уровне 2.