2009-07-24 4 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 바이트입니다. 어떻게해야합니까?

일부 연결 (.)을 사용하여 생각했지만이 솔루션이 더러울 것이라고 생각합니다.

C로 생각했기 때문에 (이전에 C에서했기 때문에 Perl에서이 작업을 수행하고 싶습니다.) 일단 "u_char packet[]"을 얻었 으면 내 사용자 제공 이더넷의 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

substr()에 대한 설명을 perldoc perlfunc에서 확인하십시오. 그것은 당신이 스칼라의 부품을 교체 할 수 있습니다 네 매개 변수의 형식은 다음과 같습니다

substr EXPR, OFFSET, LENGTH, REPLACEMENT 

그래서 이런 걸 당신을 ​​위해 작동합니다 :

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

pack을 사용하여 항목을 바이트로 변환 할 수도 있습니다. – Eric