2016-05-23 2 views
0

Таким образом, для конкретной задачи, я попросил, чтобы найти и распечатать запросUDP пакеты Анализ

и ответ (для полого протокола)

для захваченного UDP DNS пакетов.

Теперь я очень новичок в программировании сети, и я попытался достичь этого, используя JNetPcap Library. Однако, обратите внимание, что вопрос не о JNetPcap функции.

Образцовые выходы, которые я получаю от своей программы (которая может быть изменена), - это вид.

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здесь? Если мой вывод неполный, какие поля мне нужно распечатать, чтобы получить запрос и ответ?

Редактировать: Я не нюхаю какого-либо конкретного приложения. Меня попросят обнюхать сеть (как в, запустить в вашем программном обеспечении на нашей машине, и все это) в целом и найти запрос и ответ. Спасибо.

Дополнительная информация, которая может быть актуальным:

Таким образом, чтобы фильтровать DNS пакеты UDP Я использую этот код (код может не потребоваться для вопроса, но я включаю его на всякий случай что-то не так):

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

Во-первых, вам нужно исправить PCAP фильтр, удалив dst спецификатор так, что вы видите, оба пакета и из порта 53:

String expression = "udp port 53"; 

Тогда, и самое главное, вы должны прочитать RFC 1035 , особенно § 4.

Запросы и ответы идентифицируются битом QR, который является самым значительным битом третьего октета полезной нагрузки DNS.

Чтобы фактически соответствовать запросов и ответов, то для каждого пакета, который вы должны помнить кортеж (IP-адрес источника, порта источника, Dest внутрибрюшинно, Dest порт, 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

Смежные вопросы