2017-01-05 2 views
4

Я пытаюсь декодировать трафик DNS и печатать данные запроса/ответа, и я использую python/scapy для декодирования пакетов.scapy: получить значения полей DNSQR/DNSRR в символьной/строковой форме

Код фрагмент:

def dns_sniff_v2(pkt): 
    if IP in pkt: 
     if pkt.haslayer(DNS): 
      dns = pkt.getlayer(DNS) 
      pkt_time = pkt.sprintf('%sent.time%') 

      if pkt.haslayer(DNSQR): 
       qr = pkt.getlayer(DNSQR) # DNS query 
       values = [ pkt_time, str(ip_src), str(ip_dst), str(dns.id), str(qr.qname), str(qr.qtype), str(qr.qclass) ] 

      print "|".join(values) 

sniff(iface="eth0", filter="port 53", prn=dns_sniff_v2, store=0) 

Проблема заключается в том, что qr.qtype или qr.qclass получает меня внутреннее ИНТ представление перечисления (1), а символическое значение строки («A» или «В»). То же самое касается раздела DNSRR пакетов ответов.

Как я могу получить поле DNSQR или DNSRR в символической форме?

ответ

2

Вы можете получить символическое значение строки из qr.qtype и qr.qclass, ссылаясь на следующее:

qr.get_field('qtype').i2repr(qr, qr.qtype) 
qr.get_field('qclass').i2repr(qr, qr.qclass) 

Обратите внимание, что вместо вызова qr.get_field('qtype') и qr.get_field('qclass') снова и снова, вы можете вызвать его один раз в аванс:

qtype_field = qr.get_field('qtype') 
qclass_field = qr.get_field('qclass') 
... 
qtype_field.i2repr(qr, qr.qtype) 
qclass_field.i2repr(qr, qr.qclass) 
+0

Ваше решение работает, спасибо! –

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