File::PCAP::Reader and Parsing Pcap files with Perl

gfttwv5a  于 12个月前  发布在  Perl
关注(0)|答案(1)|浏览(109)

我有一个关于这个软件包https://metacpan.org/pod/File::PCAP::Reader的问题,我想使用Perl解析一些离线pcap文件,并提取源地址和目标地址,源MAC和目标MAC
尝试下面的转储数据包,但它在二进制格式是有一种方法来提取源和目的地地址?

use strict;
use warnings;
use File::PCAP::Reader;
use Data::Dumper;
 
my $fpr = File::PCAP::Reader->new( 'my.pcap' );
 
my $gh = $fpr->global_header();
 
while(1){
my $tsec = $fpr->next_packet();

print Dumper(\$tsec);
Dumper($tsec)
 }
j91ykkif

j91ykkif1#

看起来File::PCAP本身没有分解pcap中的数据包的能力。
另一种选择是NetPacket模块它既可以从pcap文件中读取,也可以访问mac地址和ip地址。
例如,这段代码展示了如何分解以太网数据包以获取mac地址,然后从以太网数据包中提取IPv4数据包(添加对IPv6的支持也是沿着同样的思路进行的)

use strict;
use warnings;

use Net::Pcap qw(:functions);
use NetPacket::Ethernet qw(:types);
use NetPacket::IP qw(:protos);

my $err;
my $maxpkts = 0;

my $filename = shift ;

my $pcap = Net::Pcap::open_offline($filename, \$err) 
    or die "Can't read '$filename': $err\n";
Net::Pcap::loop($pcap, $maxpkts, \&process_packet, '');
Net::Pcap::close($pcap);
exit;

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

    my $ether = NetPacket::Ethernet->decode($packet);

    # Only want IPv4 packets
    if ($type == ETH_TYPE_IP) {
        my $ip = NetPacket::IP->decode($ether);

        print "Src Mac $ether->{src_mac} Src IP $ip->{src_ip} -> Dst Mac $ether->{dest_mac} Dst IP $ip->{dest_ip}\n" ;
    }

}

当我保存上述文件readpcap.pl并运行它时,我得到了这个

$ perl runpcap.pl test.pcap
Src Mac 0050569b5015 Src IP 172.217.169.34 -> Dst Mac 00000c9ff01f Dst IP 10.20.228.41
Src Mac 00163e0002b8 Src IP 10.20.228.41 -> Dst Mac 0050569b5015 Dst IP 172.217.169.34
Src Mac 00163e0002b8 Src IP 10.20.228.41 -> Dst Mac 0050569b5015 Dst IP 172.217.169.34

相关问题