我希望有人可以帮我解决以下问题。我编写了一个Perl脚本来解析来自脱机Pcap文件的所有UDP数据包,然后使用Net :: Pcap和NetPacket将所有UDP数据写入文件。它适用于大多数pcap文件。我目前有一个Pcap文件,在IP标头之前有4个额外字节(Null / Loopback,Family:IP(2))。这导致我的脚本使用错误的字节检查协议类型。我看了一遍,并试图抵消字节,但无法搞清楚。有什么方法可以在循环()中检查空链接类型,删除多余的字节并将其保存回pcap文件。我尝试了很多方法,但每次只有我到达目的地,直到我遇到另一个问题。我已经看到了一些在循环方法中设置过滤器的示例,但这只是实时捕获。有什么建议吗?
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 {
}
}
答案 0 :(得分:0)
我认为你可能想在解码IP之前剥离以太网信息,例如:
my $ip = NetPacket::IP->decode(NetPacket::Ethernet::strip($packet));