Ethernet Adressfelder mittels WinPcap (gelöst)
-
Hallo zusammen,
wie mein Forumstatus zweifelsohne preisgeben wird, bin ich neu im Forum.
Ich habe gestern angefangen, mich mit WinPcap zu beschäfftigen. Ich habe von der Seite "http://www.winpcap.org/devel.htm" das developers Pack geladen und in Visual Studio 2008 ans laufen gebracht. Ich habe daraus den Beispielcode von "basic_dump_ex" so verändert, dass ich mir über den "pkt_data" Pointer den Inhalt des jeweiligen Packetes anzeigen lassen kann.Die Frage:
hat jemand einen Tip, wie ich auch an die Adressfelder des Ethernetframes komme?
Ich denke nicht, dass es die Struktur "pcap_pkthdr" ist, auf die der Pointer "header" zeigt. Dort ist neben der Länge und dem Zeitstempel noch eine 32 Bit Integer "caplen" (was bedeutet die?). Die Adressfelder sind ja jeweils 6 Bytes lang. Oder liegt es daran, dass WinPcap erst nach der MAC aufsetzt und diese felder deshalb bereits entfernt sind?Der geänderte Code:
#ifdef _MSC_VER /* * we do not want the warnings about the old deprecated and unsecure CRT functions * since these examples can be compiled under *nix as well */ #define _CRT_SECURE_NO_WARNINGS #endif #include "pcap.h" int main() { pcap_if_t *alldevs; pcap_if_t *d; int inum; int i=0; int i2=0; int top = 0; int colum = 0; pcap_t *adhandle; int res; char errbuf[PCAP_ERRBUF_SIZE]; struct tm *ltime; char timestr[16]; struct pcap_pkthdr *header; const u_char *pkt_data; time_t local_tv_sec; /* Retrieve the device list */ if(pcap_findalldevs(&alldevs, errbuf) == -1) { fprintf(stderr,"Error in pcap_findalldevs: %s\n", errbuf); return -1; } /* Print the list */ for(d=alldevs; d; d=d->next) { printf("%d. %s", ++i, d->name); if (d->description) printf(" (%s)\n", d->description); else printf(" (No description available)\n"); } if(i==0) { printf("\nNo interfaces found! Make sure WinPcap is installed.\n"); return -1; } printf("Enter the interface number (1-%d):",i); scanf("%d", &inum); if(inum < 1 || inum > i) { printf("\nInterface number out of range.\n"); /* Free the device list */ pcap_freealldevs(alldevs); return -1; } /* Jump to the selected adapter */ for(d=alldevs, i=0; i< inum-1 ;d=d->next, i++); /* Open the adapter */ if ((adhandle= pcap_open_live(d->name, // name of the device 65536, // portion of the packet to capture. // 65536 grants that the whole packet will be captured on all the MACs. 1, // promiscuous mode (nonzero means promiscuous) 1000, // read timeout errbuf // error buffer )) == NULL) { fprintf(stderr,"\nUnable to open the adapter. %s is not supported by WinPcap\n", d->name); /* Free the device list */ pcap_freealldevs(alldevs); return -1; } printf("\nlistening on %s...\n", d->description); /* At this point, we don't need any more the device list. Free it */ pcap_freealldevs(alldevs); /* Retrieve the packets */ while((res = pcap_next_ex( adhandle, &header, &pkt_data)) >= 0){ if(res == 0) /* Timeout elapsed */ continue; /* convert the timestamp to readable format */ printf ("\n"); printf ("\n"); local_tv_sec = header->ts.tv_sec; ltime=localtime(&local_tv_sec); strftime( timestr, sizeof timestr, "%H:%M:%S", ltime); printf("%s,%.6d len:%d\n", timestr, header->ts.tv_usec, header->len); printf ("\n"); colum = 0; //This for loop prints the content of the received Frame for (i2=0; i2 < (header->len); i2++){ colum++; if (pkt_data[i2] < 10){ printf (" %d", pkt_data[i2]); } else if (pkt_data[i2] < 100) { printf (" %d", pkt_data[i2]); } else { printf (" %d", pkt_data[i2]); } if (colum == 20){ printf ("\n"); colum = 0; } } printf ("\n"); } printf ("\n"); printf ("\n"); if(res == -1){ printf("Error reading the packets: %s\n", pcap_geterr(adhandle)); return -1; } pcap_close(adhandle); return 0; }
PS.: Ich hätte auch einen Screenshot agehängt, aber ich habe die Attechment Funktion nicht gefunden.
mfg,
jasson
-
@mich selbst
Ja Witz komm raus, ich hatte die Lösung die ganze Zeit vor der Nase. Der Datensatz auf den "pkt_data" zeigt, beinhaltet die Adressfelder. So viel dazu^^