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^^


Anmelden zum Antworten