Я использую сниффер scapy для получения DNS-пакетов, и он работает как чудо
Проблема в том, что когда я получаю MX-записи, rrdata
кодируются (struct.pack или что-то вродечто)
Как я могу расшифровать эти данные?
Например, я прослушал DNS для запроса Google MX:
def pkt_callback(pkt):
ip = pkt['IP']
dns = pkt['DNS']
for i in range(dns.ancount):
dnsrr = dns.an[i]
print(dnsrr.rdata)
sniff(iface='enp0s25', prn=pkt_callback, filter="udp and ( port 53 )", store=0)
Я получаю это:
b'\x00\n\x05aspmx\x01l\xc0\x0c'
b'\x002\x04alt4\xc0*'
b'\x00\x1e\x04alt2\xc0*'
b'\x00\x14\x04alt1\xc0*'
b'\x00(\x04alt3\xc0*'
Что должно быть так:
10 aspmx.l.google.com.
50 alt4.aspmx.l.google.com.
30 alt2.aspmx.l.google.com.
20 alt1.aspmx.l.google.com.
40 alt3.aspmx.l.google.com.
Мне удалось извлечь поле " perf " с помощью этого:
perf = struct.unpack('!h', rrdata[0:2])[0]
Но остальные данные не так просты;моя лучшая покупка была такой:
def decode_mx_rdata(rdata):
perf = struct.unpack('!h', rdata[0:2])[0]
rdata = rdata[2:]
parts = []
while rdata:
if len(rdata) % 2 == 0:
l = rdata[0:2]
p = 2
else:
l = rdata[0:1]+b'\x00'
p = 1
l = int(struct.unpack('h', l)[0])
parts.append(rdata[p:l+p])
rdata = rdata[l+p:]
return perf, parts
Как я могу правильно декодировать эти данные?