import binascii
def display_dns_packet(packet):
print("DNS Packet:")
print("ID: ", binascii.hexlify(packet[0:2]))
print("QR: ", binascii.hexlify(packet[2]))
print("OPCODE: ", binascii.hexlify(packet[3]))
print("AA: ", binascii.hexlify(packet[4]))
print("TC: ", binascii.hexlify(packet[5]))
print("RD: ", binascii.hexlify(packet[6]))
print("RA: ", binascii.hexlify(packet[7]))
print("Z: ", binascii.hexlify(packet[8]))
print("AD: ", binascii.hexlify(packet[9]))
print("CD: ", binascii.hexlify(packet[10]))
print("RCODE: ", binascii.hexlify(packet[11]))
print("QUESTION COUNT: ", binascii.hexlify(packet[12:14]))
print("ANSWER COUNT: ", binascii.hexlify(packet[14:16]))
print("AUTHORITY COUNT: ", binascii.hexlify(packet[16:18]))
print("ADDITIONAL COUNT: ", binascii.hexlify(packet[18:20]))
print("QUESTION:")
question_start = 20
question_end = question_start + 2 * int(binascii.hexlify(packet[12:14]), 16)
print("Name: ", binascii.hexlify(packet[question_start:question_end]))
print("Type: ", binascii.hexlify(packet[question_end:question_end+2]))
print()
代码使用Python标准库中的binascii
模块对DNS数据包进行十六进制展示。首先输出DNS数据包的头部信息,然后展示问题和回答区域的内容。
DNS数据包的格式如下:
- 头部:会话标识ID,用于标识报文的ID标识,对于请求报文和其对应的应答报文,这个字段是相同的,通过它可以区分DNS应答报文是哪个请求的响应。
- 正文:
- Queries区域
- 查询名QNAME:要查找的名字,是一个或多个标识符的序列。
- 查询类型QTYPE:每一个问题有一个查询类型,2个字节表示查询类型。
- Queries区域
- 响应状态码:用于表示响应的状态。
- 域名服务器:用于解析域名的IP地址。
- 开始记录:表示从哪个字节开始记录。
- 回答区域数量:表示报文中有多少个回答区域。
- 权威域名服务器数量:表示权威域名服务器的数量。
- 附加资源记录数:表示附加记录的数量。