2009-07-24 18 views
0

Perlでは非常に基本的なことに関連する質問がありましたが、効率的な解決策を見つけることができません。パケットの宛先MACアドレスを変更するにはどうすればよいですか?

ここには少し前の文脈があります。私はNet::Pcapなどを使用しています。私がパケットを処理する(pcap_loopが使用する)私の関数には、私のパケット全体(イーサネットヘッダ+ IPヘッダ+ TCP/UDPヘッダ+ペイロード)を含む$packetスカラーがあります。私が何をしたいか

は、ユーザ定義の宛先MACアドレスを使用して、私はpcap_sendpacketを使用して送ることができる$packetを得るために、この$packet(イーサネット先)の最初の6つのバイトを変更することです(例えばとして渡さコマンドライン引数など)を入力します(例:00:11:22:33:44:55)。だから、splitを使ってユーザ定義のアドレスを分割し、宛先MACアドレスの6つの部分をすべて取得し、hex関数を使って16進数に変換することができます。しかし、パケットの最初のバイトを変更して置き換えますこれらのバイト数はhexです。私はどのように進めるべきですか?

私はいくつかの連結(。)を使用すると思ったが、この解決策は汚いと思う。

私は "u_char packet[]"を手に入れた後、私のユーザ提供のイーサネットのmemcpyを実行しなければなりませんでした(Cでこれをやっていましたが、これはPerlでやりたかったからです)私の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 perlfuncに見てください。それはあなたがスカラーの部品を交換することができます4つのパラメーターの形式は次のとおりです。

substr EXPR, OFFSET, LENGTH, REPLACEMENT 

したがって、このような何かがあなたのために働く必要があります。

substr $packet, 0, 6, $new_header 
+2

packを使用して、物をバイトに変換することもできます。 – Eric

関連する問題