如何修改数据包中的目标MAC地址?

时间:2009-07-24 08:28:57

标签: perl pcap

我有一个与Perl中非常基本的问题相关的问题,但我找不到有效的解决方案。

首先是一些上下文。我使用Net::Pcap等,当我在我的函数中处理数据包(由pcap_loop使用)时,我得到一个$packet标量,其中包含我的整个数据包(以太网头+ ip头+ tcp) / udp header + payload)。

我想要做的是更改此$packet(以太网目的地)的前6个字节,以便获得$packet我可以使用pcap_sendpacket发送的00:11:22:33:44:55,使用用户定义的目标mac地址(例如,作为命令行参数传递),例如split。所以我可以拆分用户定义的地址(例如使用hex)来获取目标mac地址的每6个部分,并使用hex函数将其转换为hex,但现在我想修改我的数据包的第一个字节用这些u_char packet[]个字节替换它们。我该怎么办?

我认为使用一些连接(。)但我认为这个解决方案很脏。

在C中思考(因为我之前在C中做过,但我希望在Perl中完成它),一旦我得到了“memcpy”,我只需要做{{1}我的用户提供的以太网地址到我packet[]的6个第一个字节,并且有效。

3 个答案:

答案 0 :(得分:2)

查看substr()perldoc perlfunc的说明。它有四参数形式,可以替换标量的部分:

substr EXPR, OFFSET, LENGTH, REPLACEMENT

所以这样的事情对你有用:

substr $packet, 0, 6, $new_header

答案 1 :(得分: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 :(得分:-1)

tcprewrite --enet-dmac=00:07:0d:0b:98:00 -i orignalmac.pcap -o newmac.pcap