2016-10-03 3 views
3

Ich baue einen UDP-Server, um eingehende UDP-Pakete zu analysieren und zu überprüfen. Ich bin in der Lage, Pakete zu empfangen und zu analysieren, aber die Header-Werte sind nicht das, was ich erwartet habe.Parsen von UDP-Paketen

Dies ist die Struktur des ankommenden Pakets

Packet ID (4 Byte)
Packet Sequence (4 Byte)
XOR Key (2 Bytes)
Anzahl der Prüfsummen in Paket (2 Bytes)
Cyclic Prüfsumme CRC32 (variable)

das Paket zu senden,

with open('payloadfile.bin') as op: 
    payload = pickle.load(op) 

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 

for i in payload: 
    sock.sentto(payload, ('127.0.0.1',4545)) 

So zu empfangen und dieses Paket zu analysieren

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
sock.bind('127.0.0.1',4545) 

while 1: 
    packet = sock.recvfrom(65565) 
    packet = packet[0] 

    # parse IP 
    ip_header = packet[0:20] 
    iph = struct.unpack('!BBHHHBBH4s4s' , ip_header) 

    #all the following values are incorrect 
    version_ihl = iph[0] 
    version = version_ihl >> 4 
    ihl = version_ihl & 0xF 

    ttl = iph[5] 
    protocol = iph[6] 
    s_addr = socket.inet_ntoa(iph[8]); 
    d_addr = socket.inet_ntoa(iph[9]); 

    # parse UDP 
    packet = packet[20:28] 
    data = packet[header_length:] 
    source_port, dest_port, data_length, checksum = struct.unpack("!HHHH", header) 

Von dem, was ich bisher verstehen, das ist die allgemeine Struktur
IP_HEADER (UDP_HEADER (Payload)))

Ich möchte richtig die Header analysieren sein sollte, und dann Nutzlast extrahieren.
Ich würde wirklich schätzen, wenn jemand mich in die richtige Richtung auf die Daten

+1

Sie erhalten nicht die IP/UDP-Header, nur die Nutzlast des Datagramms ... und dies geschieht absichtlich. Sie haben diesen Socket als IP4/UDP geöffnet, aber "Socket" eine generische Interace, die mit mehreren Transportprotokollen arbeitet. Zum Beispiel sollte es transparent mit IP6 oder sogar (oh mein Teufel!) IPX arbeiten. – tdelaney

Antwort

5

Leider ist die Standard-Socket-Schnittstelle nicht geben Sie Frames zugreifen zeigen könnte, dass Ihre Daten kommen in, weder er die IP-Datagramm-Header enthält noch die TCP/UDP-Header von der Transportschicht.

Um niederrangige Daten zu erhalten, müssen Sie die sogenannte Raw-Socket-Schnittstelle verwenden, die Windows für Sie blockiert, weil Sie ein Hacker sein könnten. This article könnte Ihnen einige Hinweise geben.

+0

Ich denke, ich würde das "zum Glück" nennen, weil es eine generische Schnittstelle ist ... aber ich mag deine Antwort sonst! – tdelaney