1

デバイスから、およびそのデバイス上の特定の IP アドレスからパケットをフィルター処理するスクリプトを作成しようとしています。

特定のデバイスを選択して ip.src==xx.xx.xx.xx を使用したときに、wireshark から取得した出力のようなデータが必要です

これまでの私のプログラムはこのようなものです

    #!/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, ); 

そして私は出力を得ています 出力

eth1デバイスで受信したパケットと、xx.xx.xx.xx の送信元 IP からのパケットを除外したいのですが、Net::PcapUtils::loop でフィルター オプションを使用できますか? そして、データ長 xx のパケットが必要です ... cpan.org のドキュメントを調べてみましたが、利用可能なオプションしか見つかりませんでした..例が見つかりませんでした..

誰かが私を助けてくれますか?

改善:

次のようなものを使用できますか

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

後に

FILTER => 'tcp'

コードの行?データ長= 86のパケットをフィルタリングするために、パケットのデータ長を何らかの形で含めることはできますか?


パケットのペイロードを取得するために使用している代替プログラム:

#!/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, );

しかし、データフィールドの長さを取得する方法をまだ理解できていません。:( ありがとう。

4

1 に答える 1