【问题标题】:Parsing UDP packets from offline pcap file with Perl script使用 Perl 脚本从离线 pcap 文件中解析 UDP 数据包
【发布时间】:2013-12-20 08:30:33
【问题描述】:

我希望有人可以帮助我解决以下问题。我编写了一个 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 {

}

}

【问题讨论】:

    标签: perl udp protocols wireshark pcap


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-09-11
      • 1970-01-01
      • 2019-08-02
      • 2022-07-08
      • 2023-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-25
      相关资源
      最近更新 更多