我正在尝试解码DNS流量并打印查询/响应数据,而我正在使用python / scapy对数据包进行解码。
代码段:
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字段?
答案 0 :(得分: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)