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は私の代わりに記号文字列値( "A"、または "IN")のenumの内部整数表現(1)を取得しているということです。同じことが応答パケットのDNSRRセクションにも当てはまります。

DNSQRフィールドまたはDNSRRフィールドをシンボリックフォームで取得するにはどうすればよいですか。

答えて

2

次を呼び出すことによってqr.qtypeのとqr.qclassの記号文字列値を取得できます。むしろ、何度も何度もqr.get_field('qtype')qr.get_field('qclass')を呼び出すよりも、あなたが一度それを呼び出すことができることを

qr.get_field('qtype').i2repr(qr, qr.qtype) 
qr.get_field('qclass').i2repr(qr, qr.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

解決策はありがたいです! –

関連する問題