2009-07-24 41 views
0

我有一个问题涉及Perl中的一个非常基本的东西,但我无法找到一个有效的解决方案。如何修改数据包中的目标MAC地址?

这里先介绍一下上下文。我使用Net::Pcap等,当我在我的函数处理数据包(由pcap_loop使用)时,我得到一个包含我的整个数据包(以太网头+ IP头+ tcp/udp头+有效载荷)的$packet标量。

我想要做的是改变前6个字节这个$packet(以太网目的),以获得$packet,我可以使用pcap_sendpacket发送,使用用户定义的目的MAC地址(例如,作为传递命令行参数等),如00:11:22:33:44:55。因此,我可以拆分用户定义的地址(例如使用split)来获取目标MAC地址的每6个部分,并使用hex函数将其转换为十六进制,但现在我想修改数据包的第一个字节以替换它们与这些hex ed字节。我应该如何继续?

我想过使用一些连接(。),但我认为这个解决方案很脏。一旦我得到了我的“u_char packet[]”,我只需要做一个memcpy我的用户提供的以太网(我以前在C中做过,但我希望这在Perl中完成),我只需要做memcpy我的用户提供的以太网地址到我的packet[]的6个第一个字节,它工作。

回答

1

vec函数用于标量值作为工作一个位矢量。

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

查看perldoc perlfuncsubstr()的描述。它有四个参数的形式,让您更换一个标量的部分:

substr EXPR, OFFSET, LENGTH, REPLACEMENT 

所以这样的事情应该为你工作:

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

您还可以使用pack将东西转换为字节。 – Eric 2009-07-24 08:37:49