0

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

这里先有一点背景。我使用Net ::Pcap等,当我在处理数据包的函数中(由pcap_loop$packet

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

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

在 C 中思考(因为我前段时间在 C 中做过,但我希望在 Perl 中完成),一旦我得到我的“ u_char packet[]”,我只需要对memcpy前 6 个字节做一个用户提供的以太网地址我的packet[],它奏效了。

4

3 回答 3

2

看一下substr()in的描述perldoc perlfunc。它具有四参数形式,可让您替换标量的一部分:

substr EXPR, OFFSET, LENGTH, REPLACEMENT

所以这样的事情应该适合你:

substr $packet, 0, 6, $new_header
于 2009-07-24T08:34:45.160 回答
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];
}
于 2009-07-24T12:46:38.320 回答
-1
tcprewrite --enet-dmac=00:07:0d:0b:98:00 -i orignalmac.pcap -o newmac.pcap
于 2018-04-05T18:17:02.533 回答