PACKET SNIFFER - SOCKET RAW

cs_liquide Messages postés 1016 Date d'inscription samedi 22 mars 2003 Statut Membre Dernière intervention 24 juin 2008 - 22 juin 2008 à 01:26
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Derniè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.

https://codes-sources.commentcamarche.net/source/46893-packet-sniffer-socket-raw

Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
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)

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.
toonsmil Messages postés 1 Date d'inscription mardi 21 janvier 2003 Statut Membre Dernière intervention 11 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és 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
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és 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
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és 21 Date d'inscription mardi 13 février 2007 Statut Membre Dernière intervention 20 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és 2 Date d'inscription samedi 20 décembre 2008 Statut Membre Derniè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és 2 Date d'inscription samedi 20 décembre 2008 Statut Membre Derniè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és 5 Date d'inscription mercredi 1 juin 2005 Statut Membre Dernière intervention 20 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és 389 Date d'inscription dimanche 7 avril 2002 Statut Membre Dernière intervention 23 septembre 2016 2
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és 5 Date d'inscription mercredi 1 juin 2005 Statut Membre Dernière intervention 20 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és 389 Date d'inscription dimanche 7 avril 2002 Statut Membre Dernière intervention 23 septembre 2016 2
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és 138 Date d'inscription mercredi 5 février 2003 Statut Membre Derniè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és 718 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 22 novembre 2016 3
2 sept. 2008 à 22:11
A oui j'aime bien ce truc aussi ...

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...)
elguevel Messages postés 718 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 22 novembre 2016 3
2 sept. 2008 à 22:03
désolé, oublié la note ...
elguevel Messages postés 718 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 22 novembre 2016 3
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és 1016 Date d'inscription samedi 22 mars 2003 Statut Membre Dernière intervention 24 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és 389 Date d'inscription dimanche 7 avril 2002 Statut Membre Dernière intervention 23 septembre 2016 2
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és 1016 Date d'inscription samedi 22 mars 2003 Statut Membre Dernière intervention 24 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és 389 Date d'inscription dimanche 7 avril 2002 Statut Membre Dernière intervention 23 septembre 2016 2
23 juin 2008 à 14:06
Erreur ci dessus : essayes avec &h80 And &h80 \ 128 (et non pas &hff)
@+
Megafan
cs_Megafan Messages postés 389 Date d'inscription dimanche 7 avril 2002 Statut Membre Dernière intervention 23 septembre 2016 2
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és 1016 Date d'inscription samedi 22 mars 2003 Statut Membre Dernière intervention 24 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és 389 Date d'inscription dimanche 7 avril 2002 Statut Membre Dernière intervention 23 septembre 2016 2
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és 1016 Date d'inscription samedi 22 mars 2003 Statut Membre Dernière intervention 24 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és 389 Date d'inscription dimanche 7 avril 2002 Statut Membre Dernière intervention 23 septembre 2016 2
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és 1016 Date d'inscription samedi 22 mars 2003 Statut Membre Dernière intervention 24 juin 2008
22 juin 2008 à 01:26
"mEnteteIP.Flag = Buffer(6) And &HE0 \ 32"
es tu sur ?
Rejoignez-nous