2009-07-24 87 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