1- //
2- // libpacket/src/dns.c: DNS protocol decoder
1+ //
2+ // libpacket/src/dns.c: DNS protocol decoder
33// Victor Roemer (wtfbbqhax), <[email protected] >.44//
55#include < assert.h>
1010
1111#include < arpa/inet.h>
1212
13+ #include < iostream>
14+ #include < string>
15+
1316#include " packet_private.h"
1417#include " packet/dns.h"
1518
@@ -27,7 +30,7 @@ decode_dns(uint8_t const * pkt, uint32_t const len, dns* dns)
2730 }
2831
2932 struct dns_header const * raw =
30- (struct dns_header const *)pkt;
33+ (struct dns_header const *)pkt;
3134
3235 dns->h .id = ntohs (raw->id );
3336 dns->h .flags = ntohs (raw->flags );
@@ -48,8 +51,8 @@ decode_dns(uint8_t const * pkt, uint32_t const len, dns* dns)
4851 // Parsing Question Section
4952 for (int i = 0 ; i < dns->h .qdcount ; i++)
5053 {
51- struct dns_query * q = &dns->questions [i];
52-
54+ struct dns_query * q = &dns->questions [i];
55+
5356 // Parse QNAME
5457 while (remaining_len > 0 && *ptr != 0 )
5558 {
@@ -63,10 +66,13 @@ decode_dns(uint8_t const * pkt, uint32_t const len, dns* dns)
6366 return -1 ;
6467 }
6568
69+ q->label .append (reinterpret_cast <char const *>(ptr), label_len);
70+ q->label .append (" ." );
71+
6672 ptr += label_len;
6773 remaining_len -= label_len;
6874 }
69-
75+
7076 // Null byte at the end of QNAME
7177 if (remaining_len == 0 )
7278 {
@@ -152,8 +158,35 @@ decode_dns(uint8_t const * pkt, uint32_t const len, dns* dns)
152158 a->dns_atype = atype;
153159 a->dns_aclass = aclass;
154160 a->dns_ttl = ttl;
155- a->dns_rdlength = rdlength;
156- a->dns_rdata = *((uint16_t *)rdata);
161+
162+ // Parse rdata
163+ while (rdata < ptr)
164+ {
165+ uint16_t us = *reinterpret_cast <uint16_t const *>(rdata);
166+ if (us == name)
167+ {
168+ rdata += 2 ;
169+ rdlength -= 2 ;
170+ continue ;
171+ }
172+
173+ uint8_t len = 0 ;
174+ if (rdlength >= 1 )
175+ {
176+ len = *rdata;
177+ rdata += 1 ;
178+ }
179+ // abort if len == 0 && rdatalength > 0 // ANOMALY?
180+
181+ len = rdlength > len ? len : rdlength;
182+
183+ if (len)
184+ {
185+ a->data .append (reinterpret_cast <char const *>(rdata), len);
186+ a->data .append (" ." );
187+ }
188+ rdata += len;
189+ }
157190 }
158191
159192 return 0 ;
0 commit comments