如何从pcap文件中删除数据链路层?

时间:2014-01-12 11:30:17

标签: wireshark packet pcap editcap

我正在编写一个检查数据包的脚本,但标题让我很头疼。我家里有DSL连接/无线,数据链路层出现在Wireshark捕获中,无论是PPP还是WLAN,取决于我目前正在使用哪一个。

我一直在搜索thsark,editcap或tcpdump或其他任何教程,但我找不到。

基本上我只需要:< program_name_which_nicely_removes_transport_layer> input.pcap< output.pcap_only_containing_ethernet_header + ip + tcp + data>或类似的东西。

我找到了一个名为bittwiste的程序,但是我实现了固定大小的操作,但是我需要一些“通用”的东西,我不需要确定使用的链接类型+大小。

感谢任何帮助!

提前谢谢。

1 个答案:

答案 0 :(得分:0)

使用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);