如何修改报文的目的MAC地址?

发布于 2024-07-27 23:16:58 字数 815 浏览 5 评论 0原文

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

首先是一些背景信息。 我使用 Net::Pcap 等,当我在处理函数时数据包(由 pcap_loop 使用)我得到一个 $packet 标量,其中包含我的整个数据包(以太网标头 + ip 标头 + tcp/udp 标头 + 有效负载)。

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

我想过使用一些串联(.),但我认为这个解决方案很脏。

用 C 思考(因为我前段时间用 C 做过,但我希望用 Perl 完成),一旦我得到了“u_char packet[]”,我只需要做一个 <将用户提供的以太网地址的 code>memcpy 复制到 packet[] 的前 6 个字节,结果成功了。

I've a question related to a very basic thing in Perl, but I'm unable to find an efficient solution.

Here's a bit of context first. I use Net::Pcap etc and when I'm in my function which processes packets (used by pcap_loop) I get a $packet scalar which contains my whole packet (ethernet header + ip header + tcp/udp header + payload).

What I want to do is to change the first 6 bytes of this $packet (the ethernet destination) in order to get a $packet that I can send using pcap_sendpacket, using a user defined destination mac address (for example passed as a command line argument or so), such as 00:11:22:33:44:55. So I can split the user defined address (using split for example) to get every 6 parts of the destination mac address, and convert it to hex using the hex function, but now I want to modify the first bytes of my packet to replace them with these hexed bytes. How should I proceed ?

I thought using some concatenation (.) but I think that this solution is dirty.

Thinking in C (because I did it in C some time ago, but I want this to be done in Perl), Once I got my "u_char packet[]", I just had to do a memcpy of my user-supplied ethernet address to the 6 first bytes of my packet[] and it worked.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

戒ㄋ 2024-08-03 23:16:58
tcprewrite --enet-dmac=00:07:0d:0b:98:00 -i orignalmac.pcap -o newmac.pcap
tcprewrite --enet-dmac=00:07:0d:0b:98:00 -i orignalmac.pcap -o newmac.pcap
友欢 2024-08-03 23:16:58

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

substr EXPR, OFFSET, LENGTH, REPLACEMENT

所以像这样的东西应该适合您:

substr $packet, 0, 6, $new_header

Have a look at the description of substr() in perldoc perlfunc. It has four-parameter form that lets you replace parts of a scalar:

substr EXPR, OFFSET, LENGTH, REPLACEMENT

So something like this should work for you:

substr $packet, 0, 6, $new_header
云淡风轻 2024-08-03 23:16:58

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];
}

The vec function is used to work with a scalar value as a bit vector.

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];
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文