Frage

Ich mag ein Echtzeit-Analyse-Tool für drahtlosen Datenverkehr schreiben.

Wer weiß, wie von einem Promiscuous (oder Sniffing) Gerät in C zu lesen?

Ich weiß, dass Sie Root-Zugriff, es zu tun haben müssen. Ich habe mich gefragt, ob jemand weiß, welche Funktionen notwendig sind, um dies zu tun. Normale Steckdosen scheinen keinen Sinn hier zu machen.

War es hilfreich?

Lösung

Unter Linux verwenden Sie ein PF_PACKET Buchse Daten von einem Raw-Gerät zu lesen, wie eine Ethernet-Schnittstelle in der Promiscuous-Modus ausgeführt wird:

s = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL))

Dies wird Kopien von jedem Paket an Ihrer Steckdose empfangen bis senden. Es ist sehr wahrscheinlich, dass Sie nicht wirklich jedes Paket wollen, though. Der Kern einer ersten Filterstufe durchführen kann BPF verwendet wird, die Berkeley Packet Filter . BPF ist im Wesentlichen eine Stack-basierten virtuelle Maschine: es einen kleinen Satz von Anweisungen behandelt wie:

ldh = load halfword (from packet)  
jeq = jump if equal  
ret = return with exit code  

BPF Exit-Code weist den Kernel, ob das Paket an die Steckdose oder nicht zu kopieren. Es ist möglich, relativ kleine BPF-Programme direkt zu schreiben, mit setsockopt (s, SOL_SOCKET, SO_ATTACH_FILTER,). . (ACHTUNG: Der Kernel eine Struktur sock_fprog nimmt, nicht eine Struktur bpf_program, nicht diejenigen, die nicht mischen oder Ihr Programm auf einigen Plattformen nicht)

Für alles, was einigermaßen komplex, wollen Sie wirklich libpcap verwenden. BPF wird dadurch begrenzt, was es tun kann, insbesondere in der Anzahl von Instruktionen es pro Paket ausführen kann. Libpcap Pflege nehmen einen komplexen Filter in zwei Teile, mit dem Kern des Aufteilens eines ersten Ebene durchführt die Filterung und der Abwurf User-space-Code mehr-fähig, die Pakete, die er eigentlich nicht sehen wollte.

libpcap abstrahiert auch die Kernel-Schnittstelle aus Ihrem Anwendungscode. Linux und BSD verwenden ähnliche APIs, aber Solaris erfordert DLPI und Windows verwendet etwas anderes.

Andere Tipps

Ich hatte einmal auf Raw-Ethernet-Frames zu hören und am Ende einen Wrapper für diese zu schaffen. Durch den Aufruf der Funktion mit dem Gerätenamen, ex eth0 bekam ich eine Buchse im Gegenzug, die in den Promiscuous-Modus war. Was Sie tun müssen, ist ein Raw-Socket zu erstellen und sie dann in der Promiscuous-Modus. Hier ist, wie ich es tat.

int raw_init (const char *device)
{
    struct ifreq ifr;
    int raw_socket;

    memset (&ifr, 0, sizeof (struct ifreq));

    /* Open A Raw Socket */
    if ((raw_socket = socket (PF_PACKET, SOCK_RAW, htons (ETH_P_ALL))) < 1)
    {
        printf ("ERROR: Could not open socket, Got #?\n");
        exit (1);
    }

    /* Set the device to use */
    strcpy (ifr.ifr_name, device);

    /* Get the current flags that the device might have */
    if (ioctl (raw_socket, SIOCGIFFLAGS, &ifr) == -1)
    {
        perror ("Error: Could not retrive the flags from the device.\n");
        exit (1);
    }

    /* Set the old flags plus the IFF_PROMISC flag */
    ifr.ifr_flags |= IFF_PROMISC;
    if (ioctl (raw_socket, SIOCSIFFLAGS, &ifr) == -1)
    {
        perror ("Error: Could not set flag IFF_PROMISC");
        exit (1);
    }
    printf ("Entering promiscuous mode\n");

    /* Configure the device */

    if (ioctl (raw_socket, SIOCGIFINDEX, &ifr) < 0)
    {
        perror ("Error: Error getting the device index.\n");
        exit (1);
    }

    return raw_socket;
}

Dann, wenn Sie Ihre Steckdose haben, können Sie nur wählen Sie verwenden, um Pakete zu handhaben, wie sie ankommen.

Sie könnten die pcap Bibliothek verwenden (siehe http://www.tcpdump.org/pcap.htm ), die wird auch von tcpdump und Wireshark.

Warum sollte man nicht verwenden, so etwas wie Wireshark ?

Es ist Open Source, so zumindest könnte man ein paar Dinge von ihm lernen, wenn Sie nicht wollen, nur um es zu benutzen.

Wireshark auf Linux hat die Fähigkeit, die PLCP (Physical Layer Convergence Protocol) zu erfassen Header-Informationen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top