2013-06-03 9 views
7

Ich möchte UDP-Pakete erfassen, die für einen lokalen Port bestimmt sind, der Filterausdruck ist wie udp port 20000. Ich bemerke, wenn es IP-Fragmentierung auf einem UDP-Paket gibt, kann libpcap nur das erste IP-Fragment erfassen. Ich denke, der Grund ist das zweite IP-Fragment nicht mit UDP-Header (ich denke, es ist das gleiche für TCP), so dass libpcap sie nicht mit dem Filter Express udp port 20000 erfassen kann.libpcap kann IP-Fragmente nicht erfassen

gibt es eine Problemumgehung dafür? oder andere Bibliotheken, die Pakete erfassen können, die an einen bestimmten lokalen Port gerichtet sind?

danke!

+0

Wenn ein UDP-Paket fragmentiert ist und die Fragmente ihre Quelle/Ziel nicht identifizieren, wie werden sie dann im Namen von Zeus 'Butthole an den richtigen Host und die Anwendung weitergeleitet? –

+0

Das zweite Fragment ist mit IP-Header, aber kein UDP-Header. Der IP/TCP-Stack wird das erste und zweite IP-Fragment zusammenstellen, bevor es das gesamte UDP-Paket an die Anwendung liefert. Aber es scheint mir, dass libpcap das zweite IP-Fragment nicht erkennen kann. – misteryes

+0

Wie würde ein TCP/IP-Stack wissen, dass das zweite Fragment zum selben Socket gehört wie das erste ohne den UDP-Header? Vielleicht müssen Sie die Montage selbst machen - was eigentlich nicht so schwer sein sollte. –

Antwort

7

Ich denke, der Grund ist das zweite IP-Fragment nicht mit UDP-Header (ich denke, es ist das gleiche für TCP ist), so libpcap kann sie nicht erfassen die Filter ausdrücken udp-Port 20000.

Ja, das ist richtig.

Sie könnten versuchen, udp port 20000 or (ip[6:2] & 0x1fff) != 0, die Pakete zu oder von Port 20000 und IP-Fragmente anders als das erste Fragment erfassen; Das ist nicht ideal, aber es ist alles, was Sie mit libpcap-Filtern tun können, da der verwendete Filtermechanismus (der Teil des Betriebssystemkernels ist) keinen Verlauf zwischen den Paketen speichert und daher nicht wissen kann, dass ein Paket mit einem gegebene IP-ID ist zufällig Teil desselben Fragments wie ein anderes Paket mit der gleichen IP-ID, einem Fragment-Offset von 0 und einem UDP-Header mit Port 20000.

(Beachten Sie auch, dass zumindest einige Linux-Versionen übertragen würden Fragmente eines IP-Datagramms in umgekehrte Reihenfolge - um dem Empfänger zu ermöglichen, das letzte Fragment zuerst zu sehen, und damit in der Lage zu sein, die Größe des wieder zusammengebauten Pakets öfter zu schätzen, das würde es mehr schwierig machen um alle Fragmente von IP-Paketen mit einem Filter zu erfassen, der prüft Felder im TCP- oder UDP-Header.)