begin process at 2010 02 10 00:09:53
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Réseaux & Internet

 > [.NET2] WINPCAP WRAPPER

[.NET2] WINPCAP WRAPPER


 Information sur la source

Note :
9 / 10 - par 3 personnes
9,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Réseaux & Internet Source .NET ( DotNet ) Classé sous :winpcap, packet, capture Niveau :Expert Date de création :24/12/2006 Date de mise à jour :03/10/2007 15:10:04 Vu / téléchargé :13 127 / 1 123

Auteur : Willi

Ecrire un message privé
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (8)
Ajouter un commentaire et/ou une note


 Description

Cliquez pour voir la capture en taille normale
Ce wrapper de WinPcap fait parti d'un de mes projets professionnels, cela faisait un bout de temps que je le trainais sur mon disque.
Comme c'est noel je me suis décidé à partager ce petit cadeau :)

Vous devez installer le driver WinPcap auparavant: http://www.winpcap.org/ (peut importe la version,3 ou 4 beta du driver fonctionne correctement)
Si vous recherchez la doc du driver elle se trouve ici http://www.winpcap.org/devel.htm
Dans la solution se trouve un dossier Public, ces classes sont extraitent de JPcap une librairie Java exploitant WinPcap http://sourceforge.net/projects/jpcap  (et oui je n'invente rien).

J'ai également joint un fichier dump.txt que j'ai capturé avec cette source. Vous pouvez le visualiser dans la partie Dump -> Ouvrir.

La source est commentée mais sans plus, je me suis beaucoup inspiré des exmples fournis dans la doc de WinPcap.


Apercu de la classe WinPcapWrapper:

-Evénements:
--InnerMessage //Evénement pour les messages d'erreur internes.
--PacketArrival //Evénement d'arrivée d'un paquet.
--EndCapture //Evénement de fin de capture d'un paquet.
--StatisticsPackets //Evénement où sont recu les statistiques.

-Propriétés:
--DeviceHandle //Obtient le handle du matériel branché.
--Mode //Mode de capture du driver.
--IsEnabledDump //Indique si un dump sur la capture est ouvert.
--DumpHandle //Obtient le handle du dump.

-Méthodes publiques:
--GetDevices() //Obtient la liste des matériels réseaux présent.
--OpenDevice(PcapDevice device) //Ouverture d'un handle sur le matériel.
--OpenDevice(PcapDevice device, bool promisc) //Ouverture d'un handle sur le matériel.
--OpenDevice(PcapDevice device, bool promisc, int timeout) //Ouverture d'un handle sur le matériel.
--CloseDevice() //Libère le handle tenu sur le matériel.
--CloseDump() //Libère le handle tenu sur le fichier de dump.
--StartCapture() //Démarre la capture.
--StartCapture(string filter) //Démarre la capture en mettant un filtrage des paquets à capturer. (similaire à la méthode SetFilter(string filter)
--StartCapture(int packetcount) //Démarre la capture en se limitant à capturer un certains nombre de paquets.
--StartCapture(string filter, int packetcount) //Reprend les 2 méthodes ci-dessus.
--SetFilter(string filter) //Compile au niveau kernel une expression de filtre et associe le filtre au matériel.
--StopCapture() //Arrête la capture.
--OpenDump(string filename) //Ouverture d'un handle pour un dump de la capture.
--DumpPacket(Packet packet) //Ecriture d'un paquet dans le fichier dump.
--ReadDump(string filename) //Lecture d'un fichier de dump.

-Méthodes privées:
--WaitForStop() //Méthode bloquante sur le processus de capture tant que celui-ci n'est pas terminée ou arrêtée.
--CapturePacketLoop() //Méthode exécutant les procédures du processus de capture.
--GetNextPacket(out Packet packet) //Récupère le paquet suivant capturé.
--GetNextPacketOffline(IntPtr p, out Packet packet) //Récupère le paquet suivant capturé en mode dump (offline).
--SetMode(PcapMode value) //Applique un mode de capture supporté par le driver.
--InvokePacketArrivalEvent(Packet packet) //Méthode traitant l'arrivée d'un paquet suivant son mode de capture.
--InvokeEndCaptureEvent(DateTime date, bool error) //Méthode traitant la fin de réception d'un paquet.
--GetDatalink() //Récupère la couche réseau.
--GetErr(string prefix) //Traduit les erreurs internes de WinPcap.

-Apercu des autres classes
--WinPcapNative //Classe définissant les méthodes, structures, constantes du mode utilisateur du driver WinPcap (wpcap.dll).
--PcapHeader //Classe fournissant les données d'en-tête d'un paquet (wrapper de la structure pcap_pkhdr). Non héritable.
--PcapDevice //Classe fournissant les données sur un matériel réseau. Non héritable.
--EndCaptureEventArgs //Classe fournissant les données pour l'événement EndCapture.
--InnerMessageEventArgs //Classe fournissant les données pour l'événement InnerMessage.
--PacketArrivalEventArgs //Classe fournissant les données pour l'événement PacketArrival.
--StatisticsEventArgs //Classe fournissant les données pour l'événement StatisticsPackets.


 Conclusion

Voila....
J'attend vos critiques, notes, etc....

Bon dév à tous :)

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

03 octobre 2007 15:10:04 :
Mise à jour code

 Sources du même auteur

Source avec Zip Source avec une capture Source .NET (Dotnet) EXPLORER LA MFT D'UNE PARTITION NTFS
Source avec Zip Source avec une capture Source .NET (Dotnet) IPHELPER - PORTS TCP/UDP, TABLES DE ROUTAGE/ARP + FONCTIONS ...
Source avec Zip Source avec une capture Source .NET (Dotnet) PREVIEW HANDLER POUR OFFICE OUTLOOK 2007/10 SUR LES FICHIERS...
Source avec Zip Source avec une capture Source .NET (Dotnet) TEAM FOUNDATION SERVER - EXPLOITER LA PARTIE CLIENTE.
Source avec Zip Source avec une capture Source .NET (Dotnet) [.NET3.5] SYSTEM.IO.PIPES - UTILISATION D'UN CANAL NOMMÉ

 Sources de la même categorie

Source avec Zip Source avec une capture Source .NET (Dotnet) HTTP FLOOD STRESS TEST par NightMareLmW
Source avec Zip Source avec une capture Source .NET (Dotnet) SERVEUR/ESCLAVE MODBUS TCP/IP par SteveFuchsIT
Source avec Zip Source avec une capture Source .NET (Dotnet) IPHELPER - PORTS TCP/UDP, TABLES DE ROUTAGE/ARP + FONCTIONS ... par Willi
Source avec Zip Source avec une capture Source .NET (Dotnet) [.NET3.5] SYSTEM.IO.PIPES - UTILISATION D'UN CANAL NOMMÉ par Willi
Source avec Zip Source .NET (Dotnet) MESSAGES PERSOS MSN par XelectroX

 Sources en rapport avec celle ci

Source avec Zip Source .NET (Dotnet) CAPTURER UNE IMAGE DEPUIS UNE WEBCAM par Shad78
Source avec Zip Source .NET (Dotnet) CAPTURE CONTROL WINFORM par hadhber
Source avec Zip Source .NET (Dotnet) CONVERTION FLASH EN JPG par pasmago
Source avec Zip Source avec une capture Source .NET (Dotnet) CAPTURE D'ÉCRAN EN .NET 2.0 (SANS API) par sebmafate
Source avec Zip Source .NET (Dotnet) CAPTURE D'ÉCRAN À LA ONENOTE2003 par sebmafate

Commentaires et avis

Commentaire de ThaNerd le 27/08/2007 00:55:00

Excellent travail... J'ai quelques bugs à l'utilisation, mais j'ignore si ces bugs sont issus de la conjonction Vista + WinPcap 4.0 ou si ça vient du code... Un seul petit manque : une doc un peu plus prolixe...

Commentaire de bilinf23 le 19/11/2007 15:24:08

Excellent travail félicitation
je travail sur les captures et les détections d'intrusion sur les réseaux AD HOC sans fil.
Quand j'ai essayé votre application sa marche bien mais quand je select le capture pour la carte sans fil aucun affichage é aucune capture , je veux savoir c'est quoi le problème exacte et aussi comment détecte si c'est une lecture ou bien écriture sur le disque  MERCI .

Commentaire de gmanouvrier le 10/01/2008 10:34:12 9/10

Top,

Je m'en sert pour analyser le traffic http sur mon réseau (test de capture avec un filtre "ether port 80" ou "tcp port 80").
La récupération des IP source et destination est elle implémenté?
Si oui, en 2 mots : Comment?

;) Je n'est pas eu encore le temps de tout regarder.


Commentaire de babass123 le 04/05/2009 15:22:45 9/10

Un travail fort bien réussi.

Je l'utilise pour créer un sniffer un peu perfectionné (avec renvoi de paquet en fonction de règles établies).

Pour moi la seule méthode qui manque est une méthode d'émission de paquet (j'ai vu que les fonctions de winpcap nécessaires étaient importées) je vais donc la rajouter au code mais sinon rien à dire, c'est un bonheur d'utiliser la classe Packet ^^.

Juste peut être un petit problème (enfin je sais pas si ça vient pas de mon code mais j'arrive de tps en tps a tomber sur un écran bleu avec une erreur IRQ)


Merci pour le post ;)

Commentaire de Willi le 05/05/2009 20:54:56 administrateur CS

J'avoue ne pas avoir prêter attention aux fonctions winpcap d'émission de paquet voila pourquoi je ne l'ai est pas utilisé.
Pour l'écran je n'en ai jamais levé :).

Commentaire de babass123 le 05/05/2009 21:36:05

Je viens aussi d'implémenter la classe IP6Packet (pff c'est lourd à faire).

Sinon pour les erreurs IRQ j'arrive a en avoir autant que je veux ce soir. As tu déjà utiliser plusieurs LibWinPcap en parallèle? Personnellement j'ai plusieurs threads qui tournent (un pour chaque interface) et c'est au moment ou je les désactive que ça plante.(en général quand je rapproche activation et désactivation).

J'ai aussi réussi à lever une exception AccesViolationException lors de l'utilisation de la méthode StopCapture de la classe LibWinPcap. Pourtant le paramètre en entrée de pcap_close (c'est la que ça bloque précisément) semble correct...

Je vais y réfléchir et voir ce que ça donne.

Commentaire de E169484 le 05/08/2009 22:03:11

Bonjour ,
Tres Interessant , encore un peu complique pour moi car je suis debutant en C# et en analyse de protocole.
Je n'arrive pas a extraire les IP Source et Destination des packets (ou headers ?)et les visualiser dans une listview.
J 'utilise votre example "test" et essaye de mettre le code dans LibWinPcap_PacketArrival mais je ne vois pas comment extraire les IP des packets. Je suppose qu'on peut aussi utiliser le dossier public et les classes Java pour analyser les packets.
J 'aimerais que vous completiez "test" avec des examples d'interpretation de packet (protocol, adresses, etc..)



Merci Daniel
sK  

Commentaire de babass123 le 10/08/2009 20:04:24

Voila ma fonction de traitement d'arriver de paquet. Elle utilise une listview pour afficher les details du paquet.

void PaquetRecu(object sender, EventArgs e)
        {
            if (InvokeRequired)
            {
                this.Invoke(this.mydelegate, new Object[] { sender, e });
            }
            else
            {
                ThreadT T = (ThreadT)sender;
                ListViewItem Paquet = null;
                WinPcap.Public.Packets.Packet P = T.Paquet;
                bool Reconnu = true;
                EthernetPacket Peth = (EthernetPacket)P;
                if (Peth.EthernetProtocol == EthernetProtocols_Fields.IP)// || Peth.EthernetProtocol == EthernetProtocols_Fields.IPV6 )
                {
                        IPPacket PIP = (IPPacket)P;
                        if (PIP.IPProtocol == IPProtocols_Fields.TCP)
                        {
                            TCPPacket PTCP = (TCPPacket)P;
                            Paquet = new ListViewItem(new string[] { NumPaquet.ToString(), PTCP.Timeval.Date.TimeOfDay.ToString(), PTCP.SourceAddress, PTCP.SourcePort.ToString(), PTCP.DestinationAddress, PTCP.DestinationPort.ToString(), "IP/TCP", PTCP.PcapHeader.PacketLength.ToString() }, -1);
                        }
                        else if (PIP.IPProtocol == IPProtocols_Fields.ICMP)
                        {
                            ICMPPacket PICMP = (ICMPPacket)P;
                            Paquet = new ListViewItem(new string[] { NumPaquet.ToString(), PICMP.Timeval.Date.TimeOfDay.ToString(), PICMP.SourceAddress, "none", PICMP.DestinationAddress, "none", "IP/ICMP", PICMP.PcapHeader.PacketLength.ToString() }, -1);
                        }
                        else if (PIP.IPProtocol == IPProtocols_Fields.UDP)
                        {
                            UDPPacket PUDP = (UDPPacket)P;
                            Paquet = new ListViewItem(new string[] { NumPaquet.ToString(), PUDP.Timeval.Date.TimeOfDay.ToString(), PUDP.SourceAddress, PUDP.SourcePort.ToString(), PUDP.DestinationAddress, PUDP.DestinationPort.ToString(), "IP/UDP", PUDP.PcapHeader.PacketLength.ToString() }, -1);
                        }
                        else
                        {
                            //MessageBox.Show("Arrivée d'un paquet de protocole de couche 4 inconnu\n\n Numero Protocol: " + PIP.Protocol.ToString(), "Protocole non reconnu", MessageBoxButtons.OK);
                            //Reconnu = false;
                            Paquet = new ListViewItem(new string[] { NumPaquet.ToString(), PIP.Timeval.Date.TimeOfDay.ToString(), PIP.SourceAddress, "Unknown", PIP.DestinationAddress, "Unknown", "IP/Unknown", PIP.PcapHeader.PacketLength.ToString() }, -1);
                        }
                }
                else if (Peth.EthernetProtocol == EthernetProtocols_Fields.IPV6)
                {
                    IP6Packet PIP6 = (IP6Packet)P;
                    if (PIP6.Protocol == IP6Protocols_Fields.TCP)
                    {
                        TCPPacketIP6 PTCP = (TCPPacketIP6)P;
                        Paquet = new ListViewItem(new string[] { NumPaquet.ToString(), PTCP.Timeval.Date.TimeOfDay.ToString(), PTCP.SourceAddress, PTCP.SourcePort.ToString(), PTCP.DestinationAddress, PTCP.DestinationPort.ToString(), "IPv6/TCP", PTCP.PcapHeader.PacketLength.ToString() }, -1);
                    }
                    else if (PIP6.Protocol == IP6Protocols_Fields.ICMP)
                    {
                        ICMPPacketIP6 PICMP = (ICMPPacketIP6)P;
                        Paquet = new ListViewItem(new string[] { NumPaquet.ToString(), PICMP.Timeval.Date.TimeOfDay.ToString(), PICMP.SourceAddress, "none", PICMP.DestinationAddress, "none", "IPv6/ICMP", PICMP.PcapHeader.PacketLength.ToString() }, -1);
                    }
                    else if (PIP6.Protocol == IP6Protocols_Fields.UDP)
                    {
                        UDPPacketIP6 PUDP = (UDPPacketIP6)P;
                        Paquet = new ListViewItem(new string[] { NumPaquet.ToString(), PUDP.Timeval.Date.TimeOfDay.ToString(), PUDP.SourceAddress, PUDP.SourcePort.ToString(), PUDP.DestinationAddress, PUDP.DestinationPort.ToString(), "IPv6/UDP", PUDP.PcapHeader.PacketLength.ToString() }, -1);
                    }
                    else
                    {
                        //MessageBox.Show("Arrivée d'un paquet de protocole de couche 4 inconnu\n\n Numero Protocol: " + PIP6.Protocol.ToString(), "Protocole non reconnu", MessageBoxButtons.OK);
                        //Reconnu = false;
                        Paquet = new ListViewItem(new string[] { NumPaquet.ToString(), PIP6.Timeval.Date.TimeOfDay.ToString(), PIP6.SourceAddress, "Unknown", PIP6.DestinationAddress, "Unknown", "IPv6/Unknown", PIP6.PcapHeader.PacketLength.ToString() }, -1);
                    }
                }

                else if (Peth.EthernetProtocol == EthernetProtocols_Fields.ARP)
                {
                    ARPPacket PARP = (ARPPacket)P;
                    Paquet = new ListViewItem(new string[] { NumPaquet.ToString(), PARP.Timeval.Date.TimeOfDay.ToString(), PARP.SourceHwAddress, "none", PARP.DestinationHwAddress, "none", "ARP", PARP.PcapHeader.PacketLength.ToString() }, -1);
                }
                else
                {
                    if (Peth.DestinationHwAddress == "01:80:c2:00:00:00") //verification de STP par l'adresse de destination
                    {
                        Paquet = new ListViewItem(new string[] { NumPaquet.ToString(), Peth.Timeval.Date.TimeOfDay.ToString(), Peth.SourceHwAddress, "none", Peth.DestinationHwAddress, "none", "STP", Peth.PcapHeader.PacketLength.ToString() }, -1);
                    }
                    else
                    {
                        //MessageBox.Show("Arrivée d'un paquet de protocole de couche 3 inconnu\n\n Numero Protocol: " + Peth.EthernetProtocol.ToString(), "Protocole non reconnu", MessageBoxButtons.OK);
                        //Reconnu = false;
                        Paquet = new ListViewItem(new string[] { NumPaquet.ToString(), Peth.Timeval.Date.TimeOfDay.ToString(), Peth.SourceHwAddress, "none", Peth.DestinationHwAddress, "none", "Ethernet Unknown", Peth.PcapHeader.PacketLength.ToString() }, -1);
                    }
                }

                //Paquet = new ListViewItem(new string[] { NumPaquet.ToString(), P.Timeval.Date.TimeOfDay.ToString(), Peth.PcapHeader, "", "", "", "" }, -1);
                NumPaquet++;
                
                if (Reconnu)
                {
                    ListePaquets.Items.Add(Paquet);
                    Paquet.EnsureVisible();
                }
                Reconnu = true;
            }
        }

Ce qu'il faut retenir c'est que pour avoir les informations intéressantes il faut caster le paquet en fonction des champs de la couche protocolaire inférieure.
Mon code te donne de bons exemples. Concernant la listview, rien de plus simple comme tu peux le voir.
"Paquet.EnsureVisible();" permet d'effectuer le defilement.

PS: Je n'ai toujours pas pris le temps de m'occuper de la partie emission de mon programme mais je vous tiendrais informé quand cela sera fait.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Capture d'une image via un webcam, sans utiliser TWAIN [ par Naze ] Hello!Est-ce que quelqu'un connait une méthode SIMPLE (en c#) pour capturer une image via une webcam (du style Video for Windows)? j'ai déjà trouvé pa Capture image avec webcam en c# [ par fabialf ] Quelqu'un aurait-il le code de base pour faire une simple photo avec une webcam en c#.j'utilise la dll "DirectX.Capture" Capture d'Ecran [ par fdouieb ] Bonjour.J'utilise Visual Studio .Net 2003Je voudrais s'avoir s'il y a une possibilité de faire des captures d'écran automatique (que je sauvegarderai Capture d'Ecran [ par fdouieb ] Bonjour,a l'adresse suivante :http://www.csharpfr.com/forum.v2.aspx?ID=260557il y a la possibilité de faire des captures d'ecran.cela fonctionne bien Pilotage Scanner et/ou Adobe Capture [ par lawraC ] Bon, je sais que la question va en effrayer plus d'un et/ou plus d'une, mais voilà ce que j'aimerais faire. Un service utilise Adobe Capture pour tran Service Windows [ par edokt ] Bonjour j'ai creé un service windows en C# Est ce que c'est  possible de creer un packet d'installation qui install ce service ? Je veu Webcam en C# ? [ par mictif ] bonjour, Désolé je ne savez pas vraiment ou posté alors j'ai mis mon message ici ! J'aimerais faire une apli de visio conference (son interdire la capture d'écran sous Windows [ par vladam ] Bonjour,  Par mesure de sécurité, et afin de protéger des information contre l'impression,dans un logiciel, je dois interdire la c Comment faire une capture exclusive des évenements souris (l'évenement de la roulette) [ par MPousse ] Bonjour, j'ai un problème avec l'évenement de la roulette que j'arrive à utiliser dans mon control mais qui est également pass&#2 capture d'image avec WIA [ par Draven ] Bonjour,Alors voila mon problème:J'ai une webcam ou je récupere le flux avec la librairie de microsoft WIA.Et je voudrais faire une capture


Nos sponsors


Sondage...

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,686 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales