Capture de paquet UDP en c #

Wireshark capture les paquets UDP sur mon réseau local avec les détails suivants

Source IP 192.168.1.2 Destination IP 233.xxx Source Port 24098 Destination Port 12074,12330 

Comment puis-je le capturer en c #?

Résolu moi-même

Voici mon code de travail

 class CAA { private Socket UDPSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); private IPAddress Target_IP; private int Target_Port; public static int bPause; public CAA() { Target_IP = IPAddress.Parse("xxxx"); Target_Port = xxx; try { IPEndPoint LocalHostIPEnd = new IPEndPoint(IPAddress.Any, Target_Port); UDPSocket.SetSocketOption(SocketOptionLevel.Udp, SocketOptionName.NoDelay, 1); UDPSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, 1); UDPSocket.Bind(LocalHostIPEnd); UDPSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, 0); UDPSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(Target_IP)); Console.WriteLine("Starting Recieve"); Recieve(); } catch (Exception e) { Console.WriteLine(e.Message + " " + e.StackTrace); } } private void Recieve() { try { IPEndPoint LocalIPEndPoint = new IPEndPoint(IPAddress.Any, Target_Port); EndPoint LocalEndPoint = (EndPoint)LocalIPEndPoint; StateObject state = new StateObject(); state.workSocket = UDPSocket; Console.WriteLine("Begin Recieve"); UDPSocket.BeginReceiveFrom(state.buffer, 0, state.BufferSize, 0, ref LocalEndPoint, new AsyncCallback(ReceiveCallback), state); } catch (Exception e) { Console.WriteLine(e.ToSsortingng()); } } private void ReceiveCallback(IAsyncResult ar) { IPEndPoint LocalIPEndPoint = new IPEndPoint(IPAddress.Any, Target_Port); EndPoint LocalEndPoint = (EndPoint)LocalIPEndPoint; StateObject state = (StateObject)ar.AsyncState; Socket client = state.workSocket; int bytesRead = client.EndReceiveFrom(ar, ref LocalEndPoint); client.BeginReceiveFrom(state.buffer, 0, state.BufferSize, 0, ref LocalEndPoint, new AsyncCallback(ReceiveCallback), state); } public static void Main() { CAA o = new CAA(); Console.ReadLine(); } public class StateObject { public int BufferSize = 512; public Socket workSocket; public byte[] buffer; public StateObject() { buffer = new byte[BufferSize]; } } } 

La bibliothèque Winpcap est l’un des meilleurs moyens de le faire. J’ai de l’expérience dans ce domaine en C # et c’était vraiment facile de travailler avec cette bibliothèque.

Ce projet montre comment faire avec C #.

Pour ce faire, Wireshark utilise Winpcap et, comme l’indique l’autre réponse, vous pouvez également l’utiliser.

Vous pouvez également utiliser la classe System.Net.Sockets.Socket et la placer en mode promiscuous. J’utilise ceci pour capturer le trafic IP (par exemple, TCP et UDP) à partir d’une interface réseau donnée. Voici un exemple.

 using System.Net; using System.Net.Sockets; Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP); socket.Bind(new IPEndPoint(IPAddress.Parse("XXXX"), 0)); // specify IP address socket.ReceiveBufferSize = 2 * 1024 * 1024; // 2 megabytes socket.ReceiveTimeout = 500; // half a second byte[] incoming = BitConverter.GetBytes(1); byte[] outgoing = BitConverter.GetBytes(1); socket.IOControl(IOControlCode.ReceiveAll, incoming, outgoing); 

Maintenant que le socket est créé et configuré, vous pouvez utiliser la méthode Receive() pour commencer à recevoir des données. Chaque fois que vous appelez Receive() , le tampon renvoyé contient un paquet IP. Voir ici pour la répartition de l’en-tête IPv4, ici pour l’en-tête UDP et ici pour l’en-tête TCP. Si le champ Protocole de l’en-tête IP contient une valeur de 17, vous avez un paquet UDP.

REMARQUE Les sockets bruts sous Windows nécessitent que vous soyez un administrateur sur votre système local. La langue suivante est contenue dans cet article MSDN .

Pour utiliser un socket de type SOCK_RAW, des privilèges d’administrateur sont nécessaires. Les utilisateurs exécutant des applications Winsock utilisant des sockets bruts doivent être membres du groupe Administrateurs sur l’ordinateur local. Dans le cas contraire, les appels de sockets bruts échoueront avec un code d’erreur WSAEACCES. Sous Windows Vista et les versions ultérieures, l’access aux sockets bruts est imposé lors de la création du socket. Dans les versions antérieures de Windows, l’access aux sockets bruts était appliqué lors d’autres opérations sur les sockets.

Pour utiliser WinPcap pour la capture de paquets bruts en C #, vous pouvez essayer Pcap.Net . C’est un wrapper pour WinPcap en C ++ / CLI et C # qui permet de capturer facilement (renifler) et d’injecter des paquets bruts. Il contient également un cadre d’interprétation des paquets facile à utiliser.

Utilisation de Pcap.Net dans https://github.com/PcapDotNet

Exemple particulier: https://github.com/PcapDotNet/Pcap.Net/wiki/Pcap.Net-Tutorial-Interpreting-the-packets

 // Callback function invoked by libpcap for every incoming packet private static void PacketHandler(Packet packet) { // print timestamp and length of the packet Console.WriteLine(packet.Timestamp.ToSsortingng("yyyy-MM-dd hh:mm:ss.fff") + " length:" + packet.Length); IpV4Datagram ip = packet.Ethernet.IpV4; UdpDatagram udp = ip.Udp; // print ip addresses and udp ports Console.WriteLine(ip.Source + ":" + udp.SourcePort+ " -> " + ip.Destination + ":" + udp.DestinationPort); } 

Sortie: 2009-09-12 11:25:51.117 length:84 10.0.0.8:49003 -> 208.67.222.222:53 2009-09-12 11:25:51.212 length:125 208.67.222.222:53 -> 10.0.0.8:49003 2009-09-12 11:25:54.323 length:80 10.0.0.8:39209 -> 208.67.222.222:53 2009-09-12 11:25:54.426 length:75 10.0.0.8:47869 -> 208.67.222.222:53 2009-09-12 11:25:54.517 length:236 208.67.222.222:53 -> 10.0.0.8:39209 2009-09-12 11:25:54.621 length:91 208.67.222.222:53 -> 10.0.0.8:47869