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

时间:2013-12-04 02:03:46

标签: perl udp protocols wireshark pcap

我希望有人可以帮我解决以下问题。我编写了一个Perl脚本来解析来自脱机Pcap文件的所有UDP数据包,然后使用Net :: Pcap和NetPacket将所有UDP数据写入文件。它适用于大多数pcap文件。我目前有一个Pcap文件,在IP标头之前有4个额外字节(Null / Loopback,Family:IP(2))。这导致我的脚本使用错误的字节检查协议类型。我看了一遍,并试图抵消字节,但无法搞清楚。有什么方法可以在循环()中检查空链接类型,删除多余的字节并将其保存回pcap文件。我尝试了很多方法,但每次只有我到达目的地,直到我遇到另一个问题。我已经看到了一些在循环方法中设置过滤器的示例,但这只是实时捕获。有什么建议吗?

Wireshark image

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 {

}

}

1 个答案:

答案 0 :(得分:0)

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

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