2016-05-23 9 views
0

, für eine bestimmte Aufgabe, die ich gefragt werde, suchen und drucken Sie dieUDP Packet Analysis

Anfrage und Antwort (für Protokollfelder)

für gefangene UDP DNS-Pakete.

Jetzt bin ich sehr neu zu Netzwerk-Programmierung und ich habe versucht, dies mit der JNetPcap Library zu erreichen. Beachten Sie jedoch, dass die Frage nicht über JNetPcap Funktionen ist.

Die Beispielausgaben, die ich von meinem Programm bekomme (das geändert werden kann) ist nämlich.

Got UDP Packet 
Name of packet :Udp 
The Source :14786 
The Destination :53 
The Legnth of packet :8 

Got UDP Packet 
Name of packet :Udp 
The Source :58186 
The Destination :53 
The Legnth of packet :8 

So was ist derrequest and responsehier? Wenn meine Ausgabe unvollständig ist, welche Felder muss ich drucken, um die Anfrage und die Antwort zu erhalten?

Bearbeiten: Ich schnüffle keine bestimmte Anwendung. Ich werde gebeten, das Netzwerk zu schnüffeln (wie in, in Ihrer Software in unserer Maschine laufen und das ist alles) als Ganzes und finden Sie die Anfrage und Antwort. Danke.

Zusätzliche Informationen, die relevant sein können:

Also diesen Code verwende ich UDP DNS-Pakete zu filtern (der Code für die Frage nicht, aber ich bin auch ich es nur für den Fall erforderlich habe etwas falsch gemacht):

PcapBpfProgram program = new PcapBpfProgram(); 
String expression = "udp dst port 53"; 
int optimize = 0;   // 0 = false 
int netmask = 0xFFFFFF00; // 255.255.255.0 
if (pcap.compile(program, expression, optimize, netmask) != Pcap.OK) { 
       System.err.println(pcap.getErr()); 
       return; 
} 

Hier analysiere ich die ersten 10 Pakete viz.

// Receive packet from the loop 
PcapPacketHandler<String> jpacketHandler = packet_handler(); 
// capture first 10 packages 
pcap.loop(10, jpacketHandler, ""); 

Und das ist, wie ich die Beispielausgabe oben angegebenen Druck:

public static PcapPacketHandler<String> packet_handler() { 
PcapPacketHandler<String> jpacketHandler = new PcapPacketHandler<String>() { 
Udp udp = new Udp(); 

@Override 
public void nextPacket(PcapPacket packet, String user) { 

// Another check to determine if packet is UDP. 
if (!packet.hasHeader(udp)) { 
    // not UDP? skip 
} 
// Yet another check to determine if packet is UDP. 
if (packet.hasHeader(udp)) { 
    System.out.println("Got UDP Packet"); 
    System.out.println("Name of packet :" + packet.getHeader(udp).getName()); 
    System.out.println("The Source :" + packet.getHeader(udp).source()); 
    System.out.println("The Destination :" + packet.getHeader(udp).destination()); 
    System.out.println("The Check sum :" + packet.getHeader(udp).checksum()); 
    System.out.println("The Legnth of packet :" + packet.getHeader(udp).getHeaderLength()); 
+0

Sie erhalten keine vollständigen DNS-Pakete - wenn diese 8 Bytes nur der UDP-Header sind, erhalten Sie überhaupt keine DNS-Nutzdaten. Die kleinste zulässige DNS-Nutzlast beträgt 12 Byte (nach RFC 1035). – Alnitak

+0

Ah, wenn Sie Ihren Code betrachten, drucken Sie den falschen Wert - Ihre Zeichenfolge besagt, dass Sie die Länge des Pakets drucken, aber Sie drucken tatsächlich den UDP-Header Länge. – Alnitak

Antwort

2

Zuerst müssen Sie Ihr pcap Filter beheben, indem die dst Qualifier zu entfernen, so dass Sie beide Pakete sehen zu und von Port 53:

String expression = "udp port 53"; 

Dann, und was am wichtigsten ist, müssen Sie RFC 1035 lesen besonders §4.

Anforderungen und Antworten werden durch das Bit QR identifiziert, das das höchstwertige Bit des dritten Oktetts der DNS-Nutzdaten ist.

Um tatsächlich Anfragen und Antworten passen dann für jedes Paket Sie das Tupel von (Quelle ip, Quellport, Ziel-IP, dest Port, DNS-Abfrage ID) merken müssen, nicht Vergessen, dass in Antwortpaketen die Quell- und Zielwerte umgekehrt werden.

In den meisten Fällen sollten Sie auch überprüfen, dass die QNAME in der Antwort mit der in der Anfrage gesehen übereinstimmt.

1

Scheint mir, als ob Sie nur zwei Anfragen bekam. appearently gefiltert Sie nur für Ziel-Port 53:

String expression = "udp dst port 53"; 

Resonses sollte aus dem gleichen Hafen kommen, so benötigen Sie zusätzlich für diesen einen filtern, auch ("udp src port 53").

bearbeiten nach den Kommentaren (dank Alnitak):

Der richtige Filter sollte dann "udp port 53" sein.

+1

Wenn es Standard-PCAP ist dann würde nur "UDP Port 53" tun. – Alnitak

+1

Es benutzt 'libpcap', also denke ich, dass es dasselbe sein sollte. –

+1

@jeet es scheint so - ich habe nicht die Java-Bindungen verwendet, aber sie sehen aus wie sie sind ein geradliniger Wrapper um libpcap – Alnitak