scapy:以 symbolic/string 形式获取 DNSQR / DNSRR 字段值
scapy: get DNSQR / DNSRR field values in symbolic/string form
我正在尝试解码 DNS 流量并打印 query/response 数据,我正在使用 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 字段?
您可以通过调用以下命令获取 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)
我正在尝试解码 DNS 流量并打印 query/response 数据,我正在使用 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 字段?
您可以通过调用以下命令获取 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)