Ein paar dumme Fragen zum Thema Sniffing :S

Hallo zusammen
ich habe jetzt mit libpcap einen kleinen Sniffer geschrieben (der Code funktioniert nicht richtig :S (gibt auch ne Warnmeldung aus)):
PHP:
int main(void) {
    char *dev;
    char err[PCAP_ERRBUF_SIZE];
    struct pcap_pkthdr head;
    u_char *pack;
    pcap_t *handle;
    int i;
    int j;

    if((dev = pcap_lookupdev(err)) == NULL) {
         error("pcap_lookupdev()");
    }
    if((handle = pcap_open_live(dev, BUFSIZ, 1, 10000, err)) == NULL) {
         error("pcap_open_live()");
    }
    for(i = 0; i < 10; i++) {
        pack = pcap_next(handle,&head);
        printf("GOT A PACKET [SIZE: %i]",head.len);
        dump(pack,head.len);
    }
    pcap_close(handle);
    exit(EXIT_SUCCESS);
}
und hier noch einmal die dumo funktion die ich benutze:
PHP:
void dump(const char *pack, int packsize) {
    int i, j = 0;

    for(i = 0; i < packsize; i++) {
       for(j = 0; j <= 16 ; j++) {
           printf("%x",pack[i*16+j]);
       }
       for(j = 0; j <= 16 ; j++) {
           if((pack[i*16+j] >= 33) && (pack[i*16+j] <= 126)) {
               printf("%c",pack[i*16 + j]);
           }
           else {
               printf(".");
           }
       }
       printf("\n");
    }
}

so meine Fragen sind eigentich eher dumme fragen weil w-lan nicht das gleiche wie ethernet ist -.-
also:
wenn ich jetzt den sniffer starte passiert nichts.
ich denke das liegt daran dass ich ethernet Packets sniffen möchte obwohl mein Netbook per W_Lan angeschlossen ist lige ich da richtig wenn ich denke dass das unter anderem desshalb nicht funktioniert?
meine zweite Frage ist was die warnung versucht mir zu sagen:
Code:
test.c: In Funktion »main«:
test.c:27: Warnung: Zuweisung streicht Qualifizierer von Zeiger-Zieltyp
<--- so ne Warnung hatte ich noch nie :S (wtf is ein Qualifizierer :S)

so das wars auch schon...
Hoffe auf Hilfe auch wenns dumme Fragen sind :)
mfg st4cky
 
Also erstmal was Grundsätzliches. Ich würde den Code so aufbauen:

Code:
[COLOR=#000000][COLOR=#007700]    if(([/COLOR][COLOR=#0000BB]dev [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]pcap_lookupdev[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]err[/COLOR][COLOR=#007700])) == [/COLOR][COLOR=#0000BB]NULL[/COLOR][COLOR=#007700])
         [/COLOR][COLOR=#0000BB]error[/COLOR][COLOR=#007700]([/COLOR][COLOR=#DD0000]"pcap_lookupdev()"[/COLOR][COLOR=#007700]); 
    else {
     
       if(([/COLOR][COLOR=#0000BB]handle [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]pcap_open_live[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]dev[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]BUFSIZ[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]1[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]10000[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]err[/COLOR][COLOR=#007700])) == [/COLOR][COLOR=#0000BB]NULL[/COLOR][COLOR=#007700]) 
            [/COLOR][COLOR=#0000BB]error[/COLOR][COLOR=#007700]([/COLOR][COLOR=#DD0000]"pcap_open_live()"[/COLOR][COLOR=#007700]); 
       else {
          for([/COLOR][COLOR=#0000BB]i [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]0[/COLOR][COLOR=#007700]; [/COLOR][COLOR=#0000BB]i [/COLOR][COLOR=#007700]< [/COLOR][COLOR=#0000BB]10[/COLOR][COLOR=#007700]; [/COLOR][COLOR=#0000BB]i[/COLOR][COLOR=#007700]++) { 
              [/COLOR][COLOR=#0000BB]pack [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]pcap_next[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]handle[/COLOR][COLOR=#007700],&[/COLOR][COLOR=#0000BB]head[/COLOR][COLOR=#007700]); 
              [/COLOR][COLOR=#0000BB]printf[/COLOR][COLOR=#007700]([/COLOR][COLOR=#DD0000]"GOT A PACKET [SIZE: %i]"[/COLOR][COLOR=#007700],[/COLOR][COLOR=#0000BB]head[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]len[/COLOR][COLOR=#007700]); 
              [/COLOR][COLOR=#0000BB]dump[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]pack[/COLOR][COLOR=#007700],[/COLOR][COLOR=#0000BB]head[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]len[/COLOR][COLOR=#007700]);
          }
          [/COLOR][COLOR=#0000BB]pcap_close[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]handle[/COLOR][COLOR=#007700]);[/COLOR][/COLOR]
[COLOR=#000000][COLOR=#007700]       }
[/COLOR][/COLOR][COLOR=#000000][COLOR=#007700]    }[/COLOR][/COLOR][COLOR=#000000][COLOR=#007700][/COLOR][/COLOR]
Warum? Wenn kein Device gefunden werden kann geht er in Deinem Code trotzdem alles andere durch. Gleiches gilt fürs Handle.

Was sagt denn Dein Debugger?


Die Fehlermeldung besagt, dass Du z.B. eine direkte Zuweisung auf einen generischen Zeiger machst - also z.B. einen Zeiger auf einen char direkt mit einem char belegst.

Gib mal die Zeile, bei der der Fehler kommt - leider hat die von Dir gepostete main ja nicht mal 27 Zeilen. ;)

Nachtrag: Ach so...für die genutzte Bibliothek ist es egal, was für ein Netzwerkadapter es ist - fürs System ist es einfach ein Ethernetadapter, das physikalisches Übertragungsmedium ist absolut uninteressant.
 
Zuletzt bearbeitet:
Nachtrag: Ach so...für die genutzte Bibliothek ist es egal, was für ein Netzwerkadapter es ist - fürs System ist es einfach ein Ethernetadapter, das physikalisches Übertragungsmedium ist absolut uninteressant.

Das Betriebssystem wäre hier schon interessant, im Bereich von WLAN monitor mode.
Unter Windows habe ich an einem Notebook hier auch noch weitere merkwürdige Sachen festgestellt: Über meinen WLAN Treiber hier, capture ich z.B. keine Pakete über den prom. mode. Wenn ich nicht über prom. mode sniffe, bekomme ich merkwürdiger weise die Menge der Pakete aus dem prom. mode.
 
PHP:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "st4ckys_header.h"

#include <pcap.h>

//////////////////////////////////////////////////////

int main(void) {
    char *dev;
    char err[PCAP_ERRBUF_SIZE];
    struct pcap_pkthdr head;
    u_char *pack;
    pcap_t *handle;
    int i;
    int j;

    if((dev = pcap_lookupdev(err)) == NULL) {
         error("pcap_lookupdev()");
    }
    if((handle = pcap_open_live(dev, BUFSIZ, 1, 10000, err)) == NULL) {
         error("pcap_open_live()");
    }
    for(i = 0; i < 10; i++) {
        pack = pcap_next(handle,&head);
        printf("GOT A PACKET [SIZE: %i]",head.len);
        dump(pack,head.len);
    }
    pcap_close(handle);
    exit(EXIT_SUCCESS);
}
<----- der sourcecode komplett sry ich dachte ich hätte alles gepostet :)

Also die Warnung heißt dass ich dem Zeiger nicht die Adresse von einem Wert übergeben habe sondern den Wert selber?

Warum muss ich den da immer ein else{} machen das Programm wird doch beendet wenn ein Fehler auftaucht oder?

Und es ist vollkommen egal ob ich per W-Lan, Ethernet, Token Ring oder was auch immer an das Netzwerk angebunden es wird einfach alles eingefangen?

Vielen Dank für die Hilfe !!!
:thumb_up::thumb_up::thumb_up::thumb_up::thumb_up::thumb_up::thumb_up::thumb_up::thumb_up::thumb_up::thumb_up::thumb_up::thumb_up::thumb_up:

PS: hier nochmal der Header:
HTML:
#include <stdio.h>

//////////////////////////////////////////////////////////////////////////////////
//prints a string on stderr and klls the programm:
void error(const char *str) {
    fprintf(stderr,"%s",str);
    exit(EXIT_FAILURE);
}

/////////////////////////////////////////////////////////////////////////////////
//dumps receved datagramms:
void dump(const char *pack, int packsize) {
    int i, j = 0;

    for(i = 0; i < packsize; i++) {
       for(j = 0; j <= 16 ; j++) {
           printf("%x",pack[i*16+j]);
       }
       for(j = 0; j <= 16 ; j++) {
           if((pack[i*16+j] >= 33) && (pack[i*16+j] <= 126)) {
               printf("%c",pack[i*16 + j]);
           }
           else {
               printf(".");
           }
       }
       printf("\n");
    }
}

/////////////////////////////////////////////////////////////////////////////////////

btw: was ist ein Karma???
 
probierst Du mal pcap_next_ex anstatt pcap_next ?

die Singatur ist im Übringen: pcap_next_ex(Handle, header , rdata);
 
ich habe es jetzt mit pcap_loop() gemacht.
Es kommen keine Fehler aber wenn ich eine Seite aufrufe (mit dem Browser)
werden auch keine Packts gedumpt woran kann das liegen?
hier der Source:
PHP:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "st4ckys_header.h"

#include <pcap.h>

//////////////////////////////////////////////////////

void print_pack(u_char *args, const struct pcap_pkthdr *header, const u_char *pack) {
    int i,j;
    for(i=0; i < (header->len); i++) {
        for(j=0; j<=15; j++) {
        printf("%x",pack[i*15+j]);
        }
        printf("  ||  ");
        for(j=0; j<=15; j++) {
            if((pack[i*15+j] >= 33) && (pack[i*15+j] <= 126)) {
                printf("%c",pack[i*15+j]);
            }
            else {
                printf(".");
            }
        }
        printf("\n");
    }
}
        

int main(void) {
    char *dev;
    pcap_t *handle;
    char err[PCAP_ERRBUF_SIZE];

    if((dev = pcap_lookupdev(err)) == NULL) {
        error("pcap_lookupdev()");
    }
    if((handle = pcap_open_live(dev,BUFSIZ,1,0,err)) == NULL) {
        error("pcap_open_live()");
    }
    printf("sniffing on: %s",dev);
    pcap_loop(handle, -1, print_pack, NULL);

    pcap_close(handle);
    exit(EXIT_SUCCESS);
}
mfg st4cky
 
hast Du denn nun pcap_next_ex probiert ? die callback Implementierung ist offenbar buggy, so meine Erfahrung.
 
sry für doppelpost aber wie zur hölle kann ich hier meinen thread editieren?

@topic ich denke nicht das es an der Callback funktion liegt denn ich hatte mit der pcap_next() funktion das gleiche Problem wie mit pcap_loop :S
(ich denke ich war einfach nur 2 mahl zu blöd für die selbe sache -.-)

mfg st4cky
 
bei der pcap_open_live implementierung zum schluss hast du den timeout
auf 0 gesetzt, da können keine Pakete kommen !
 
Zurück
Oben