Как удалить слой связи с данными из файла pcap?

Я делаю сценарий, который проверяет пакеты, но заголовки дают мне головную боль. У меня есть DSL-соединение / беспроводная связь дома, и в режиме захвата Wireshark появляется канальный уровень, PPP или WLAN, в зависимости от того, какой я сейчас использую.

Я искал thsark, editcap или tcpdump или любой другой учебник, но я не смог их найти.

В основном все, что мне нужно: input.pcap или что-то подобное.

Я нашел программу с именем bittwiste, но она работает с фиксированными размерами, как я понял, но мне нужно что-то "универсальное", где мне не нужно определять используемый тип ссылки + размер.

Любая помощь приветствуется!

Заранее спасибо.

1 ответ

Решение

С Perl и библиотеками Net::Pcap и Net::PcapWriter вы можете сделать следующее, чтобы удалить слой PPPoE. Это работает по крайней мере для моего маршрутизатора (fritz.box). Это должно быть адаптировано к другим инкапсуляциям:

#!/usr/bin/perl
# usage: pcap_remove_pppoe.pl infile.pcap outfile.pcap

use strict;
use warnings;
use Net::Pcap qw(pcap_open_offline pcap_loop pcap_datalink :datalink);
use Net::PcapWriter;

my $infile = shift or die "no input file";
my $outfile = shift;  # use stdout if not given

my $err;
my $pcap = pcap_open_offline($infile,\$err) or
    die "failed to open $infile: $err";
my $ll = pcap_datalink($pcap);
die "expected DLT_EN10MB, got $ll" if $ll != DLT_EN10MB;
my $offset = 14; # DLT_EN10MB

# open and initialize output
my $pw = Net::PcapWriter->new($outfile);

# process packets
pcap_loop($pcap, -1, sub {
    my (undef,$hdr,$data) = @_;
    my $dl = substr($data,0,$offset,''); # remove data link layer
    my $etype = unpack("n",substr($dl,-2,2)); # get ethernet type
    $etype == 0x8864 or return; # ignore any type except PPPoE Session

    substr($data,0,8,''); # remove 8 byte PPPoE layer
    substr($data,-2,2,pack("n",0x0800)); # set ethernet type to IPv4

    # output: data link layer with IP type + IP layer (PPPoE removed)
    $pw->packet($data, [ $hdr->{tv_sec},$hdr->{tv_usec} ]);
},undef);
Другие вопросы по тегам