Парсинг пакетов UDP из автономного файла pcap с помощью скрипта Perl

Я надеюсь, что кто-то может помочь мне со следующей проблемой. Я написал сценарий Perl для анализа всех пакетов UDP из автономного файла Pcap, а затем записал все данные UDP в файл, используя Net::Pcap и NetPacket. Он отлично работает на большинстве файлов pcap. В настоящее время у меня есть файл Pcap, в котором перед заголовком IP есть 4 дополнительных байта (Null/Loopback, Family: IP (2)). Это заставляет мой скрипт проверять тип протокола, используя неправильный байт. Я просмотрел все и попытался сместить байт, но не могу понять это. Есть ли способ проверить нулевой тип ссылки в цикле (), удалить лишние байты и сохранить его обратно в файл pcap. Я пробовал несколько способов, но каждый раз, когда я сталкиваюсь с другой проблемой, это продвигает меня только так далеко. Я видел несколько примеров, где фильтр установлен в методе loop, но это только для живых снимков. Какие-либо предложения?

Wireshark изображение

скрипт 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 ответ

Я думаю, что вы можете удалить информацию Ethernet перед декодированием IP, например:

my $ip = NetPacket::IP->decode(NetPacket::Ethernet::strip($packet));
Другие вопросы по тегам