cs_liquide
Messages postés1016Date d'inscriptionsamedi 22 mars 2003StatutMembreDernière intervention24 juin 2008
-
22 juin 2008 à 01:26
Mayzz
Messages postés2813Date d'inscriptionmardi 15 avril 2003StatutMembreDernière intervention 2 juin 2020
-
11 févr. 2011 à 20:05
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
Mayzz
Messages postés2813Date d'inscriptionmardi 15 avril 2003StatutMembreDernière intervention 2 juin 202028 11 févr. 2011 à 20:05
Ben à mon avis ils ont du amélioré la sécurité sous Win7, essaye d'étudier la source pour comprendre le pourquoi du comment.
Pour ton envoi de paquets, tu verras vite que via les sockets c'est malheureusement impossible (en Raw). La solution est d'utiliser les API d'une DLL nommé winpcap. Il existe des wrapper en C# donc à traduire en VB.
Pour plus d'infos regarde ce post, cela te donnera une idée de la difficulté que j'ai rencontrée. D'ailleurs je n'ai jamais pu concrétiser mon projet. Il est tombé à l'eau car techniquement il est apparemment impossible d'envoyer des paquets sur le réseau (je parle de paquets brut)
En te souhaitant bon courage, tiens moi au jus si tu y arrive je serais fortement intéressé par une solution.
toonsmil
Messages postés1Date d'inscriptionmardi 21 janvier 2003StatutMembreDernière intervention11 février 2011 11 févr. 2011 à 19:01
Bonjour , cherchant a fair un sniffer raw socket pour capturer des paquets tcp en vb.net (et aussi pour envoyer des packets mais ca je verrais plus tard) je trouve cette source.Je me connecte a un serveur avec un client installé sur mon PC sous windows seven, je lance la source , je filtre avec la source le port qui m'interesse mais je rencontre un probleme : je recoit les paquets dans les 2 sens (client -> serveur , serveur -> client) mais je recois seulement les datas des paquets dans le sens client -> serveur et pas dans l'autre sens , savez vous d'ou cela peu venir ?
Mayzz
Messages postés2813Date d'inscriptionmardi 15 avril 2003StatutMembreDernière intervention 2 juin 202028 23 juin 2010 à 15:09
Juste une chose :
Dim FragmentOffset As Byte ' 13 et que font le 2 bits manquants ????
En fait ce sont plutôt les 3 bits manquants (mots de 16 bits de l'entête).
Et pour répondre : Les 3 derniers bits sont pour le flag ;O)
Mais je suppose que tu le sais déjà et que tu as simplement oublié de retirer ce com, mais je le poste quand même pour répondre à ceux qui se poseraient la question en te relisant.
Mayzz
Messages postés2813Date d'inscriptionmardi 15 avril 2003StatutMembreDernière intervention 2 juin 202028 18 juin 2010 à 20:04
Apréciable la facilité avec laquelle tu procède à l'analyse des entêtes.
Très bonne source, très instructive, bien codé et très facile à comprendre qui se font rare ici.
Pour moi c'est un 10 sans discuter.
Bravo !
informatixa
Messages postés21Date d'inscriptionmardi 13 février 2007StatutMembreDernière intervention20 février 2012 12 nov. 2009 à 22:24
Bonjour, voila mon souci le sniffer lit que les packet entrants mais pas les packet sortant pourquoi ?
ezio2000
Messages postés2Date d'inscriptionsamedi 20 décembre 2008StatutMembreDernière intervention 8 août 2009 8 août 2009 à 11:50
désolé, je traduis en français: Vista lire uniquement la sniffer les paquets entrants et sortants non. Pourquoi? comment lire les paquets sortants?
excusées, je traduis en français : avec Vista la sniffer loi seulement les paquets en entrée et pas ceux en sortie. Pourquoi? comment lire même les paquets en sortie ?
ezio2000
Messages postés2Date d'inscriptionsamedi 20 décembre 2008StatutMembreDernière intervention 8 août 2009 8 août 2009 à 00:03
on Vista the program reads ONLY incoming packets, and NOT outgoing packets... why???
cs_olivier_1968
Messages postés5Date d'inscriptionmercredi 1 juin 2005StatutMembreDernière intervention20 janvier 2009 20 janv. 2009 à 08:30
Tu as raison, c'est une question de droits administrateur, plutot curieux car je suis administrateur de ma machine mais il faut quand même que j'execute l'applciation en temps qu'administrateur !!!!
Les mysteres des UAC vista
A+
cs_Megafan
Messages postés389Date d'inscriptiondimanche 7 avril 2002StatutMembreDernière intervention23 septembre 20162 19 janv. 2009 à 16:55
Je pense qu'il faut donner des droits administrateurs à l'application non ?
Je ne suis pas le roi de Vista :)
Tiens moi au courant
cs_olivier_1968
Messages postés5Date d'inscriptionmercredi 1 juin 2005StatutMembreDernière intervention20 janvier 2009 12 janv. 2009 à 16:53
Salut Megafan et felicitation pour ton code, il m'a beaucoup aidé.
Par contre il semble qu'il ne fonctionne pas sur Vista, il y a une erreur au niveau de la création du socket :
RawSocket = New Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP)
Il part en erreur :
'une tentaive d'acces à un socket de maniere interdite par ses autorisations d'acces a été tentée'
Est-ce que quelqu'un a résolu ce pb ?
Merci d'avance
Olivier
cs_Megafan
Messages postés389Date d'inscriptiondimanche 7 avril 2002StatutMembreDernière intervention23 septembre 20162 23 sept. 2008 à 10:43
ELGUEVEL > Merci des conseils, je ne suis pas encore un 'puriste' question langage .net (je suis un vb6ien reconvertis)
MYKE > si le port Destination est 80 , il y a de forte chance, mais ce n'est pas obligé, perso j'utilise plusieurs serveur web sur une meme IP publique, donc je redirige mes paquets vers differents ports.
Tu peux aussi verifier le contenu, la présence des balises <html> et </html> est obligatoire dans la norme w3c.
cs_Myke
Messages postés138Date d'inscriptionmercredi 5 février 2003StatutMembreDernière intervention 2 février 2010 17 sept. 2008 à 21:22
Je ne suis pas expert en pacquet TCP. Mais ta source m'a aidé à comprendre plusieurs choses. J'ai besoin de savoir comment recuperer le protocole. Comme exemple en TCP, savoir que c'est du HTTP. J'ai regarder plusieurs explication sur les trame TCP et je ne crois pas que cette information soit dans le paquet. Je penche pour regarder sur quels ports le paquet est envoyé. Est-ce la bonne solution ?
elguevel
Messages postés718Date d'inscriptionjeudi 19 décembre 2002StatutMembreDernière intervention22 novembre 20163 2 sept. 2008 à 22:11
String.Format("- IP Destination : {0} ({1}) {2}{2}", TabInterfaces(NoInterface).IP_Dest(IdPacket), StrHost, vbCrLf)
C'est équivalent au "printf()" en C
Du plus si tu as des formats un peu spéciaux comme de l'integer, des dates, etc.. il te caste automatiquement les paramètres en String. Et tu peux modifier la présentations des formats (nb décimal sur entier, format de date, etc...)
elguevel
Messages postés718Date d'inscriptionjeudi 19 décembre 2002StatutMembreDernière intervention22 novembre 20163 2 sept. 2008 à 22:03
désolé, oublié la note ...
elguevel
Messages postés718Date d'inscriptionjeudi 19 décembre 2002StatutMembreDernière intervention22 novembre 20163 2 sept. 2008 à 22:02
Salut,
Sérieux tu t'es bien déchiré pour le découpage des paquets, très beau travail (10/10).
Par contre (soyons constructif) :
Dans FrmMain :
Tu utilise tes boucles "For Each" comme çà
Dim ip As IPAddress
For Each ip In HostEntry.AddressList
CmbInterface.Items.Add(ip.ToString)
Next
Alors que tu peux aussi l'écrire plus rapidement :
For Each ip As IPAddress In HostEntry.AddressList
CmbInterface.Items.Add(ip.ToString)
Next
Tu utilises (comme beaucoup) "MsgBox()" alors qu'il serai préférable d'oublier ses vieux truc VB et y remplacer par : MessageBox.Show(...)
[PS : j'ai même vu dans des bouquins édités par "Microsoft Press" l'utilisation des MsgBox dans du .Net]
Dans ClsInterface, tu utilises des fonctions pour te retourner des valeurs alors que tu pourrais utiliser des propriétés :
Exemple, remplacer :
Public Function IP_SProtocole(ByVal NoPacket As Integer) As String
Dim TempPacket As ClsPacket
TempPacket = Packets(NoPacket)
Return TempPacket.IP_SProtocole
End Function
Par :
Public ReadOnly Property IP_SProtocole(ByVal NoPacket As Integer) As String
Get
Return CType(Packets(NoPacket), ClsPacket).IP_SProtocole
End Get
End Property
Bon je continue à regarder ton code, qui m'intéresse beaucoup ... si j'ai d'autres remarques je les posteraient.
A+
cs_liquide
Messages postés1016Date d'inscriptionsamedi 22 mars 2003StatutMembreDernière intervention24 juin 2008 24 juin 2008 à 10:41
Bonjour,
pour int16 : et bien il me fallait un résultat (rapide), c'est facile à taper au clavier, un "object" m'aurait tout aussi bien convenu :) .
cs_Megafan
Messages postés389Date d'inscriptiondimanche 7 avril 2002StatutMembreDernière intervention23 septembre 20162 24 juin 2008 à 09:25
Salut,
Je ne sais pas ce que j'avais fumé hier, mais quand je refais les memes tests, les resultats sont faux.
Donc bilan :
Le \ est prioritaire par rapport au And
et donc il faut bien mettre des parenthéses et la bonne ligne à ecrire est
Dim s As Int32 = (b And &HE0) \ 128
bien que avec ce que tu m'as appris aussi on pourrais meetre
Dim s as Int32=(b and &he0) >> 7
par contre pourquoi reprendre les bytes en Int32 ?
Merci pour la correction.
@+
Megafan
cs_liquide
Messages postés1016Date d'inscriptionsamedi 22 mars 2003StatutMembreDernière intervention24 juin 2008 23 juin 2008 à 16:17
je comprend bien.
Mais j'ai beau retourner la situation dans tous les sens, je ne comprend pas d'ou vient mon erreur dans les calculs suivant :
Dim b As Byte = 69
Dim s As Int32 = (b And &HE0) \ 128
Dim C As Int32 = b And &HE0 \ 128
debug me donne :
s = 0
C = 1
cs_Megafan
Messages postés389Date d'inscriptiondimanche 7 avril 2002StatutMembreDernière intervention23 septembre 20162 23 juin 2008 à 14:06
Erreur ci dessus : essayes avec &h80 And &h80 \ 128 (et non pas &hff)
@+
Megafan
cs_Megafan
Messages postés389Date d'inscriptiondimanche 7 avril 2002StatutMembreDernière intervention23 septembre 20162 23 juin 2008 à 14:04
Salut,
3 choses :
1 - La critique positive est constructive. J'admet faire des erreurs (voir j'en fait souvent) donc je tire profis de chaque critique et je m'offisque rarement ;)
2 - le lien : Je ne connaissais pas l'existence de >> et << en VB.NET , donc ça m'evitera à l'avenir d'utiliser \ . Merci.
3 - Priorité : c'est pas clair dans le lien entre la priorité des opérateurs arithmétiques / opérateurs logiques.
par contre un exemple
dim a as byte= &hff and &h80 \ 128 (donc le 1er bit à gauche)
--> a =1
si on met des parenthéses
dim a as byte= &hff and (&h80 \ 128)
--> a=0
Donc le compilateur fait bien le And avant le \
Donc je comprends rien...
de toute façon avec l'opérateur >>,
il faudrait ecrire (&hff and &h80) >> 7 (et la, bien avec des parenthéses)
@+
Megafan
cs_liquide
Messages postés1016Date d'inscriptionsamedi 22 mars 2003StatutMembreDernière intervention24 juin 2008 23 juin 2008 à 12:58
Bonjur,
Loin de moi l'idée de vouloir démontrer quoi que ce soit.
Comme lors du debugage de ta class, j'ai eu le souci alors qu'un sniffer bidouillé ne donnait pas le même résultat, j'ai repris des tests simples en debug et sur une recherche j'ai trouvé cela :
http://msdn.microsoft.com/fr-fr/library/cc485067(VS.71).aspx
cs_Megafan
Messages postés389Date d'inscriptiondimanche 7 avril 2002StatutMembreDernière intervention23 septembre 20162 23 juin 2008 à 08:52
Salut,
Le And est prioritaire donc pas besoin de parenthèses, par contre pour la libilisité j'aurais du en mettre.
Pour les calculs , tout est dans la rfc, après avec des And et des \ on recupére les bits interressants.
@+
Megafan
cs_liquide
Messages postés1016Date d'inscriptionsamedi 22 mars 2003StatutMembreDernière intervention24 juin 2008 22 juin 2008 à 11:46
Salut, c'était juste une question de priorité d'opération entre le AND et le \:
"mEnteteIP.Flag = (Buffer(6) And &HE0) \ 32"
Ceci dit les calculs binaires (conversions) et les bitwises ne sont pas mes amis ce qui fait que je suis un peu perdu dans tous tes calculs.
cs_Megafan
Messages postés389Date d'inscriptiondimanche 7 avril 2002StatutMembreDernière intervention23 septembre 20162 22 juin 2008 à 09:53
Salut,
A priori oui, dis moi quel est ton souci ?
rfc791
flag se trouve sur le 7 eme octet donc buffer(6)
flag= 3 bits du haut, donc And &HE0 on ne garde que les 3 bits du haut.
\32 -> decale de 5 bits vers la droite
@+
Megafan
cs_liquide
Messages postés1016Date d'inscriptionsamedi 22 mars 2003StatutMembreDernière intervention24 juin 2008 22 juin 2008 à 01:26
"mEnteteIP.Flag = Buffer(6) And &HE0 \ 32"
es tu sur ?
11 févr. 2011 à 20:05
Pour ton envoi de paquets, tu verras vite que via les sockets c'est malheureusement impossible (en Raw). La solution est d'utiliser les API d'une DLL nommé winpcap. Il existe des wrapper en C# donc à traduire en VB.
Pour plus d'infos regarde ce post, cela te donnera une idée de la difficulté que j'ai rencontrée. D'ailleurs je n'ai jamais pu concrétiser mon projet. Il est tombé à l'eau car techniquement il est apparemment impossible d'envoyer des paquets sur le réseau (je parle de paquets brut)
Voila le lien :
http://www.codes-sources.com/forum/sujet-BAR-RESEAU-PARTAGE-ROUTAGE_1448100.aspx
En te souhaitant bon courage, tiens moi au jus si tu y arrive je serais fortement intéressé par une solution.
11 févr. 2011 à 19:01
23 juin 2010 à 15:09
Dim FragmentOffset As Byte ' 13 et que font le 2 bits manquants ????
En fait ce sont plutôt les 3 bits manquants (mots de 16 bits de l'entête).
Et pour répondre : Les 3 derniers bits sont pour le flag ;O)
Mais je suppose que tu le sais déjà et que tu as simplement oublié de retirer ce com, mais je le poste quand même pour répondre à ceux qui se poseraient la question en te relisant.
18 juin 2010 à 20:04
Très bonne source, très instructive, bien codé et très facile à comprendre qui se font rare ici.
Pour moi c'est un 10 sans discuter.
Bravo !
12 nov. 2009 à 22:24
8 août 2009 à 11:50
excusées, je traduis en français : avec Vista la sniffer loi seulement les paquets en entrée et pas ceux en sortie. Pourquoi? comment lire même les paquets en sortie ?
8 août 2009 à 00:03
20 janv. 2009 à 08:30
Les mysteres des UAC vista
A+
19 janv. 2009 à 16:55
Je ne suis pas le roi de Vista :)
Tiens moi au courant
12 janv. 2009 à 16:53
Par contre il semble qu'il ne fonctionne pas sur Vista, il y a une erreur au niveau de la création du socket :
RawSocket = New Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP)
Il part en erreur :
'une tentaive d'acces à un socket de maniere interdite par ses autorisations d'acces a été tentée'
Est-ce que quelqu'un a résolu ce pb ?
Merci d'avance
Olivier
23 sept. 2008 à 10:43
MYKE > si le port Destination est 80 , il y a de forte chance, mais ce n'est pas obligé, perso j'utilise plusieurs serveur web sur une meme IP publique, donc je redirige mes paquets vers differents ports.
Tu peux aussi verifier le contenu, la présence des balises <html> et </html> est obligatoire dans la norme w3c.
17 sept. 2008 à 21:22
2 sept. 2008 à 22:11
Au lieu de faire ta concaténation comme cela :
"- IP Destination : " + TabInterfaces(NoInterface).IP_Dest(IdPacket) + " (" + StrHost + ")" + vbCrLf + vbCrLf
Utilise :
String.Format("- IP Destination : {0} ({1}) {2}{2}", TabInterfaces(NoInterface).IP_Dest(IdPacket), StrHost, vbCrLf)
C'est équivalent au "printf()" en C
Du plus si tu as des formats un peu spéciaux comme de l'integer, des dates, etc.. il te caste automatiquement les paramètres en String. Et tu peux modifier la présentations des formats (nb décimal sur entier, format de date, etc...)
2 sept. 2008 à 22:03
2 sept. 2008 à 22:02
Sérieux tu t'es bien déchiré pour le découpage des paquets, très beau travail (10/10).
Par contre (soyons constructif) :
Dans FrmMain :
Tu utilise tes boucles "For Each" comme çà
Dim ip As IPAddress
For Each ip In HostEntry.AddressList
CmbInterface.Items.Add(ip.ToString)
Next
Alors que tu peux aussi l'écrire plus rapidement :
For Each ip As IPAddress In HostEntry.AddressList
CmbInterface.Items.Add(ip.ToString)
Next
Tu utilises (comme beaucoup) "MsgBox()" alors qu'il serai préférable d'oublier ses vieux truc VB et y remplacer par : MessageBox.Show(...)
[PS : j'ai même vu dans des bouquins édités par "Microsoft Press" l'utilisation des MsgBox dans du .Net]
Dans ClsInterface, tu utilises des fonctions pour te retourner des valeurs alors que tu pourrais utiliser des propriétés :
Exemple, remplacer :
Public Function IP_SProtocole(ByVal NoPacket As Integer) As String
Dim TempPacket As ClsPacket
TempPacket = Packets(NoPacket)
Return TempPacket.IP_SProtocole
End Function
Par :
Public ReadOnly Property IP_SProtocole(ByVal NoPacket As Integer) As String
Get
Return CType(Packets(NoPacket), ClsPacket).IP_SProtocole
End Get
End Property
Bon je continue à regarder ton code, qui m'intéresse beaucoup ... si j'ai d'autres remarques je les posteraient.
A+
24 juin 2008 à 10:41
pour int16 : et bien il me fallait un résultat (rapide), c'est facile à taper au clavier, un "object" m'aurait tout aussi bien convenu :) .
24 juin 2008 à 09:25
Je ne sais pas ce que j'avais fumé hier, mais quand je refais les memes tests, les resultats sont faux.
Donc bilan :
Le \ est prioritaire par rapport au And
et donc il faut bien mettre des parenthéses et la bonne ligne à ecrire est
Dim s As Int32 = (b And &HE0) \ 128
bien que avec ce que tu m'as appris aussi on pourrais meetre
Dim s as Int32=(b and &he0) >> 7
par contre pourquoi reprendre les bytes en Int32 ?
Merci pour la correction.
@+
Megafan
23 juin 2008 à 16:17
Mais j'ai beau retourner la situation dans tous les sens, je ne comprend pas d'ou vient mon erreur dans les calculs suivant :
Dim b As Byte = 69
Dim s As Int32 = (b And &HE0) \ 128
Dim C As Int32 = b And &HE0 \ 128
debug me donne :
s = 0
C = 1
23 juin 2008 à 14:06
@+
Megafan
23 juin 2008 à 14:04
3 choses :
1 - La critique positive est constructive. J'admet faire des erreurs (voir j'en fait souvent) donc je tire profis de chaque critique et je m'offisque rarement ;)
2 - le lien : Je ne connaissais pas l'existence de >> et << en VB.NET , donc ça m'evitera à l'avenir d'utiliser \ . Merci.
3 - Priorité : c'est pas clair dans le lien entre la priorité des opérateurs arithmétiques / opérateurs logiques.
par contre un exemple
dim a as byte= &hff and &h80 \ 128 (donc le 1er bit à gauche)
--> a =1
si on met des parenthéses
dim a as byte= &hff and (&h80 \ 128)
--> a=0
Donc le compilateur fait bien le And avant le \
Donc je comprends rien...
de toute façon avec l'opérateur >>,
il faudrait ecrire (&hff and &h80) >> 7 (et la, bien avec des parenthéses)
@+
Megafan
23 juin 2008 à 12:58
Loin de moi l'idée de vouloir démontrer quoi que ce soit.
Comme lors du debugage de ta class, j'ai eu le souci alors qu'un sniffer bidouillé ne donnait pas le même résultat, j'ai repris des tests simples en debug et sur une recherche j'ai trouvé cela :
http://msdn.microsoft.com/fr-fr/library/cc485067(VS.71).aspx
23 juin 2008 à 08:52
Le And est prioritaire donc pas besoin de parenthèses, par contre pour la libilisité j'aurais du en mettre.
Pour les calculs , tout est dans la rfc, après avec des And et des \ on recupére les bits interressants.
@+
Megafan
22 juin 2008 à 11:46
"mEnteteIP.Flag = (Buffer(6) And &HE0) \ 32"
Ceci dit les calculs binaires (conversions) et les bitwises ne sont pas mes amis ce qui fait que je suis un peu perdu dans tous tes calculs.
22 juin 2008 à 09:53
A priori oui, dis moi quel est ton souci ?
rfc791
flag se trouve sur le 7 eme octet donc buffer(6)
flag= 3 bits du haut, donc And &HE0 on ne garde que les 3 bits du haut.
\32 -> decale de 5 bits vers la droite
@+
Megafan
22 juin 2008 à 01:26
es tu sur ?