sharptestt
Messages postés3Date d'inscriptionsamedi 30 décembre 2000StatutMembreDernière intervention30 octobre 2010 30 oct. 2010 à 17:39
Je me permet de relancer cette superbe source. par contre petite question, comment capturer les paquets qui utilisent le protocole FTP, SMTP, POP ou tout autre protocole du genre ?
babass123
Messages postés3Date d'inscriptionvendredi 1 mai 2009StatutMembreDernière intervention10 août 2009 10 août 2009 à 20:04
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);
}
}
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.
E169484
Messages postés1Date d'inscriptionsamedi 6 mars 2004StatutMembreDernière intervention 5 août 2009 5 août 2009 à 22:03
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
babass123
Messages postés3Date d'inscriptionvendredi 1 mai 2009StatutMembreDernière intervention10 août 2009 5 mai 2009 à 21:36
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.
cs_Willi
Messages postés2375Date d'inscriptionjeudi 12 juillet 2001StatutModérateurDernière intervention15 décembre 201823 5 mai 2009 à 20:54
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é :).
babass123
Messages postés3Date d'inscriptionvendredi 1 mai 2009StatutMembreDernière intervention10 août 2009 4 mai 2009 à 15:22
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 ;)
cs_gmanouvrier
Messages postés5Date d'inscriptionmardi 21 novembre 2000StatutMembreDernière intervention30 avril 2008 10 janv. 2008 à 10:34
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.
bilinf23
Messages postés1Date d'inscriptionsamedi 18 novembre 2006StatutMembreDernière intervention19 novembre 2007 19 nov. 2007 à 15:24
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 .
ThaNerd
Messages postés20Date d'inscriptionmercredi 9 février 2005StatutMembreDernière intervention31 mars 2011 27 août 2007 à 00:55
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...
30 oct. 2010 à 17:39
10 août 2009 à 20:04
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.
5 août 2009 à 22:03
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
5 mai 2009 à 21:36
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.
5 mai 2009 à 20:54
Pour l'écran je n'en ai jamais levé :).
4 mai 2009 à 15:22
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 ;)
10 janv. 2008 à 10:34
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.
19 nov. 2007 à 15:24
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 .
27 août 2007 à 00:55