use Net::Pcap; use NetPacket::Ethernet; use NetPacket::IP; use NetPacket::TCP; use NetPacket::UDP; use NetPacket::ICMP; use strict; sub parsePayload { my($payload, $text) = @_; # now i don't know what to do my $data = pack("A",$payload); print "Data: $data\n"; } sub getPayload { my ($userdata, $header, $packet) = @_; my $ether_data = NetPacket::Ethernet::strip($packet); my $ip = NetPacket::IP->decode($ether_data); if ( $ip->{'proto'} == 6 ) { print "TCP\n"; my $l4 = NetPacket::IP::strip($ether_data); my $tcp = NetPacket::TCP->decode($l4); my $payload = $tcp->{'data'}; &parsePayload("$payload","$userdata"); } elsif ( $ip->{'proto'} == 17) { print "UDP\n"; my $l4 = NetPacket::IP::strip($ether_data); my $udp = NetPacket::UDP->decode($l4); my $payload = $udp->{'data'}; &parsePayload("$payload","$userdata"); } elsif ( $ip->{'proto'} == 1) { print "ICMP"; my $l4 = NetPacket::IP::strip($ether_data); my $icmp = NetPacket::ICMP->decode($l4); my $payload = $icmp->{'data'}; &parsePayload("$payload","$userdata"); } else { print "Unknown packet!\n"; } } my $err; my $pcap_t; $pcap_t = Net::Pcap::open_offline($ARGV[0],\$err); Net::Pcap::loop($pcap_t, 0, \&getPayload, 1); Net::Pcap::close($pcap_t); print "Done.\n";