Как удалить слой связи с данными из файла pcap?
Я делаю сценарий, который проверяет пакеты, но заголовки дают мне головную боль. У меня есть DSL-соединение / беспроводная связь дома, и в режиме захвата Wireshark появляется канальный уровень, PPP или WLAN, в зависимости от того, какой я сейчас использую.
Я искал thsark, editcap или tcpdump или любой другой учебник, но я не смог их найти.
В основном все, что мне нужно:
Я нашел программу с именем 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);