Strona używa cookies (ciasteczek). Dowiedz się więcej o celu ich używania i zmianach ustawień. Korzystając ze strony wyrażasz zgodę na używanie cookies, zgodnie z aktualnymi ustawieniami przeglądarki.    X

WinPCAP | Część pierwsza - Podstawy

Siłą rzeczy musiało to nadejść, od dawna przymierzałem się do pisania bloga. Czemu? Od pewnego czasu zauważyłem u siebie spadek motywacji do uczenia się kolejnych języków programowania i bibliotek (wypalenie?). Ubzdurałem sobie, że jeśli zmuszę się do pisania kursów to siłą rzeczy będę musiał uczyć się, aby nie wprowadzić czytelnika w błąd. Argument jest paradoksalny, ale skoro to czytasz to spełnił swoje założenie. Dosyć tego gadania! Bierzemy się do nauki.

Co będziesz potrzebował:

  • Znajomość języka C lub C++, a najlepiej obu.
  • Kompilatora gcc, preprocesora i linkera, czyli pakiet MinGW + konsola.
  • Podstawowej wiedzy na temat sieci, ale zawsze możesz się douczyć na Wikipedii.
  • Minimalnej znajomość języka Angielskiego..
  • Windows.
  • Zainstalowany pakiet WinPCAP.
  • Paczka dla developerów.

Oczywiście jeśli kursy będą kontynuowane to nauczymy się czegoś nieco ciekawszego: ARP Spoofing na lokalu + wysyłka do twojej bazy MySQL w piwnicy.

WinPCAP to skrót od: Windows Packet Capture. Biblioteka umożliwia niskopoziomową zabawę z pakietami w przeciwieństwie do WinSocka. Możemy łapać każdy pakiet przychodzący jak i wychodzący od naszego urządzenia sieciowego, analizować zawierane w sobie dane, jak i wysyłać surowe pakiety. Programy pisane pod WinPcapa w dużej mierze to wszelkiej maści sniffery i analizatory.

Zacznij od zainstalowania WinPcapa, czyli odpal exe i wciskaj dalej, .. i dalej.
Jak już to zrobisz to wejdź do katalogu MinGW i przenieś zawartość paczki WinPcapa dla developerów. Czyli zawartość Lib do lib, zawartość include do include. Następnie zrób sobie miejsce na projekty. W moim przypadku to: D:\Works\C\WinPcap\ Możesz się jeszcze pokusić o zrobienie podfolderów, na przykład: 001-Basics. Utwórz teraz plik z rozszerzeniem .c i odpal go notatnikiem, albo czymkolwiek innym.

Kod źródłowy częściowo tłumaczę w komentarzach, na razie postaraj się go przepisać.

/* Kod źródłowy jest wykonany * przez zespół tworzący dokumentację * WinPCAP z niewielkimi modyfikacjami od SysOp * Pierowtne źródło: http://www.winpcap.org/docs/docs_40_2/html/group__wpcap__tut1.html */ #define HAVE_REMOTE /* Musimy to zdefiniować, inaczej nie będziemy * mogli korzystać z pewnych „ułatwień” i funkcji */ #include <pcap.h> #include <stdio.h> int main() { pcap_if_t* Devices = NULL; char ErrorHandler[PCAP_ERRBUF_SIZE] = ""; if (-1 == pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &Devices, ErrorHandler)) { fprintf(stderr, "pcap_findalldevs_ex error: %s", ErrorHandler); return -1; } int Counter = 1; do { /* Wykonujemy pętle dopóki Devices->next zawiera wartość nie zerową * Prościej: wypisujemy wszystkie urządzenia dostępne lokalnie */ printf("%i#: \n", Counter); printf(" %s: \n", Devices->name); printf(" %s: \n", Devices->description); Counter++; } while (NULL != (Devices = Devices->next)); pcap_freealldevs(Devices); /* Dealokujemy pamięć zawartą w Devices, zerujemy wskaźniki */ return 0; }

[Linia 15]Buffer, do którego wpisywany jest błąd, zazwyczaj jest bardzo dobrze opisany. Komunikat o błędzie potrafi zwrócić większość funkcji. PCAP_ERRBUF_SIZE wynosi 256 bajtów.

[Linia 17] pcap_findalldevs_ex służy do wczytania listy wsystkich urządzeń wraz z ich nazwą, opisem etc
Prototyp: int pcap_findalldevs_ex(char *source, struct pcap_rmtauth *auth, pcap_if_t **alldevs, char *errbuf);

Pierwszy argument precyzuje skąd pobrać listę urządzeń. Pod tą małomówną nazwą kryje się następujący ciąg znaków: "rpcap://" oznacza: remote packet capture. Zapytasz: Jak remote, skoro chce pobrać informację o moich urządzeniach? Domyślnie, jeśli nic nie wpiszemy po '//' niejawnie jest tam podawane "localhost", czyli to otwiera nam furtkę do podawania dowolnego ip rpcap://host:port[/]i W drugim argumencie podajemy wskaźnik na strukturę, która
opisuje dane logowania (login, hasło) oraz typ uwierzytelnienia. Ty nie logujesz się na zdalne urządzenie, więc dajesz NULL. Kolejny argument to wskaźnik na strukturę pcap_if_t, która będzie
przechowywać informację o urządzeniach. No i ostatni: buffer na komunikat o błędzie. Funkcja zwraca -1 w przypadku błędu. Sam błąd najczęściej spowodowany jest brakiem sprecyzowania źródła, czyli tego pierwszego argumentu.

Powyższy program kompilujemy poleceniem:
gcc wejscie.c -o wyjscie.exe -l wpcap

Co ciekawe, WinPcap automatycznie linkuje też WinSocka. Jeśli masz jakieś błędy, to poinformuj mnie w komentarzach, postaram się je rozwiązać. Jednak przed napisaniem sprawdź czy przerzuciłeś zawartość lib i include z paczki dla developerów do folderów lib i include w MinGW i zainstalowałeś WinPcap.

To na razie tyle jeśli chodzi o podstawy. Mam nadzieje, że ktoś z tego skorzysta.
W następnej części zajmiemy się łapaniem pakietów i wyświetlaniem ich zawartości w postaci surowej.
Serwus!

 

windows oprogramowanie programowanie

Komentarze

0 nowych
DjLeo MODERATOR BLOGA  17 #1 18.02.2013 00:13

Oby CI motywacji nie zabrakło. Witamy na blogu DP ;)

  #2 18.02.2013 18:52

Nie rozumiem dlaczego napisałeś: "Znajomość języka C lub C++, a najlepiej obu". Kod, który przedstawiłeś to czyste C. Absolutnie zero tam jest funkcjonalności C++.

prap   3 #3 19.02.2013 07:59

Będzie trudniej, ale w C też można pisać obiektowo.

prap   3 #4 19.02.2013 09:45

Co nie znaczy, że nie można pisać w nim obiektowo (patrz GTK albo Glib).

Autor edytował komentarz.
SysOp   2 #5 19.02.2013 13:43

Pisałem, że dobrze by było gdyby czytelnik znał C++ tak "na zapas". Na razie go nie wykorzystuje, ale jak dojdziemy do bardziej zaawansowanych rzeczy to pojawi się wiele struktur, które wygodniej jest przedstawiać jako obiekty.

roobal   14 #6 24.02.2013 20:51

"Od pewnego czasu zauważyłem u siebie spadek motywacji do uczenia się kolejnych języków programowania i bibliotek (wypalenie?). Ubzdurałem sobie, że jeśli zmuszę się do pisania kursów to siłą rzeczy będę musiał uczyć się, aby nie wprowadzić czytelnika w błąd."

Zawsze można dodatkowo udzielać pomocy na forach, to też motywuje do nauki ;)