MTProd > Dev4all > Articles > Programmation > Réseau > Programmation Winsock avancée avec les systèmes NT > 6 Programmer un sniffer grâce aux raw sockets
Rechercher20 Personnes en-ligne
Programmation Winsock avancée avec les systèmes NT

6  Programmer un sniffer grâce aux raw sockets



6.1  Introduction

Ici nous allons étudier comment programmer un sniffer uniquement grâce aux fonctions que fournie la librarie Winsock 2. Celle-ci va nous permettre de récupérer grâce à un raw socket toutes les trames traversant notre réseau. Après les connaissances acquises précédemment cela ne va pas être très compliqué, nous prendrons uniquement conscience de deux nouvelles fonctions. Je voudrais quand même ajouter une petite précision sur le sniffer que nous allons programmé, malheureusement nous ne pourrons récupérer toutes les informations touchant au protocol Ethernet, comme l'adresse mac par exemple, le niveau d'implémentation de l'API Winsock 2 n'est pas asser bas pour récupérer ce type d'information.




6.2  Qu'est ce qu'un sniffer ?

Un sniffer est un programme nous permettant de capturer les trames traversant un réseau pour ensuite les affichées dans un format compréhensible pour l'être humain. Par ailleurs, il permet aux administrateurs de détecter des anomalies au niveau de leurs installations réseaux, ce qui est donc très utile, mais d'un autre coté, il va aussi rendre possible aux personnes mal intentionnées de récupérer des mots de passes ou toutes sortes d'informations interressantes passant sur un réseau.




6.3  Pratique

Passons maintenant à la partie la plus interressante, la programmation, enfin ceci est mon point de vue bien sûre. Donc je vais vite vous résumer les étapes que nous allons devoir franchir pour arriver à nos fins.

  • Initialiser Winsock dans sa version 2 ou supérieur.

  • Créer notre raw socket, qui nous servira à récupérer les trames réseaux.

  • Récupérer notre adresse IP locale pour ensuite l'assigner au socket grâce à la fonction bind()

  • Placer notre interface réseau en mode promiscuous grâce à la fonction WSAIoctl(), ce qui va permettre de récupérer toutes les trames transittant sur le réseau même celles qui ne nous sont pas destinées.

  • Lancer une boucle qui sera destinée à recevoir tous les paquets grâce à la fonction recvfrom().

  • Traiter les paquets reçus.


Maintenant nous allons étudier les seules choses que vous ne connaissez pas, c'est à dire les fonctions WSAIoctl et recvfrom().
Donc procédons à cette petite étude :

int WSAIoctl(SOCKET s, DWORD dwIoControlCode, LPVOID lpvInBuffer, DWORD cbInBuffer, LPVOID lpvOutBuffer, DWORD cbOutBuffer, LPDWORD lpcbBytesReturned, LPWSAOVERLAPPED lpOverlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine);

Cette fonction va nous être très utile, elle va permettre de passer notre interface réseau en mode promiscuous, ce qui aura pour but de pouvoir récupérer tous les paquets transittants sur le réseau même ceux qui ne nous sont pas destinés. Je préfère vous donner un exemple d'utilisation de cette fonction par la suite, vous pourrez vous renseigner sur le type et l'utilité de tous ses arguments sur msdn.microsoft.com ou encore dans le fichier d'aide "Win32 Programmer's Reference".


int recvfrom(SOCKET s, char FAR *buf, int len, int flags, struct SOCK_ADDR *from, int FAR *fromlen);

Cette fonction va permettre de recevoir les datagrammes passant sur le réseau tout en stockant leur adresse source. Elle prend comme premier argument un socket qui correspond pour nous, à notre raw socket, le second argument est un buffer dans lequel sera stocké les paquets reçus, le troisième argument correspond à sa taille, le paramètre flags n'est pas important pour nous, nous l'initialiserons à 0, la structure de type sock_addr correspondant au quatrième argument va servir à stocker les informations sur l'émetteur du paquet reçu, et enfin le dernier argument correspond à la taille "véritable" du buffer reçu. Si aucune erreur ne se produit, cette fonction renvoie le nombre de bytes recus, dans le cas contraire celle ci renvoie une erreur de type SOCKET_ERROR.

Je ne vais pas détailler toutes les opérations suivantes, comme par exemple traiter les paquets reçus, ce n'est que de la programmation et il n'y a aucune difficulté, je vais donc quand même vous donnez un exemple commenté de sniffer codé en C grâce à l'API Winsock 2.

RSniffer : http://www.dev4all.com/downloads/articles/redkod/winsock/rsniffer.c (ce fichier se trouve dans l'archive de cet article)





<<  5  Forger ses propres paquetsSommaire7  Références  >>

 Accés rapide

1  Winsock 2 et architecture
2  Les Sockets Streams
3  Les raw sockets
4  Les différents protocoles
5  Forger ses propres paquets
6  Programmer un sniffer grâce aux raw sockets

Introduction

Qu'est ce qu'un sniffer ?

Pratique

7  Références
8  Remerciements
Voir le sommaire complet

 Liens utiles

  • Publier un article
  • Envoyer cette page
  • Ecrire à l'auteur

  •  Mini-Chat

    Thienou (00h11): salut
    Thienou (00h13): Oula mon inscription date de 11 ans je me sent vieux :)
    neowolf25 (17h59): MMF2 en "pay what you want" jusqu'à demain sur
    neowolf25 (17h59): https://www.hu
    mblebundle.com/
    weekly

    Miuka (21h15): Coin coin de 2014
    Miuka (21h15): Des gens qui ont migré sur le forum Clickteam ou ailleurs ?
    Strike (09h45): Salut les vieux !
    Hikarion (12h46): Salut les djeunz
    Hikarion (13h38): A qui profite le scandale ?
    Hikarion (13h44): le chat irc est toujours actif ?

    Votre message



     Archives

     Dev4all Newsletter

    Restez à jour avec la newsletter mensuelle !

    Votre e-mail


    1800 abonnés

     Recommander Dev4all

    Recommandez Dev4all à un ami. Cela fera grandir notre communauté !

    E-mails de vos amis




    [ Accueil | S'inscrire | Mon Dev4all | Communauté | Téléchargements | Articles | Forums | Chat ]

    [ A propos de Dev4all | Aide | La charte Dev4all | Contact ]

    © 2000-2018 MTProd. Tous droits réservés.
    L'utilisation de Dev4all implique l'acceptation et le respect de la charte Dev4all.