2017-09-14 2 views
0

Ich verwende das folgende Python-Skript für Raw-Socket-Paketübertragung. Paketübertragung ist in Ordnung, aber ich kann das eingehende Paket nicht vom anderen Ende drucken.Python Raw Socket erhalten Problem

from socket import socket, AF_PACKET, SOCK_RAW 

s = socket(AF_PACKET, SOCK_RAW) 
s.bind(("eth0", 0)) 
src_addr = "\x54\xbe\xf7\x40\xf5\x82" 
dst_addr = "\xff\xff\xff\xff\xff\xff" 

payload = ("[("*30)+"Hello"+("]"*30) 
checksum = "\x1a\x2b\x3c\x4d" 

data = payload+checksum 

s.send(dst_addr+src_addr+data) 

#for receive function 

response=s.recv(4096) 
print response 
s.close() 
+0

Ist das Empfangsende irgendwelche Fehler geben? Was ist die Ausgabe der Druckanweisung? – BrandonM

+0

Der Server, der Nachrichten empfangen sollte immer aktiv sein, aber scheint, dass Sie den Socket geschlossen. –

+0

Nein Ich bekomme keinen Druck von "print response" Brandon. Es wartet auf Sie. Auch nachdem es vom Kunden erhalten hat. –

Antwort

0

Es gibt ein drittes Argument für die socket Funktion: . Wenn nicht angegeben, wird der Standardwert 0 verwendet. Für AF_PACKET/SOCK_RAW gibt das Argument an, welche Art von Paketen Sie empfangen möchten. Die Werte sind in der packet(7) Manpage dokumentiert: http://man7.org/linux/man-pages/man7/packet.7.html

Ich glaube nicht, dass die Werte tatsächlich irgendwo in den Core Python2-Modulen definiert sind. Einige von ihnen können in scapy (http://www.secdev.org/projects/scapy/) gefunden werden, oder Sie können einfach die Linux-Header-Datei suchen, wo sie definiert sind (/usr/include/linux/if_ether.h).

Also, dieses Problem zu beheben, den Code zu ändern:

from socket import socket, AF_PACKET, SOCK_RAW, htons 

ETH_P_ALL = 3 
ETH_P_IP = 0x800 # Alternatively using this will receive the next IP packet 
s = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL)) 
... 

Kommentare auf Ihren Code:

Wie geschrieben, das Paket Sie senden ist unwahrscheinlich, von jedermann verständlich sein. Sie haben eine dst- und src-MAC-Adresse, aber Sie stellen keinen EtherType bereit. Stattdessen wird der erste "[(" wird als der EtherType gesehen. Das wird wahrscheinlich keinen Empfänger des Pakets Sinn machen, so wird es nur verworfen werden.

Auch sollten Sie das mit einem rohen Sockel, Sie verstehen 'wird das nächste Paket des Typs empfangen, den Sie im Protokoll angegeben haben. Das ist nicht unbedingt eine Antwort auf das Paket, das Sie gerade gesendet haben.

0

Vielen Dank jetzt Ich bin in der Lage, das Paket mit dem folgenden Skript zu erhalten, aber immer noch habe ich das Problem mit dem Drucken mehrerer Antwortpakete (während in Schleife)

from socket import socket, AF_PACKET, SOCK_RAW, htons 
from struct import * 
import select 
import time 

ETH_P_ALL = 3 
ETH_P_IP = 0x800 
s = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL)) 
s.bind(("eth0", 0)) 

src_addr = "\x54\xbe\xf7\x40\xf7\x82" 
dst_addr = "\xff\xff\xff\xff\xff\xff" 
l = "\x00\x21" 

ethertype = "\x08\x01" 

a ="\x00\x10\x00\x10\x00\x10" 
b = "\x00\x11\x00\x11\x00\x11" 

payload = ethertype + l + a + b 

for i in range(5): 

    time.sleep(5) 
    s.send(dst_addr+src_addr+ payload) 
    message=s.recv(4096) 
    print message