【发布时间】:2013-12-20 08:30:33
【问题描述】:
我希望有人可以帮助我解决以下问题。我编写了一个 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 {
}
}
【问题讨论】:
标签: perl udp protocols wireshark pcap