使用Perl脚本解析脱机pcap文件中的UDP数据包

使用Perl脚本解析脱机pcap文件中的UDP数据包,perl,udp,protocols,wireshark,pcap,Perl,Udp,Protocols,Wireshark,Pcap,我希望有人能帮我解决以下问题。我编写了一个Perl脚本来解析脱机Pcap文件中的所有UDP数据包,然后使用Net::Pcap和NetPacket将所有UDP数据写入一个文件。它可以在大多数pcap文件上正常工作。我目前有一个Pcap文件,其中在IP头之前有4个额外字节(Null/环回,Family:IP(2))。这导致我的脚本使用错误的字节检查协议类型。我找遍了所有地方,试图偏移字节,但找不出它。是否有方法在循环()中检查空链接类型,删除多余的字节并将其保存回pcap文件。我尝试了很多方法,但每

我希望有人能帮我解决以下问题。我编写了一个Perl脚本来解析脱机Pcap文件中的所有UDP数据包,然后使用Net::Pcap和NetPacket将所有UDP数据写入一个文件。它可以在大多数pcap文件上正常工作。我目前有一个Pcap文件,其中在IP头之前有4个额外字节(Null/环回,Family:IP(2))。这导致我的脚本使用错误的字节检查协议类型。我找遍了所有地方,试图偏移字节,但找不出它。是否有方法在循环()中检查空链接类型,删除多余的字节并将其保存回pcap文件。我尝试了很多方法,但每次都只是到了我遇到另一个问题为止。我见过一些例子,其中在循环方法中设置了过滤器,但这只是实时捕获。有什么建议吗

perl脚本:

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

$pcap = Net::Pcap::open_offline($_[0], \$err) or die "Can't read '$_[0]': $err\n";
Net::Pcap::loop($pcap, $maxpkts, \&process_packet, '');
Net::Pcap::close($pcap);

sub process_packet {
($user_data, $header, $packet) = @_;
my $ip = NetPacket::IP -> decode($packet);
# extract UDP packets from pcap file
if ($ip -> {proto} == IP_PROTO_UDP) {
    my $udp = NetPacket::UDP -> decode($ip -> {data});
    if (($udp -> {len} == 62) && ($udp -> {src_port} == 16800 || $udp -> {src_port} == 16700)) {
        $seconds = $header -> {tv_sec};
        $milliseconds = $header -> {tv_usec} / 1000000;
        $newtime = $seconds + $milliseconds;
        $count++;
        if ($count > 1) {
            $delta = $newtime - $oldtime;
        }
        print $pcap_tempfile $udp->{data};
        print "Packet $count: ", "DELTA ",  "\n";
        printf ".%06d", $header -> {tv_usec};
        $oldtime = $newtime;
    }
} else {

}

}

我认为您可能希望在解码IP之前剥离以太网信息,例如:

my $ip = NetPacket::IP->decode(NetPacket::Ethernet::strip($packet));