Jaka jest procedura odbierania i przetwarzania pakietów Wireshark na komputerze z systemem Windows?


20

Mam zamiar użyć Wireshark do monitorowania ruchu na moim komputerze z systemem Windows . Pracując nad tym, zastanawiałem się, jak Wireshark zdoła złapać pakiety sieciowe niskiego poziomu, zanim zrobi to Windows .

Przede wszystkim interfejs sieciowy mojej karty sieciowej odbiera pakiet. Następnie karta sieciowa wykonuje kilka wstępnych kontroli (CRC, prawy adres MAC, ... itd.). Zakładając, że weryfikacja się powiodła, karta sieciowa przekazuje pakiet. Ale jak i gdzie?

Rozumiem, że sterowniki to klej między kartą sieciową a systemem operacyjnym lub inną aplikacją. Sądzę też, że istnieje osobny sterownik dla Windows i Wireshark ( WinPcap ?). W przeciwnym razie Wireshark nie byłby w stanie odbierać ramek Ethernet . Czy istnieją jednocześnie dwa lub więcej sterowników karty sieciowej? Skąd NIC wie, którego użyć?


Twoje założenie jest nieprawidłowe. Karta sieciowa zawsze przekazuje pakiet do systemu Windows (w szczególności do sterownika urządzenia, a następnie stosu sieciowego), a system Windows decyduje, co z nim zrobić. System Windows ma funkcję, w której program może poprosić o otrzymanie kopii pakietów „tak, jak było w sieci”, być może stosując filtr, a Wireshark korzysta z tej funkcji. Wireshark nie omija systemu Windows.
zwolnienie

(Istnieją eksperymentalne systemy operacyjne, które próbują lepiej wykonywać wyjątkowo szybkie sieci, pozwalając na dostarczanie pakietów bezpośrednio z karty sieciowej do aplikacji, ale AFAIK Windows nie może tego zrobić: zawsze przynajmniej przechodzisz przez warstwę NDIS.)
zwolnienie,

Odpowiedzi:


38

Model we / wy w systemie Windows opiera się na stosie składników. Dane muszą przepływać przez różne składniki tego stosu, który istnieje między fizyczną kartą sieciową a aplikacją, która je wykorzysta. Czasami te różne składniki sprawdzają dane (na przykład pakiet TCP), gdy przepływają one przez stos, i na podstawie zawartości tego pakietu dane mogą zostać zmienione lub pakiet może zostać całkowicie odrzucony.

Stos sieciowy

Jest to uproszczony model „stosu sieciowego”, przez który przepływa pakiet, aby dostać się z aplikacji do drutu i odwrotnie.

Jednym z najciekawszych elementów pokazanych na powyższym zrzucie ekranu jest interfejs API objaśnienia WFP (Windows Filtering Platform). Jeśli to przybliżymy, może wyglądać mniej więcej tak:

Platforma filtrowania systemu Windows

Deweloperzy mogą swobodnie podłączać własne moduły do ​​odpowiednich miejsc na tym stosie. Na przykład produkty antywirusowe zwykle używają „sterownika filtra”, który podłącza się do tego modelu i sprawdza ruch w sieci lub zapewnia funkcje zapory. Usługa Zapory systemu Windows oczywiście również pasuje do tego modelu.

Jeśli chcesz napisać aplikację, która rejestruje ruch sieciowy, taką jak Wireshark, odpowiednim sposobem na to byłoby użycie własnego sterownika i włożenie go do stosu tak nisko, jak to możliwe, aby mógł wykryć pakiety sieciowe zanim moduł zapory sieciowej będzie mógł je upuścić.

W proces ten zaangażowanych jest wielu „kierowców”. Wiele różnych typów sterowników. Również inne formy wejścia / wyjścia w systemie, takie jak odczyt i zapis na dysku twardym, są bardzo podobne.

Jeszcze jedna uwaga - objaśnienia WFP to nie jedyny sposób na wejście w stos sieciowy. Przykładowo WinPCap łączy się z NDIS bezpośrednio ze sterownikiem, co oznacza, że ​​ma on możliwość przechwycenia ruchu, zanim w ogóle nastąpi filtrowanie.

Sterowniki NDIS

WinPCap

Bibliografia:

Stos TCP / IP nowej generacji w systemie Vista +

Architektura platformy filtrowania systemu Windows


3
Wyjątkowe diagramy. Czy są one gdzieś opublikowane na microsoft.com? Jeśli tak, chciałbym się rozejrzeć i zobaczyć, jakie inne informacje są dostępne obok nich.
EEAA

1
Idealna odpowiedź. Dobrze i łatwo wyjaśnione, zapewniona niesamowita wizualizacja i źródła! Dziękuję bardzo!
Hansi

1
+1, warto wspomnieć, że na WFP znajduje się sterownik open source, który sprawia, że ​​pisanie takich aplikacji o nazwie WinDivert jest banalne . Napisałem dla niego również opakowanie .NET .

1
Kiedyś istniało coś, co nazywało się „Layered Service Provider” - gdzie można przechwytywać i przepisywać pakiety - czy jest jakaś alternatywa dla tej zdolności? Czy jest to część interfejsu API „filtrującego”? (Och, czekaj, nieważne: właśnie spojrzałem na link WinDivert z @TechnikEmpire i przekonałem się, że to możliwe.)
davidbak,

1
@davidbak tak, WinDivert jest rodzajem hybrydy. Interfejsy API sterowników wywołań są przeznaczone dla programistów do budowania określonych sterowników, które mogą zrobić wszystko poza zwykłym upuszczeniem pakietu (nie wymaga sterownika). WinDivert jest takim sterownikiem, ale ma charakter ogólny, zapewniając pełny dostęp do pakietów poprzez wypychanie i wyrzucanie pakietów do iz jądra i przestrzeni trybu użytkownika.

3

Jak mówi odpowiedź Ryana Riesa:

Przykładowo WinPCap łączy się z NDIS bezpośrednio ze sterownikiem, co oznacza, że ​​ma on możliwość przechwycenia ruchu, zanim w ogóle nastąpi filtrowanie.

i to jest opis, jak to działa w dokumentacji WinPcap .


Byłoby to lepsze jako odpowiedź na odpowiedź Ryana. Nie jest to odpowiedź sama w sobie.
Lekkość ściga się z Moniką

2
Właściwie, tak, to jest odpowiedź na jego pytanie - bardziej niż odpowiedź Ryana. Pytanie brzmiało: „jak to robi Wireshark”; Odpowiedź Ryana daje dużo informacji na temat mechanizmu, który WinPcap (czego używa Wireshark) nie wykorzystać, więc to na pewno interesująca, ale nie odnosi się do pierwotnego pytania. Link, który zamieściłem, opisuje, w jaki sposób robi to WinPcap , co jest istotne dla pierwotnego pytania.

7
Może gdybyś zacytował i wyjaśnił odpowiednie fragmenty z zasobu strony trzeciej. Jeśli nic więcej, odpowiedź tylko link nie jest odpowiedzią. To jest polityka SE. Cała twoja odpowiedź dodaje do tej strony jest dosłownie: „istnieje opis, jak odpowiedź Ries działa gdzie indziej w Internecie”
Lightness Races z Monicą
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.