Blog (2)
Komentarze (1)
Recenzje (0)
@SysOpWinPCAP | Część pierwsza - Podstawy

WinPCAP | Część pierwsza - Podstawy

17.02.2013 22:47

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ł: [list] [item]Znajomość języka C lub C++, a najlepiej obu.[/item][item]Kompilatora gcc, preprocesora i linkera, czyli pakiet MinGW + konsola.[/item][item]Podstawowej wiedzy na temat sieci, ale zawsze możesz się douczyć na Wikipedii.[/item][item]Minimalnej znajomość języka Angielskiego..[/item][item]Windows.[/item][item]Zainstalowany pakiet WinPCAP. [/item][item] Paczka dla developerów. [/item][/list]

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!

Wybrane dla Ciebie
Komentarze (6)