2009-07-24 7 views
0

Ich habe eine Frage zu einer sehr einfachen Sache in Perl, aber ich kann keine effiziente Lösung finden.Wie ändere ich die Ziel-MAC-Adresse in einem Paket?

Hier ist ein bisschen Kontext zuerst. Ich benutze Net::Pcap etc und wenn ich in meiner Funktion bin, die Pakete verarbeitet (verwendet von pcap_loop) bekomme ich einen $packet Skalar, der mein ganzes Paket enthält (Ethernet-Header + IP-Header + TCP/UDP-Header + Payload).

Was ich tun möchte, ist die ersten 6 Bytes dieses $packet (Ethernet Ziel), um eine $packet zu bekommen zu ändern, die ich sende pcap_sendpacket verwenden können, ein benutzerdefiniertes Ziel-MAC-Adresse (zum Beispiel als eine bestandene Befehlszeilenargument oder so), wie 00:11:22:33:44:55. So kann ich die benutzerdefinierte Adresse (unter Verwendung split zum Beispiel) aufteilen, um alle 6 Teile der Ziel-MAC-Adresse zu erhalten, und sie mit der Funktion in Hex konvertieren, aber jetzt möchte ich die ersten Bytes meines Pakets ändern, um sie zu ersetzen mit diesen hex ed Bytes. Wie soll ich vorgehen ?

Ich dachte mit einigen Verkettungen (.), Aber ich denke, dass diese Lösung schmutzig ist.

Denken in C (weil ich es in C vor einiger Zeit getan habe, aber ich möchte, dass dies in Perl getan wird), sobald ich meine "u_char packet[]" bekam, musste ich nur eine memcpy meiner Benutzer bereitgestellten Ethernet tun Adresse zu den ersten 6 Bytes meiner packet[] und es hat funktioniert.

Antwort

1

Die vec Funktion verwendet wird, mit einem skalaren Wert zu arbeiten, wie ein bisschen Vektor.

use strict; 
use warnings; 

my $packet; 
# set packet to something... 

my $address = '00:11:22:33:44:55'; 
my @bytes = map { hex } split(/:/, $address); 
for my $i (0 .. $#bytes) { 
    vec($packet, $i, 8) = $bytes[$i]; 
} 
2

Schauen Sie sich die Beschreibung von substr() in perldoc perlfunc. Es verfügt über vier Parameter Formular, das Sie ersetzen Teile eines skalaren lässt:

substr EXPR, OFFSET, LENGTH, REPLACEMENT 

So etwas wie dies sollte für Sie arbeiten:

substr $packet, 0, 6, $new_header 
+2

Sie können Pack auch verwenden, um Dinge in Bytes zu konvertieren. – Eric