一条最小的 DNS 查询
本节的 DNS 小工具:
encode_name("www.example.com") b"\x03www\x07example\x03com\x00"(每段前面一个长度字节,末尾 0)
build_query(qid, name) 12 字节头(id、标志 0x0100、问题数 1、其余 0)+ 名字 + 类型 A(1) + 类 IN(1)把 www.example.com 的查询包拼出来,看总长度、名字部分的十六进制、以及头里的问题数:
def encode_name(name):
"""www.example.com → b"\x03www\x07example\x03com\x00" """
out = b""
for label in name.split("."):
out += bytes([len(label)]) + label.encode()
return out + b"\x00"
def build_query(qid, name):
"""最小的 DNS 查询:12 字节头 + 问题(名字 + 类型 A + 类 IN)。"""
header = qid.to_bytes(2, "big") + b"\x01\x00" + b"\x00\x01" + b"\x00\x00" * 3
return header + encode_name(name) + b"\x00\x01" + b"\x00\x01"
q = build_query(0x1234, "www.example.com")
name = encode_name("www.example.com")
print(str(len(q)) + "/" + name.hex() + "/" + str(int.from_bytes(q[4:6], "big")))
全部评论