Яка процедура отримання та обробки пакету Wireshark на машині Windows?


20

Я збираюся використовувати Wireshark для моніторингу трафіку на моєму комп'ютері Windows . Працюючи над цим, мені було цікаво, як Wireshark вдається вловлювати мережеві пакети низького рівня, перш ніж це зробить Windows .

Перш за все, мережевий інтерфейс на мій NIC отримує пакет. Потім NIC виконує деякі початкові перевірки (CRC, права MAC-адреса, ... тощо). Припускаючи, що перевірка пройшла успішно, NIC пересилає пакет. Але як і де?

Я розумію, що драйвери - це клей між NIC та ОС або будь-яким іншим додатком. Далі я здогадуюсь, що існує окремий драйвер для Windows та Wireshark ( WinPcap ?). В іншому випадку Wireshark не зможе отримувати кадри Ethernet . Чи існують одночасно два або більше драйверів NIC? Як NIC знає, який з них використовувати?


Ваше приміщення неправильне. NIC завжди передає пакет в Windows (зокрема, драйверу пристрою, а потім мережевому стеку), і Windows повинен вирішити, що з ним робити. У Windows є функція, де програма може попросити отримати копії пакетів "як вони були на дроті", можливо, застосувавши фільтр, і Wireshark використовує цю функцію. Wireshark не обходить Windows.
zwol

(Існують експериментальні операційні системи, які намагаються покращити швидкісну мережу краще, дозволяючи доставляти пакети безпосередньо з мережевої карти в додаток, але AFAIK Windows не може цього зробити. Ви завжди хоча б проходите через рівень NDIS.)
zwol

Відповіді:


38

Модель вводу / виводу в Windows заснована на купі компонентів. Дані повинні протікати через різні компоненти того стека, який існує між фізичною мережевою картою та програмою, яка споживатиме дані. Іноді ці різні компоненти перевіряють дані (наприклад, пакет TCP), коли вони проходять через стек, і на основі вмісту цього пакету дані можуть бути змінені, або пакет може бути повністю відкинутий.

Мережевий стек

Це спрощена модель "мережевого стека", через який проходять пакети, щоб потрапити з програми на провід і навпаки.

Один з найцікавіших компонентів, показаних на скріншоті вище, - API WFP (Windows Filtering Platform) Callout. Якщо ми збільшили масштаб на це, це може виглядати приблизно так:

Платформа фільтрації 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. Уся ваша відповідь додається на цю сторінку, буквально, "є опис того, як працює відповідь Риес деінде в Інтернеті"
Гонки легкості з Монікою
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.