WINPCAP, Win XP, Visual Studio 2008, Paketsniffer, Fehler!
-
Hallo, ersteinmal, was ich tun möchte.
Ich möchte unter WinXP mit dem Visual Studio 2008 Daten sniffen. Hardwaremäßig nutzte ich dazu einen Tap http://www.netoptics.com/products/network-taps/10100baset-tap. Davon wird nur einer der beiden Sniffer-Ports genutzt, da ich nur eh nur eine Richtung sehen will. Das ganze geht dann eben via Kabel in meinen PC. Dort will ich ein bestimmtes Protokoll mitschneiden, welches auf TCP/IP basiert. Den Inhalt des Protokolls will ich ebenso filtern und nur bestimmte Inhalte mitschneiden, den Rest einfach ignorieren.
Das ganze habe ich mit Wireshark getestet, dort sehe ich, was ich sehen will... da ich die Daten aber weiterverarbeiten möchte..
... habe ich mir die WINPCAP http://www.winpcap.org/ angeschaut. Diese sollte, nachdem was ich gelesen habe, all das können. Filtern auf einen best. Port und dort auf eben die ersten die x Byte wegfallen lassen (für ethernet-, ip-, usw.- Header) und dann auf das byte y vergleichen, ob das eine bestimmte Ziffernfolge hat und dann weiterverarbeiten, wenn nicht ignorieren. Nach Turorials sollte dies gehen.
Ich habe dann, da ich eben das Visual Studio 2008 nutzte, angefangen, wie hier http://www.codeproject.com/Articles/30234/Introduction-to-the-WinPcap-Networking-Libraries# vorzugehen, um alle libs und header usw. bekannt zu machen. Ebenso die wpcap.lib habe ich dem Projekt zugefügt. Um das ersteinmal alles zu testen, habe ich das erste Beispielprogramm auf der Seite versucht zu kompilieren. Dabei erhalte ich folgende Fehler:1>------ Erstellen gestartet: Projekt: WINPCAP, Konfiguration: Debug Win32 ------
1>Kompilieren...
1>WINPCAP.cpp
1>e:\fh\\programme\wpdpack\include\pcap\bpf.h(3) : error C2061: Syntaxfehler: Bezeichner '_TCHAR'
1>e:\fh\\programme\wpdpack\include\pcap\bpf.h(5) : error C2065: 'pcap_if_t': nichtdeklarierter Bezeichner
1>e:\fh\\programme\wpdpack\include\pcap\bpf.h(5) : error C2065: 'allAdapters': nichtdeklarierter Bezeichner
1>e:\fh\\programme\wpdpack\include\pcap\bpf.h(6) : error C2065: 'pcap_if_t': nichtdeklarierter Bezeichner
1>e:\fh\\programme\wpdpack\include\pcap\bpf.h(6) : error C2065: 'adapter': nichtdeklarierter Bezeichner
1>e:\fh\\programme\wpdpack\include\pcap\bpf.h(7) : error C2065: 'PCAP_ERRBUF_SIZE': nichtdeklarierter Bezeichner
1>e:\fh\\programme\wpdpack\include\pcap\bpf.h(10) : error C2065: 'PCAP_SRC_IF_STRING': nichtdeklarierter Bezeichner
1>e:\fh\\programme\wpdpack\include\pcap\bpf.h(11) : error C2065: 'allAdapters': nichtdeklarierter Bezeichner
1>e:\fh\\programme\wpdpack\include\pcap\bpf.h(10) : error C3861: "pcap_findalldevs_ex": Bezeichner wurde nicht gefunden.
1>e:\fh\\programme\wpdpack\include\pcap\bpf.h(19) : error C2065: 'allAdapters': nichtdeklarierter Bezeichner
1>e:\fh\\programme\wpdpack\include\pcap\bpf.h(27) : error C2065: 'adapter': nichtdeklarierter Bezeichner
1>e:\fh\\programme\wpdpack\include\pcap\bpf.h(27) : error C2065: 'allAdapters': nichtdeklarierter Bezeichner
1>e:\fh\\programme\wpdpack\include\pcap\bpf.h(27) : error C2065: 'adapter': nichtdeklarierter Bezeichner
1>e:\fh\programme\wpdpack\include\pcap\bpf.h(27) : error C2065: 'adapter': nichtdeklarierter Bezeichner
1>e:\fh\\programme\wpdpack\include\pcap\bpf.h(27) : error C2065: 'adapter': nichtdeklarierter Bezeichner
1>e:\fh\\programme\wpdpack\include\pcap\bpf.h(27) : error C2227: Links von "->next" muss sich ein Zeiger auf Klassen-/Struktur-/Union-/generischen Typ befinden.
1> Typ ist ''unknown-type''
1>e:\fh\\programme\wpdpack\include\pcap\bpf.h(29) : error C2065: 'adapter': nichtdeklarierter Bezeichner
1>e:\fh\\programme\wpdpack\include\pcap\bpf.h(29) : error C2227: Links von "->name" muss sich ein Zeiger auf Klassen-/Struktur-/Union-/generischen Typ befinden.
1> Typ ist ''unknown-type''
1>e:\fh\\programme\wpdpack\include\pcap\bpf.h(30) : error C2065: 'adapter': nichtdeklarierter Bezeichner
1>e:\fh\\programme\wpdpack\include\pcap\bpf.h(30) : error C2227: Links von "->description" muss sich ein Zeiger auf Klassen-/Struktur-/Union-/generischen Typ befinden.
1> Typ ist ''unknown-type''
1>e:\fh\\programme\wpdpack\include\pcap\bpf.h(36) : error C2065: 'allAdapters': nichtdeklarierter Bezeichner
1>e:\fh\\programme\wpdpack\include\pcap\bpf.h(36) : error C3861: "pcap_freealldevs": Bezeichner wurde nicht gefunden.
1>Das Buildprotokoll wurde unter "file://e:\FH\\selbst erstellte Software\SCIP-Logger\WINPCAP\WINPCAP\Debug\BuildLog.htm" gespeichert.
1>WINPCAP - 22 Fehler, 0 Warnung(en)
========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========Draus schließe ich eigendlich, dass eine .lib, ein Header oder eine .dll noch nicht bekannt sind. Finde aber nicht raus welche.
Hoffe mir kann jemand helfen!ANEMRKUNG:
Da mir hier leider bisher nicht geholfen werden konnte, ich aber langsam total ma verzweifeln bin, habe ich das Thema hier: http://www.coding-board.de/board/showthread.php?p=186391#post186391 nochmal gepostet!
-
_TCHAR -> tchar.h
pcap_if_t nud folgende -> Header von Pcap
-
Füge ich nur die tchar.h dazu, ändert sich gar nichts, wobei ja dann zumindest die eine Fehlermeldung verschwinden sollte.
Die header von Pcap habe ich sicher verwiesen, habe dann mal ausprobiert die Header lokal ins Projekt einzubinden, also nicht verwiesen, sondern alle direkt mit in das Projekt eingefügt, keine Änderung, auch nicht, als ich dann alle .libs lokal eingebunden habe...
Sitze jetzt seit heute früh um 8Uhr dran... bin völlig ratlos!
Habe grade nochmal alles neu erstellt, die Verzeichnisse nicht nur im Projekt, sondern auch unter Extras-->Optionen eingefügt, aber wieder die selben Fehler!
Dabei ist mir allerdings aufgefallen, dass sich alle Fehler nicht auf den Beispiel-Code beziehen, sondern auf die bpf.h, einer Headerdatei von winpcap...
-
Halbwegs Erledigt!
Zum Testen Visual Studio 2010 verwendet, da funktioniert es problemlos! Selbes Projekt in Visual Studio 2008 geöffnet, gleichen Fehler...
--> nutzt nun das 2010er
-
Ich wieder mal... ich bin einfach zu blöd... sitze nun seit Tagen davor.
Nun habe ich zwei Probleme:
1.Mein eingestellter Filter auf Port 5055 funktioniert nicht, es kommen trotzdem alle Packete an!2.weiß ich nicht weiter... ich möchte die ganzen Header ignorieren (also die ersten 62byte, 22byte ethernet header, je 20byte IP udn TCP Header) und alles was danach kommt in ein array schieben, wenn möglich je byte eine arrayspalte innerhalb des arrays.
Bin aber vollkommen planlos, wie ich damit anfangen soll... hoffe mir kann jemand helfen.
Mein bisheriger Code für die Auswahl der Netzwerkschnittstelle (Wichtig, da 3 NICs vorhanden) und dem nicht funktionierenden Filter, Infos dazu habe ich aus dem WinPcap Tutorial...
#include <pcap.h> #include <Tchar.h> #include <iostream> #include <stdio.h> #include <stdlib.h> #include <winsock2.h> using namespace std; //Ethernet Header typedef struct ether_header { unsigned char ether_dhost[6]; // destination unsigned char ether_shost[6]; // source unsigned short ether_type; }ETHHEADER,*PETHHEADER; //IPv4 Header typedef struct ip_header { unsigned char ver_ihl; // version unsigned char tos; // type of service unsigned short tlen; // total lenght unsigned short identification; unsigned short flags_fo; // Flags unsigned char ttl; // time to live unsigned char proto; // protocol unsigned char crc; // checksum u_char ip_src[4]; // source IP u_char ip_dst[4]; // destination IP }IPHEADER,*PIPHEADER; // TCP Header typedef struct tcp_header { WORD sourceport; // source port WORD destport; // destination port DWORD seqno; // sequenz number DWORD ackno; // acknowledge number BYTE hlen; // Header length BYTE flag; // flags WORD window; // window WORD chksum; // checksum WORD urgptr; // urgend pointer }TCPHEADER,*PTCPHEADER; int _tmain(int argc, _TCHAR* argv[]) { pcap_if_t * allAdapters; pcap_if_t * adapter; pcap_t * adapterHandle; struct pcap_pkthdr * packetHeader; const u_char * packetData; char errorBuffer[ PCAP_ERRBUF_SIZE ]; unsigned int netmask = 0xffffff; // netmask to recieve from all IPs char packet_filter[] = "tcp port 5055"; // Filter set to Port 5055 for SCIP struct bpf_program fcode; //-------------------------------------------------------------------------- // retrieve the adapters from the computer // you can choose which adapter you want to use // also Filter for Port 5055 (can be changed above) is set here, to keep traffic as low as possible if( pcap_findalldevs_ex( PCAP_SRC_IF_STRING, NULL, &allAdapters, errorBuffer ) == -1 ) { fprintf( stderr, "Error in pcap_findalldevs_ex function: %s\n", errorBuffer ); return -1; } // if there are no adapters, print an error if( allAdapters == NULL ) { printf( "\nNo adapters found! Make sure WinPcap is installed.\n" ); return 0; } // print the list of adapters along with basic information about an adapter int crtAdapter = 0; for( adapter = allAdapters; adapter != NULL; adapter = adapter->next) { printf( "\n%d.%s ", ++crtAdapter, adapter->name ); printf( "-- %s\n", adapter->description ); } printf( "\n" ); int adapterNumber; printf( "Enter the adapter number between 1 and %d:", crtAdapter ); scanf_s( "%d", &adapterNumber ); if( adapterNumber < 1 || adapterNumber > crtAdapter ) { printf( "\nAdapter number out of range.\n" ); // Free the adapter list pcap_freealldevs( allAdapters ); return -1; } // parse the list until we reach the desired adapter adapter = allAdapters; for( crtAdapter = 0; crtAdapter < adapterNumber - 1; crtAdapter++ ) adapter = adapter->next; // open the adapter with promiscous mode enabled adapterHandle = pcap_open( adapter->name, // name of the adapter 65536, // portion of the packet to capture // 65536 guarantees that the whole // packet will be captured PCAP_OPENFLAG_PROMISCUOUS, // promiscuous mode 1000, // read timeout - 1 millisecond NULL, // authentication on the remote machine errorBuffer // error buffer ); if( adapterHandle == NULL ) { fprintf( stderr, "\nUnable to open the adapter\n", adapter->name ); // compile the filter if (pcap_compile(adapterHandle, &fcode, packet_filter, 1, netmask) > 0) { cout<<endl<<"Unable to compile the packet filter. Check Syntax!"<<endl; pcap_freealldevs(allAdapters); return -1; } // setting the filter if (pcap_setfilter(adapterHandle, &fcode) > 0) { cout<<endl<<"Error setting filter!"<<endl; pcap_freealldevs(allAdapters); return -1; } // Free the adapter list pcap_freealldevs( allAdapters ); return -1; } printf( "\nCapture session started on adapter %s...\n", adapter->name ); // free the adapter list pcap_freealldevs( allAdapters ); //-------------------------------------------------------------------------- // setting a filter for Byte 0x1300 and 0x1010 after TCP Header //-------------------------------------------------------------------------- // this is the most important part of the application // here we start receiving packet traffic // then save information inside the packet into array int retValue; while( ( retValue = pcap_next_ex( adapterHandle, &packetHeader, &packetData ) ) >= 0 ) { // timeout elapsed if we reach this point if( retValue == 0 ) continue; // Just for testing printf( "length of packet: %d\n", packetHeader ); printf( "data of packet: %x\n", packetData ); // saving data to array } // if we get here, there was an error reading the packets if( retValue == -1 ) { printf( "Error reading the packets: %s\n", pcap_geterr( adapterHandle ) ); return -1; } system( "PAUSE" ); return 0; }
-
Filtern auf einen best. Port und dort auf eben die ersten die x Byte wegfallen lassen (für ethernet-, ip-, usw.- Header)
Dazu musst du aber erstmal wissen dass das Paket überhaupt IP und TCP oder UDP ist! Das heisst du must es bereits ein minimum analysiert haben. In einem normalen Netzwerk springen da noch ganz andere Sachen rum.
Dann kommt noch die Problematik mit mehreren NICs, eventuellen VLAN-Headern (802.1Q), IP-Defragmentierung (reassembly) und und und ...Warum das Rad neu erfinden und dabei sicher was wichtiges übersehen?
Deshalb der Vorschlag: Geh doch den umgekehrten Weg und fang mit dem funktionierenden Wireshark an.
Wireshark ist Open-source! (Ich selbst bin Contributor)
Bau dort einfach deine eigene Funktionalität ein.
Über die wireshark-dev Mailingliste steht Dir sehr schnelle und kompetente Hilfe bereit.
-
Wireshark kenne ich, habe ich auch genutzt. Das da viel mehr rumschwirrt weiß ich, deswegen ja der Filter auf den Port. In Wireshark funktioniert das, warum mit der Winpcap nicht? Gibt ja recht viele, die so etwas damit gemacht haben. Und ich will das Rad (Wireshark) nicht neu erfinden, sondrn nur Teile des Rades nutzen. Ich will nur das Datenfeld des TCP Packets in einem array haben! Nicht in einer Datei, nicht sonst wo, nur in einem array, dass muss doch möglich sein? Denn die Daten werden danach noch codiert und in eine Datenbank geschrieben, was schon alles funktioniert.
Und IP-Fragmentierung ist dort nicht vorhanden! Kein normales Netzwerk, sondern zwischen 2 Steuerungen.
Die Problematik der mehrer NICS umgehe ich ja mit der Auswahl, die auch schon funktioniert.
Muss eben nur noch chekcen, wie ich dan das Datenfeld komme... gib ja zich Beispiele, aber ich raffs grade noch nicht.