2013-05-09 2 views
1

장치에서 패킷을 필터링하고 해당 장치에서 특정 IP 주소로 패킷을 필터링하는 스크립트를 작성하려고했습니다. ==perl 및 Net :: Pcap 및 Net :: PcapUtils를 사용하여 특정 IP에서 패킷을 필터링합니다.

난 당신이 특정 장치를 선택하면 데이터가 난 와이어 샤크에서 얻을 출력처럼되고 싶어요 당신은 ip.src를 사용 xx.xx.xx.xx

내 프로그램은 지금까지

같다

#!/usr/bin/perl -w 
my $interface='eth1'; 

sub process_pkt #Packet processing routine 
{ 
my ($user_data,$header, $packet) = @_; 
my $minipacket = substr($packet,0,54); 
print ("\n## raw: ###\n"); 
print ($minipacket); 
print ("\n==Byte#/Hex/Dec/Bin==\n"); 
for ($i=0;$i<55;$i++) 
{ 
$hexval = unpack('H2',substr($packet,$i,1)); 
$decval = hex(unpack('H2',substr($packet,$i,1))); 
printf ("%03s-%02s-%03s-%08b\n", $i, $hexval, $decval, $decval); 
} 
} 
# ###################################################################### 

# Here we are invoking the NetPcap module and looping through forever. 
Net::PcapUtils::loop(\&process_pkt, 
SNAPLEN => 65536, #Size of data to get from packet 
PROMISC => 1, #Put in promiscuous mode 
FILTER => 'tcp', #only pass TCP packets 
DEV => $interface,); 

나는 점점 오전 출력 output

지금은 의 eth1 장치 및 xx.xx.xx.xx 0123의 soruce의 IP에서받은 패킷을 필터링 할Net :: PcapUtils :: loop의 필터 옵션을 사용하여이를 수행 할 수 있습니까? 데이터 길이 XX의 다음 내가 원하는 패킷 ... 나는 cpan.org 에있는 문서를 통과 시도하지만 난 찾을 모두 내가 예제를 찾을 수 없습니다 .. 옵션을 사용할 수 있습니다 ..

수 있습니다 누군가 나를 도와주세요.

개선 :

내가 코드의

FILTER => 'tcp' 

줄 끝에서

FILTER => 'ip src xx.xx.xx.xx' 

같은 것을 사용할 수 있습니까? 그리고 어떻게 든 데이터 길이 = 86 패킷을 필터링하기 위해 패킷의 데이터 길이를 포함 할 수 있습니까? i는 패킷의 페이로드를 얻기 위해 사용하고


대체 프로그램 :

#!/usr/bin/perl -w 
# ######################### 
# 
use Net::PcapUtils; 
use NetPacket::Ethernet qw(:strip); 
use NetPacket::IP; 
use NetPacket::TCP; 
use NetPacket::IP qw(:strip); 

my $interface= 'eth1'; 
my $snaplen= 65536; 
my $filter='tcp'; 
my $promisc = 1; 
my $timeout = 10000 ; 
my $err; 

sub process_pkt 
{ 
    my ($user_data,$header,$packet) = @_; 

$ip= NetPacket::IP->decode(eth_strip($packet)); 
    $tcp= NetPacket::TCP->decode($ip->{data}); 
    $payload = $tcp->{data}; 
    print ("payload: \n ".$payload." \n----end-----\n"); 
    for($i=0;$i<55;$i++){ 
    $hexval = unpack('H2',substr($payload,$i,1)); 
    open (MYFILE, '>>perldata1.txt'); 
    print MYFILE ($i." :hex: ". $hexval."\n"); 
    close (MYFILE); 
    } 
} 

Net::PcapUtils::loop(\&process_pkt, 
      SNAPLEN => 65536, 
      PROMISC => 1, 
      FILTER => 'tcp', 
      FILTER => 'ip src 129.7.236.40', 
      DEV => $interface,); 

하지만 여전히 데이터 필드의 길이를 얻는 방법을 알아낼 수 없습니다입니다. :( 감사합니다.

답변

0
#!/usr/bin/perl -w 
# ######################### 
# 
use Net::PcapUtils; 
use NetPacket::Ethernet qw(:strip); 
use NetPacket::IP; 
use NetPacket::TCP; 
use NetPacket::IP qw(:strip); 
use strict; 
use Data::Dumper; 
#use warnings; 

my $interface= 'eth1'; 
my $snaplen= 65536; 
my $filter='tcp'; 
my $promisc = 1; 
my $timeout = 10000 ; 
my $err; 
my @array; 
sub process_pkt 
{ 
    my ($user_data,$header,$packet) = @_; 

my $ip= NetPacket::IP->decode(eth_strip($packet)); 
    my $tcp= NetPacket::TCP->decode($ip->{data}); 
    my $payload = $tcp->{data}; 
    if(length($payload)==32) 
    { 
    for(my $decode=0;$decode<32;$decode++) 
    { 
    $array[$decode] = unpack('H2',substr($payload,$decode,1)); 
    } 
    my $length= scalar(@array); 
    open (MYFILE, '>doorstatus.tab'); 
    if($array[22] eq '0c') 
     { 
      print MYFILE (" Decision: Granted\n"); 
     } 
    elsif($array[22] eq '04') 
    { 
    print MYFILE ("Decision: Denied\n"); 
    } 
    elsif($array[22] eq '0d') 
    { 
    print MYFILE ("Decision: Locked\n"); 
    } 
    else 
    { 
    print MYFILE ("Decision: unknown \n"); 
    } 

    #print MYFILE (" Data: \n".Dumper(\@array)." \n"); 

    close (MYFILE); 
    } 
} 

Net::PcapUtils::loop(\&process_pkt, 
      SNAPLEN => 65536, 
      PROMISC => 1, 
      FILTER => 'tcp', 
      FILTER => 'ip src xx.xx.xx.xx', 
      DEV => $interface,); 

코드는 배열에 특정 소스에서 나오는 데이터를 필터링하고 당신이 그것으로 어떤 일을 할 수