2017-01-05 1 views
4

DNS 트래픽을 디코드하고 쿼리/응답 데이터를 인쇄하려고하는데 파이썬/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 나에게 열거의 내부 INT 표현 (1)지고 있다는 것입니다 대신 기호 문자열 값 ("A", 또는 "IN"). 응답 패킷의 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')를 호출하는 대신에 한 번 호출 할 수 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

해결책이 작동합니다. 감사합니다! –