2014-07-17 12 views
5

Sto provando a creare un pacchetto dns da inviare tramite un socket. Non voglio usare alcuna libreria perché voglio l'accesso diretto alla variabile socket che la invia. Ogni volta che invio il pacchetto DNS, wireshark dice che è malformato. Cosa sto facendo di sbagliato esattamente?Problemi nella creazione di un pacchetto Dns in Python

Alcune cose che sono sbagliato con il pacchetto DNS in sé: Si dice che ha 256 domande, nessuna classe e nessun tipo

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() 
+0

stai usando questo in una classe? –

risposta

4

Il sistema utilizza l'ordine dei byte "Little Endian" in modo nativo.

È necessario invertire l'ordine dei byte dei campi a 16 bit in "big endian" (ovvero "ordine di rete") utilizzando ">H"format string in struct.pack().

Problemi correlati