如何使用Scapy解析原始DNS请求字节以提取标识和查询记录类型?
Scapy解析原始DNS报文方案
Scapy原生支持直接加载原始DNS字节流完成解析,不需要额外的格式转换操作,使用方式如下:
核心解析方法
直接将UDP socket接收到的原始DNS请求字节传入DNS类的构造函数即可完成解析,示例代码:
from scapy.layers.dns import DNS # 替换为你从socket实际收到的原始DNS请求字节 raw_dns_req = b'\xd6t\x01\x00\x01\x00\x00\x00\x00\x00\x01\x03www\x08facebook\x03com\x00\x00\x01\x00\x01\x00\x00)\x10\x00\x00\x00\x00\x00\x00\x00' dns_pkt = DNS(raw_dns_req)
常用字段读取示例
解析完成后可以直接通过属性读取你需要的各类DNS报文参数:
- 事务标识(ID):读取
dns_pkt.id,你给出的示例中该值为十六进制0xd674,对应十进制54900 - 查询记录类型:读取
dns_pkt.qd.qtype,示例中返回值为1,对应A记录 - 查询域名:读取
dns_pkt.qd.qname,示例中返回b'www.facebook.com.' - 请求/响应标识:读取
dns_pkt.qr,返回0为请求、返回1为响应,你的示例中该值为0符合请求特征
如果需要查看完整的报文字段,调用dns_pkt.show()即可分层打印所有报文参数,方便你查找需要的自定义字段。
内容的提问来源于stack exchange,提问作者Mr.X
相关产品推荐
相关产品推荐

