Wlan-Frames mit pcap-Lib
-
Hallo ich habe ein ähnliches Problem wie aus dem vorletzten Thread.
Nur möchte ich mit der Wlan-Frames abgrasen.
Dazu das erste Problem:
In meiner Hauptroutine habe ich folgende Abfrage:if (pcap_datalink(handle) != DLT_EN10MB) { perror("is not an Ethernet\n"); exit(EXIT_FAILURE); }
Das Interface das ich "capture" ist ath0 auf meinem Notebook, also ein Atheros-Madwifi-Interface, also Wlan. Und auf meinem Router ist das wl0, auch ein Wlan-Interface, ein Broadcom (ein WRT-Router).
Dann wenn ich nun diese Abfrage hinzufüge:if (pcap_datalink(handle) != DLT_IEEE802_11) { perror("is not an WLAN\n"); exit(EXIT_FAILURE); }
bricht das Programm mit der Fehlermeldung ab. Überwache ich jetzt doch Ethernet-Frames? Kann mir jemand das mal erklären
Als nächstes habe ich die Funktion zum Empfang der aufgefangenen Packete:
void packet_received(u_char *args, const struct pcap_pkthdr *header, const u_char *packet) { char insertvalues[256]; memset (insertvalues, 0x0, 256 ); struct ieee_802_11_header *wptr; /* net/802_11.h */ if( ( wptr = calloc(1, sizeof(struct ieee_802_11_header)) ) == NULL ) { perror ("Fehler beim Reservieren des Speichers fuer die 802_11-Struktur\n"); exit(EXIT_FAILURE); } wptr = (struct ieee_802_11_header *) packet; snprintf(insertvalues,255, "Source MAC-Adresse: %s",ether_ntoa((struct ether_addr*)(wptr->mac1))); printf("%s\n", insertvalues); }
Also ich bin wie man sieht wirklich erst mal an den Phy-Frames interessiert, nicht an den Nutzdaten. Ich möchte die MAC-Adressen der am Netzwerk beteiligten NIC rauslesen, erst mal. Aber das funktioniert nicht, denn ich bekomme stets nur ein Teil z.B. meiner MAC-Adresse dargestellt.
Wenn meine MAC-Adresse z.B.: 00:02:2d:38:c7:cb wäre, dann bekomme ich als Ausgabe: ff:ff:0:2:2d:38. Es wird also etwas verschoben. <Pust/>Ich sollte vielleicht noch erklären, woher ich die structur ieee_802_11_header her habe. Aus dem Internet kann man sie erg***ln
struct ieee_802_11_header { u16 frame_control;// needs to be subtyped u16 duration; u8 mac1[6]; u8 mac2[6]; u8 mac3[6]; u16 SeqCtl; u8 mac4[6]; u16 gapLen; u8 gap[8]; };
Ich habe daraus das gemacht:
struct ieee_802_11_header { __u16 frame_control; __u16 duration; __u8 mac1[6]; __u8 mac2[6]; __u8 mac3[6]; __u16 SeqCtl; __u8 mac4[6]; __u16 gapLen; __u8 gap[8]; };
da meine asm/types keine u16, u8 kennt.
Hat da irgend jemand eine Idee? Ich versuche es jetzt wirklich mal mit Ethernet-Frames.
Gruss Christian
-
Also ich kenn mich jetzt mit WLan Paketen oder dieser pcap-Lib nicht aus, aber könnte es sein, dass deine "ieee_802_11_header" Struktur nicht 13 Bytes groß ist? Lass dir mal ein sizeof() ausgeben.
1 und 2 Byte große Typen werden oft in 4 Byte (auf 32 Bit-Maschinen) gepackt. Häng doch mal "__attribute__ ((packed))" (für gcc) hinter die Struktur, sollte bei diesem Problem helfen...
-
Tobias W schrieb:
Also ich kenn mich jetzt mit WLan Paketen oder dieser pcap-Lib nicht aus, aber könnte es sein, dass deine "ieee_802_11_header" Struktur nicht 13 Bytes groß ist? Lass dir mal ein sizeof() ausgeben.
Also ich habe mal dies hier hinzugefügt:
printf ("Align: %d\n", __alignof__(wptr->mac1) ); printf ("Align: %d\n", __alignof__(wptr->mac1[0]) ); printf ("Align: %d\n", __alignof__(wptr->frame_control) ); printf ("Groesse: %d\n", sizeof ( struct ieee_802_11_header ) );
und bekomme hier ein:
Align: 1
Align: 1
Align: 1
Groesse: 40 als Antwort. Also deutlich grösser als 13 Byte. Padding? Aber wozu?Tobias W schrieb:
1 und 2 Byte große Typen werden oft in 4 Byte (auf 32 Bit-Maschinen) gepackt. Häng doch mal "__attribute__ ((packed))" (für gcc) hinter die Struktur, sollte bei diesem Problem helfen...
Die sieht jetzt folgendermaßen aus:
struct ieee_802_11_header { __u16 frame_control; __u16 duration; __u8 mac1[6]; __u8 mac2[6]; __u8 mac3[6]; __u16 SeqCtl; __u8 mac4[6]; __u16 gapLen; __u8 gap[8]; }__attribute__ ((packed));
Das Problem bleibt jedoch. Wenn ich es richtig gemacht habe?
Gruss Christian
-
Argh, ich depp: 40 Byte sind natürlich korrekt! Ich habe die Felder übersehen, und deswegen nur 13 Byte gezählt. Also ist die Größe deiner Struktur schonmal richtig.
Zwar werden MAC Adressen nicht wie Integer dargestellt, aber könnte trotzdem ein Little-Big-Endian Problem vorliegen? Ok, da es sich hier um verschobene Werte handelt doch eher weniger...
Eventuell hast du auch ein Problem bei der Zuweisung von wptr. Vielleicht hilft hier memcpy...
Aber das sind nur wilde Spekulationen, also nicht unbedingt eine große Hilfe
-
probier mal so:
void packet_received(u_char *args, const struct pcap_pkthdr *header, const u_char *packet) { printf ("%02x:%02x:%02x:%02x:%02x:%02x\n", packet[4],packet[5],packet[6],packet[7],packet[8],packet[9]); }
um 'mac1' auszugeben.
-
phy-freak schrieb:
probier mal so:
void packet_received(u_char *args, const struct pcap_pkthdr *header, const u_char *packet) { printf ("%02x:%02x:%02x:%02x:%02x:%02x\n", packet[4],packet[5],packet[6],packet[7],packet[8],packet[9]); }
um 'mac1' auszugeben.
Da kommt nur "ff:ff:00:02:2d:38" raus. Also zwei voll gefüllte Bytes und dann der Rest gefüllt mit meiner MAC-Adresse. Aber die letzten beiden Felder fehlen.
Hast Du eine Ahnung warum die Abfrage:
if (pcap_datalink(handle) != DLT_IEEE802_11) { perror("is not an WLAN\n"); exit(EXIT_FAILURE); }
fehl schlägt, obwohl ich doch ein WLan-Interface 'capture'? Vielleicht liegt hier das Problem?
Gruss Christian
-
void packet_received(u_char *args, const struct pcap_pkthdr *header, const u_char *packet) { printf ("%02x:%02x:%02x:%02x:%02x:%02x\n", packet[6],packet[7],packet[8],packet[9],packet[10],packet[11]); }
schau mal, ob so die richtige adresse ausgegeben wird. wenn ja, liegt es wohl daran, dass anscheinend 2 byte vor dem 802.11-frame liegen. woher die kommen, weiß ich nicht.
-
columbus schrieb:
Hast Du eine Ahnung warum die Abfrage:
if (pcap_datalink(handle) != DLT_IEEE802_11) { perror("is not an WLAN\n"); exit(EXIT_FAILURE); }
fehl schlägt, obwohl ich doch ein WLan-Interface 'capture'? Vielleicht liegt hier das Problem?
das erklärt natürlich alles. was du da empfängst ist kein 802.11-frame sondern einer der sorte '802.3' (ethernet). genauer gesagt, ein broadcast (könnte z.b. ARP sein). die ersten beiden 0xff's sind die letzten beiden bytes der ziel-mac-adresse. die 4 bytes danach sind die ersten 4 bytes der absender-adresse.
zwei mögliche erklärungen:
1. du hast noch ein anderes netzwerk-interface drin, dessen paket du ergattert hast.
2. dein wlan-interface rückt keine 802.11-frames raus, sondern konvertiert diese in ethernet-frames.
-
Das verückte ist nur, das geschieht nicht nur an einer bestimmten WLan-Karte sondern an allen, an denen ich das Programm ausprobiere. Da ist erst mal meine lokale WLan-Karte auf meinem Notebook, die hat einen Atheros-Chip mit proprietären Madwifi-Teiber. Dann habe ich noch eine alte WEP-Karte mit Prism-Chipsatz.
Und schliesslich der Broadcom-Wlan-NIC auf meinem Linksys-Router, auf dem das ganze schliesslich laufen soll. Überall dort werden anscheinend nur Wlan-Frames ausgegeben? Kann das sein?
-
Mir wurde gerade mitgeteilt, daß ich nur wlan-frames (also 80211 frames) zurück bekomme, wenn ich im Monitor-Modus arbeite. Normalerweise bekommt man Ethernet-Frames! Ich weis nicht ob das hier allgemein bekannt war, nur ich habe vergessen das zu erwähnen (ohh mann sag das doch gleich) und ich jetzt die Dummbatz-Mütze aufziehen muss? Kann das jemand bestätigen.
Wenn es allgemein bekannt war, vielleicht hilft diese Information anderen Newbies, wenn sie mit diesem Thema sich einarbeiten müssen.
Aber ich muss es erst noch ausprobieren, denn eigentlich habe ich die empfangenen Packete auch schon zu Ethernet-Frames gecastet.
Gruss Christian