Python

2014-07-17 6 views
5

'da bir Dns Paketi oluşturmada sorun yaşıyorsunuz Bir soket üzerinden göndermek için bir dns paketi oluşturmaya çalışıyorum. Herhangi bir kütüphaneyi kullanmak istemiyorum çünkü onu gönderen soket değişkenine doğrudan erişim istiyorum. DNS paketini her gönderdiğimde, wireshark bunun hatalı biçimlendirildiğini söylüyor. Tam olarak neyi yanlış yapıyorum? DNS paket kendisi ile yanlışPython

bazı şeyler: O 256 soru, sınıfın veya hiçbir türünü Sisteminiz doğal "küçük endian" bayt sırasını kullanan

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

bunu bir sınıfta kullanıyor musunuz? –

cevap

4

olduğunu söylüyor.

struct.pack()'da ">H"format string kullanarak 16 bit alanların bayt sırasını "büyük endian" (aka "ağ sırası") olarak tersine çevirmeniz gerekir.