2009-04-06 4 views

Antwort

4

Zunächst deaktivieren Sie Ihre Ethernet-Karte des checksumming:

sudo ethtool -K eth1 tx off 

Dann Sie die korrupten Frames aus Python senden:

#!/usr/bin/env python 

from socket import * 

# 
# Ethernet Frame: 
# [ 
# [ Destination address, 6 bytes ] 
# [ Source address, 6 bytes  ] 
# [ Ethertype, 2 bytes   ] 
# [ Payload, 40 to 1500 bytes ] 
# [ 32 bit CRC chcksum, 4 bytes ] 
# ] 
# 

s = socket(AF_PACKET, SOCK_RAW) 
s.bind(("eth1", 0)) 
src_addr = "\x01\x02\x03\x04\x05\x06" 
dst_addr = "\x01\x02\x03\x04\x05\x06" 
payload = ("["*30)+"PAYLOAD"+("]"*30) 
checksum = "\x00\x00\x00\x00" 
ethertype = "\x08\x01" 
s.send(dst_addr+src_addr+ethertype+payload+checksum) 

Siehe A similar question

1

Das Programm funktionierte nicht wie vorgesehen für mich, um FCS-Fehler zu generieren.

Der Netzwerktreiber hat die korrekte Prüfsumme am Ende des generierten Frames erneut hinzugefügt. Natürlich ist es durchaus möglich, dass die Lösung für einige Karten funktioniert, aber ich bin mir sicher, mit keinem von Intel. (Es funktioniert auch ohne ethtool Änderungen für mich.)

Mit mindestens einer Intel e1000e Netzwerkkarte müssen Sie eine kleine Änderung an den obigen Code: Fügen Sie die folgende Zeile nach "s = socket (AF_PACKET, SOCK_RAW)" :

s.setsockopt(SOL_SOCKET,43,1) 

dem NIC-Treiber das sagt die „SO_NOFCS“ Option in socket.h definiert zu verwenden und den Rahmen, ohne die Berechnung und das Hinzufügen der FCS zu senden.

Sie können auch in dem folgende C-Programm interessiert sein, die ich zeigte, wie es geht: http://markmail.org/thread/eoquixklsjgvvaom

aber darüber im Klaren sein, dass das Programm nicht ohne eine kleine Änderung an den letzten Kernel arbeiten. Der SOL_SOCKET scheint die numerische ID in der Vergangenheit von 42 auf 43 geändert zu haben.

Laut dem ursprünglichen Autor sollte die Funktion für mindestens die folgenden Treiber verfügbar sein: e100, e1000 und e1000e. Ein schnelles grep in den Kernelquellen von 3.16.0 zeigt an, dass ixgbe igb und i40e ebenfalls funktionieren sollten. Wenn Sie keine dieser Karten verwenden, ist diese Socket-Option wahrscheinlich nicht verfügbar.

Verwandte Themen