检索 DNS 标志信息(十六进制格式)

Retrieve DNS Flags information (in Hexadecimal format)

我已经尽可能地使用 scapy 检索 DNS 信息,但我想知道如何获取 DNS 标志信息。

以下是我从 Scapy 检索到的信息,但我不确定如何将其转换为十六进制格式,因为我不太熟悉 DNS 标志。

    id        = 1
    qr        = 0L
    opcode    = QUERY
    aa        = 0L
    tc        = 0L
    rd        = 0L
    ra        = 0L
    z         = 0L
    rcode     = ok
    qdcount   = 1
    ancount   = 0
    nscount   = 0
    arcount   = 0

DNS protocol中,标志位被打包成一个16位的值,像这样:

| 15 | 14 | 13 | 12 | 11 | 10 |  9 |  8 |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
| qr | opcode            | aa | tc | rd | ra | z            | rcode             |

有关更多信息,请参阅 here

您可以像这样在 Python 中构造此值:

flags = (qr << 15) | (opcode << 11) | (aa << 10) | (tc << 9) | (rd << 8) | (ra << 7) | (z << 4) | rcode

如果你想输出这个值的十六进制表示,你可以使用hex() or format()函数。

DNS 标志对应于第 3 字节和第 4 字节。你可以得到那些使用: bytes(packet[DNS])[2:4] # Use str if you are on scapy version < 3

如果你用它来手动输入图形工具,你可以很容易地通过打印字节来查看值。或者您可以使用 struct.unpack 将其转换为整数,您可以使用十六进制将其转换为十六进制。