python - 在 Python 中构建 Dns 数据包时遇到问题

标签 python dns packets

我正在尝试构建一个 dns 数据包以通过套接字发送。我不想使用任何库,因为我想直接访问发送它的套接字变量。每当我发送 DNS 数据包时,wireshark 都会说它格式错误。我究竟做错了什么?

Dns包本身的一些错误: 它说它有 256 个问题,没有类也没有类型

  class DnsPacketBuilder:

def __init__(self):
    pass

def build_packet(self, url):
    packet = struct.pack("H", 12049)  # Query Ids (Just 1 for now)
    packet += struct.pack("H", 256)  # Flags
    packet += struct.pack("H", 1)  # Questions
    packet += struct.pack("H", 0)  # Answers
    packet += struct.pack("H", 0)  # Authorities
    packet += struct.pack("H", 0)  # Additional
    split_url = url.split(".")
    for part in split_url:
        packet += struct.pack("B", len(part))
        for byte in bytes(part):
            packet += struct.pack("c", byte)
    packet += struct.pack("B", 0)  # End of String
    packet += struct.pack("H", 1)  # Query Type
    packet += struct.pack("H", 1)  # Query Class
    return packet

# Sending the packet
builder = DnsPacketBuilder()
packet = builder.build_packet("www.northeastern.edu")
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(('', 8888))
sock.settimeout(2)
sock.sendto(bytes(packet), ("208.67.222.222", 53))
print("Packet Sent")
data, addr = sock.recvfrom(1024)
print("Response: " + data)
sock.close()

最佳答案

您的系统 native 使用“小端”字节顺序。

您需要使用 ">H" format string 将 16 位字段的字节顺序反转为“big endian”(也称为“网络顺序”)在 struct.pack() 中。

关于python - 在 Python 中构建 Dns 数据包时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24814044/

相关文章:

颜色对应字符串的Python散点图

linux - 将域名映射到 Azure Linux VM 应用

packet-sniffers - SSLStrip 不适合我

python - 在 Python 中运行 bash 命令 : os vs subprocess?

Python itertools—takewhile() : multiple predicates

Python:将二维数组插入 MySQL 表

php - Chrooted PHP-FPM脚本过一会儿无法解析DNS

amazon-s3 - 使用 Amazon S3 设置自定义域

在 FreeBSD 中创建和发送原始 IP 数据包 - sendto() 错误无效参数

java - 一个类可以调用类中的另一个函数,而第一个类不需要知道它是哪个类吗