2016-05-23 31 views
0

因此,對於一個特定的任務,我問搜索並打印捕獲UDP DNS數據包UDP包分析

請求和響應(對協議字段)

現在我對網絡編程非常陌生,我試圖用JNetPcap Library來實現這一點。但請注意,問題是不是JNetPcap函數。

我從我的程序(可以修改)中得到的輸出結果是viz。

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 

那麼什麼request and response這裏?如果我的輸出不完整,我需要打印哪些字段以獲取請求和響應?

編輯:我不嗅探任何特定的應用程序。我被要求在整個網絡中嗅探網絡(如在我們的機器中運行軟件,這就是全部),並找到請求和響應。 謝謝。

額外的信息可能相關:

所以過濾我使用這個代碼(的代碼可能不需要的問題 UDP DNS數據包,但我包括它萬一我做錯了什麼):

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; 
} 

在這裏我分析了前10個數據包,

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

這就是我如何打印上面給出的示例輸出:

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

您沒有獲得完整的DNS數據包 - 事實上,如果這8個字節只是UDP標頭,那麼您根本沒有獲得任何DNS有效負載。最小的合法DNS有效負載是12字節(根據RFC 1035) – Alnitak

+0

啊,看着你的代碼,你打印的是錯誤的值 - 你的字符串表示你正在打印數據包的長度,但實際上你打印的是UDP頭長度。 – Alnitak

回答

2

首先,你需要通過刪除dst預選賽,讓你看到兩個包往返 53端口解決您的PCAP過濾器:

String expression = "udp port 53"; 

然後,最重要的是,你需要閱讀RFC 1035特別是§4。

請求和響應由QR位標識,它是DNS有效負載的第3個八位字節的最高有效位。

要實際匹配請求和響應,然後對每個數據包,你需要記住(源IP源端口目的IP目的端口DNS查詢ID)的元組,不忘記了響應數據包的源和目標值將被顛倒。

在大多數情況下,您還應該檢查響應中的QNAME與請求中看到的一致。

1

在我看來,如果你只拿到了兩個請求。您appearently過濾僅適用於目的港53:

String expression = "udp dst port 53"; 

Resonses應該由同一端口的到來,所以你需要額外篩選這一個,太("udp src port 53")。

編輯根據意見(感謝參宿一):

正確的過濾器,然後應該是"udp port 53"

+1

如果它是標準的pcap,那麼只需要'udp port 53'就可以。 – Alnitak

+1

它使用'libpcap',所以我認爲它應該是相同的。 –

+1

@jeet它確實出現這種方式 - 我沒有使用Java綁定,但他們看起來像是一個直接封裝libpcap – Alnitak