2017-01-05 49 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.qtypeqr.qclass越来越我枚举的内部INT表示(1),而不是符号字符串值( “A” 或 “IN”)。这同样适用于响应数据包的DNSRR部分。

如何获得符号形式的DNSQR或DNSRR字段?

回答

2

您可以通过调用的qr.qclass得到qr.qtype符号的字符串值,如下:

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

注意,而不是再次重新调用qr.get_field('qtype')qr.get_field('qclass')过来,你可以一次调用它advance:

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

您的解决方案有效,谢谢! –