Какова процедура приема и обработки пакетов Wireshark на компьютере с Windows?

20

Я собираюсь использовать Wireshark для мониторинга трафика на моем компьютере с Windows . Во время работы над ним мне было интересно, как Wireshark удается перехватывать сетевые пакеты низкого уровня до того, как это делает Windows .

Прежде всего, сетевой интерфейс моей сетевой карты получает пакет. Затем NIC выполняет некоторые начальные проверки (CRC, правильный MAC-адрес и т. Д.). Предполагая, что проверка прошла успешно, NIC пересылает пакет. Но как и где?

Я понимаю, что драйверы являются связующим звеном между NIC и ОС или любым другим приложением. Я также предполагаю, что есть отдельный драйвер для Windows и Wireshark ( WinPcap ?). В противном случае Wireshark не сможет принимать кадры Ethernet . Существуют ли два или более драйверов NIC одновременно? Как NIC узнает, какой использовать?

Ханси
источник
Ваша предпосылка неверна. Сетевая карта всегда передает пакет Windows (в частности, драйверу устройства, а затем сетевому стеку), и Windows должна решить, что с ним делать. В Windows есть функция, с помощью которой программа может запрашивать получение пакетов «как они были в сети», возможно, применяя фильтр, и Wireshark использует эту функцию. Wireshark не обходит Windows.
zwol
(Существуют экспериментальные операционные системы, которые пытаются создать чрезвычайно высокоскоростную сеть, позволяя доставлять пакеты напрямую с сетевой карты в приложение, но AFAIK Windows не может этого сделать: вы всегда по крайней мере проходите уровень NDIS.)
zwol

Ответы:

38

Модель ввода / вывода в Windows основана на стеке компонентов. Данные должны проходить через различные компоненты этого стека, который существует между физической сетевой картой и приложением, которое будет использовать данные. Иногда эти различные компоненты проверяют данные (например, пакет TCP), когда они проходят через стек, и на основе содержимого этого пакета данные могут быть изменены или пакет может быть полностью отброшен.

Сетевой стек

Это упрощенная модель «сетевого стека», через который проходят пакеты, чтобы попасть из приложения в проводную сеть и наоборот.

Одним из наиболее интересных компонентов, показанных на снимке экрана выше, является API-интерфейс WFP (Windows Filtering Platform). Если мы увеличим масштаб, это может выглядеть примерно так:

Платформа фильтрации Windows

Разработчики могут свободно вставлять свои собственные модули в соответствующие места в этом стеке. Например, антивирусные продукты обычно используют «драйвер фильтра», который подключается к этой модели и проверяет сетевой трафик или предоставляет возможности брандмауэра. Служба брандмауэра Windows также явно вписывается в эту модель.

Если вы хотите написать приложение, которое записывает сетевой трафик, такой как Wireshark, то соответствующим способом будет использовать собственный драйвер и вставить его в стек как можно ниже, чтобы он мог обнаруживать сетевые пакеты. до того, как у вашего модуля брандмауэра есть шанс отбросить их.

Таким образом, есть много «драйверов», вовлеченных в этот процесс. Много разных типов драйверов тоже. Кроме того, другие формы ввода / вывода в системе, такие как чтение и запись на жестком диске, следуют очень похожим моделям.

Еще одно замечание - выноски WFP - не единственный способ проникнуть в сетевой стек. Например, WinPCap взаимодействует с NDIS напрямую с драйвером, что означает, что у него есть шанс перехватить трафик, прежде чем вообще будет выполнена фильтрация.

Драйверы NDIS

WinPCap

Ссылки:

Стек TCP / IP следующего поколения в Vista +

Архитектура платформы фильтрации Windows

Райан Райс
источник
3
Выдающиеся диаграммы. Они размещены где-нибудь на microsoft.com? Если это так, я хотел бы покопаться и посмотреть, какая другая информация доступна вместе с ними.
EEAA
1
Идеальный ответ. Хорошо и легко объяснимо, отличная визуализация и предоставленные источники! Спасибо большое!
Ханси
1
+1, стоит упомянуть, что на WFP встроен драйвер с открытым исходным кодом, который упрощает написание таких приложений под названием WinDivert . Я также написал для него .NET-оболочку .
1
Раньше было то, что было что-то под названием «Многоуровневый поставщик услуг» - где вы могли перехватывать и переписывать пакеты - есть ли какая-то замена для этой способности? Является ли это частью «фильтрующего» API? (Ой, подождите, не берите в голову: я только что посмотрел на ссылку WinDivert от @TechnikEmpire и увидел, что это возможно.)
davidbak
1
@ davidbak Да, WinDivert - это своего рода гибрид. API драйвера выноски предназначены для разработчиков, чтобы создавать конкретные драйверы, которые могут делать что угодно, кроме простого отбрасывания пакета (не требует драйвера). WinDivert - это такой драйвер, но он универсален, предоставляя полный доступ к пакетам, выталкивая и выталкивая пакеты в ядро ​​и пространство пользовательского режима.
3

Как говорит Райан Райс:

Например, WinPCap взаимодействует с NDIS напрямую с драйвером, что означает, что у него есть шанс перехватить трафик, прежде чем вообще будет выполнена фильтрация.

и это описание в документации WinPcap, как это работает .


источник
Это было бы лучше в качестве редактирования ответа Райана. Это не ответ сам по себе.
Легкость гонки с Моникой
2
На самом деле, да, это является ответом на его вопрос - больше, чем ответ Райана. Вопрос был «как это делает Wireshark»; Ответ Райана дает много информации о механизме, который WinPcap (который использует Wireshark) не использует, поэтому он, безусловно, интересен, но не имеет отношения к исходному вопросу. Ссылку я отправил описывает , как WinPcap это делает, что это отношение к первоначальному вопросу.
7
Возможно, если бы вы процитировали и объяснили соответствующие отрывки из стороннего ресурса. Если ничего, ответ только на ссылку не является ответом. Это политика SE. Все, что ваш ответ добавляет к этой странице, буквально, «есть описание того, как ответ Риса работает где-то еще в Интернете»
Легкость Гонки с Моникой