我有一个与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个第一个字节,并且有效。
答案 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