begin process at 2010 03 21 19:27:54
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Réseaux & Internet

 > SNIFFER TCP AVEC LES RAW SOCKETS

SNIFFER TCP AVEC LES RAW SOCKETS


 Information sur la source

Note :
Aucune note
Catégorie :Réseaux & Internet Classé sous :Sniffer, TCP, Sockets, Raw, Trames Niveau :Débutant Date de création :25/01/2008 Date de mise à jour :25/01/2008 20:42:43 Vu / téléchargé :11 306 / 679

Auteur : lilxam7

Ecrire un message privé
Site perso
Commentaire sur cette source (17)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
Voici un petit code qui permet sniffer des trames TCP entrentent.
Il montre l'utilisation des Raw Sockets ainsi qu'une petite analyse des entetes TCP et IP.
Vous trouverez plus d'explication ici : http://lilxam.blogspot.com/2008/01/sniffer-tcp-wit h-raw-sockets.html

Voilà :).

Source

  • #include <cstdlib>
  • #include <iostream>
  • #include <winsock2.h>
  • #include <windows.h>
  • #pragma comment(lib,"ws2_32.lib")
  • #define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)
  • #define RCVALL_ON 1
  • #define RCVALL_OFF 0
  • using namespace std;
  • /*
  • Sniffer TCP with Raw Sockets by lilxam
  • */
  • typedef struct iphdr //Entete IP
  • {
  • unsigned char IHL:4;
  • unsigned char Version :4; // 4-bit IPv4 version
  • unsigned char TypeOfService; // IP type of service
  • unsigned short TotalLength; // Total length
  • unsigned short ID; // Unique identifier
  • unsigned char FlagOffset :5; // Fragment offset field
  • unsigned char MoreFragment :1;
  • unsigned char DontFragment :1;
  • unsigned char ReservedZero :1;
  • unsigned char FragOffset; //fragment offset
  • unsigned char Ttl; // Time to live
  • unsigned char Protocol; // Protocol(TCP,UDP etc)
  • unsigned short Checksum; // IP checksum
  • unsigned int Source; // Source address
  • unsigned int Destination; // Source address
  • }IP_HDR;
  • typedef struct tcphdr // Entete TCP
  • {
  • unsigned short PortSource;
  • unsigned short PortDest;
  • unsigned int seqnum;
  • unsigned int acknum;
  • unsigned char unused:4, tcp_hl:4;
  • unsigned char flags;
  • unsigned short window;
  • unsigned short checksum;
  • unsigned short urgPointer;
  • } TCP_HDR;
  • int main(int argc, char *argv[])
  • {
  • char ip[100];
  • unsigned short portS, portD;
  • char trame[4096];
  • char *donnees = NULL;
  • unsigned int option;
  • /* Accés au réseau */
  • WSAData wsa;
  • if(WSAStartup(MAKEWORD(2,2), &wsa) != 0)
  • {
  • printf("\n[!]Impossible d'acceder au reseau.\n--- Erreur avec WSAStartup() : %d\n\n", WSAGetLastError());
  • system("pause");
  • return 0;
  • }
  • /* Creation d'un socket
  • Référence : http://msdn2.microsoft.com/en-us/library/ms740506(VS.85).aspx
  • Prototype de la fontionc socket() :
  • SOCKET WSAAPI socket(
  • __in int af,
  • __in int type,
  • __in int protocol
  • );
  • */
  • SOCKET sock;
  • if((sock = socket(AF_INET, SOCK_RAW, IPPROTO_IP)) == INVALID_SOCKET)
  • {
  • printf("\n[!]Impossible de creer le socket.\n--- Erreur avec socket() : %d\n\n", WSAGetLastError());
  • system("pause");
  • return 0;
  • }
  • /* Initialisation des parametres d'écoute */
  • SOCKADDR_IN sin;
  • sin.sin_family = AF_INET;
  • sin.sin_addr.s_addr = inet_addr("192.168.0.11"); //Votre ip locale
  • /* Ecoute du réseau
  • Prototype de la fonction bind() :
  • int bind(
  • __in SOCKET s,
  • __in const struct sockaddr* name,
  • __in int namelen
  • );
  • */
  • if(bind(sock, (SOCKADDR*)&sin, sizeof(sin)) == SOCKET_ERROR)
  • {
  • printf("\n[!]Ecoute impossible.\n--- Erreur avec bind() : %d\n\n", WSAGetLastError());
  • closesocket(sock);
  • system("pause");
  • return 0;
  • }
  • /* Activation du mode promiscuous
  • Référence : http://msdn2.microsoft.com/en-us/library/ms741621(VS.85).aspx
  • Prototype de la fonction WASIoctl() :
  • int WSAIoctl(
  • __in SOCKET s,
  • __in DWORD dwIoControlCode,
  • __in LPVOID lpvInBuffer,
  • __in DWORD cbInBuffer,
  • __out LPVOID lpvOutBuffer,
  • __in DWORD cbOutBuffer,
  • __out LPDWORD lpcbBytesReturned,
  • __in LPWSAOVERLAPPED lpOverlapped,
  • __in LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
  • );
  • */
  • DWORD dwBytesRet;
  • WSAIoctl(sock,SIO_RCVALL,&option,sizeof(option),NULL,0,&dwBytesRet,NULL,NULL);
  • /* Gestion des données récupérées sur la trame */
  • iphdr *HeaderIP=(iphdr*)trame; // voila
  • tcphdr *HeaderTCP=(tcphdr*)(sizeof(iphdr)+trame);
  • donnees = (char *)(sizeof(tcphdr)+sizeof(iphdr)+trame);
  • char tmp[2048];
  • for(;;)
  • {
  • /* En attente de packet */
  • recv(sock, trame, sizeof(trame), 0);
  • /* Traitement des données */
  • printf("\n\n --------| Nouveau Packet |--------");
  • portS = ntohs(HeaderTCP->PortSource);
  • portD = ntohs(HeaderTCP->PortDest);
  • sprintf(ip,"%s:%d",inet_ntoa(*(struct in_addr *)&HeaderIP->Source), portS);
  • printf("\n [+]IP Source : %s",ip);
  • sprintf(ip,"%s:%d",inet_ntoa(*(struct in_addr *)&HeaderIP->Destination), portD);
  • printf("\n [+]IP Destination : %s",ip);
  • printf("\n [+]IP Version : %d -> 0x%x", HeaderIP->Version, HeaderIP->Version);
  • printf("\n [+]IP Checksum : %d -> 0x%x", HeaderIP->Checksum, HeaderIP->Checksum);
  • printf("\n [+]Protocol : %d -> 0x%x", HeaderIP->Protocol, HeaderIP->Protocol);
  • memset(tmp, 0, sizeof(tmp));
  • for(int i = 0; i <= 2048; i++)
  • {
  • tmp[i] = donnees[i];
  • }
  • printf("\n\n -----* Donnees *----- \n\n%s\n [...]\n ------------------------------\n", tmp);
  • }
  • closesocket(sock);
  • system("PAUSE");
  • return EXIT_SUCCESS;
  • }
#include <cstdlib>
#include <iostream>
#include <winsock2.h>
#include <windows.h>
#pragma comment(lib,"ws2_32.lib")

#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)
#define RCVALL_ON 1 
#define RCVALL_OFF 0

using namespace std;

/*
Sniffer TCP with Raw Sockets by lilxam
*/

typedef struct iphdr //Entete IP
{
  unsigned char  IHL:4; 
  unsigned char  Version   :4;  // 4-bit IPv4 version
  unsigned char  TypeOfService;           // IP type of service
  unsigned short TotalLength;  // Total length
  unsigned short ID;            // Unique identifier  
  unsigned char  FlagOffset   :5;        // Fragment offset field
  unsigned char  MoreFragment :1;
  unsigned char  DontFragment :1;
  unsigned char  ReservedZero :1;
  unsigned char  FragOffset;    //fragment offset
  unsigned char  Ttl;           // Time to live
  unsigned char  Protocol;      // Protocol(TCP,UDP etc)
  unsigned short Checksum;      // IP checksum
  unsigned int   Source;       // Source address
  unsigned int   Destination;      // Source address
}IP_HDR;   

typedef struct tcphdr // Entete TCP
{
    unsigned short PortSource;
    unsigned short PortDest;
    unsigned int seqnum;
    unsigned int acknum;
    unsigned char unused:4, tcp_hl:4;
    unsigned char flags;
    unsigned short window;
    unsigned short checksum;
    unsigned short urgPointer;
} TCP_HDR;
    
int main(int argc, char *argv[])
{
    char ip[100];
    unsigned short portS, portD;
    char trame[4096];
    char *donnees = NULL;
    unsigned int option;
    
    /* Accés au réseau */ 
    WSAData wsa;
    if(WSAStartup(MAKEWORD(2,2), &wsa) != 0)
    {
        printf("\n[!]Impossible d'acceder au reseau.\n--- Erreur avec WSAStartup() : %d\n\n", WSAGetLastError());
        system("pause");
        return 0;
    }

    /* Creation d'un socket 
    
    Référence : http://msdn2.microsoft.com/en-us/library/ms740506(VS.85).aspx
        
    Prototype de la fontionc socket() :
        SOCKET WSAAPI socket(
          __in  int af,
          __in  int type,
          __in  int protocol
        );
    */
    
    SOCKET sock;
    if((sock = socket(AF_INET, SOCK_RAW, IPPROTO_IP)) == INVALID_SOCKET)
    {
        printf("\n[!]Impossible de creer le socket.\n--- Erreur avec socket() : %d\n\n", WSAGetLastError());
        system("pause");
        return 0;
    }
   
    /* Initialisation des parametres d'écoute */
    SOCKADDR_IN sin;
    sin.sin_family = AF_INET;
    sin.sin_addr.s_addr = inet_addr("192.168.0.11"); //Votre ip locale
    
    /* Ecoute du réseau 
    
    Prototype de la fonction bind() :
        int bind(
          __in  SOCKET s,
          __in  const struct sockaddr* name,
          __in  int namelen
        );
    */
    
    if(bind(sock, (SOCKADDR*)&sin, sizeof(sin)) == SOCKET_ERROR)
    {
        printf("\n[!]Ecoute impossible.\n--- Erreur avec bind() : %d\n\n", WSAGetLastError());
        closesocket(sock);
        system("pause");
        return 0;
    }

    
    /* Activation du mode promiscuous 
    Référence : http://msdn2.microsoft.com/en-us/library/ms741621(VS.85).aspx
    
    Prototype de la fonction WASIoctl() :
        
        int WSAIoctl(
          __in   SOCKET s,
          __in   DWORD dwIoControlCode,
          __in   LPVOID lpvInBuffer,
          __in   DWORD cbInBuffer,
          __out  LPVOID lpvOutBuffer,
          __in   DWORD cbOutBuffer,
          __out  LPDWORD lpcbBytesReturned,
          __in   LPWSAOVERLAPPED lpOverlapped,
          __in   LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
        );
    */
    
    DWORD dwBytesRet;
    WSAIoctl(sock,SIO_RCVALL,&option,sizeof(option),NULL,0,&dwBytesRet,NULL,NULL);
    
    
    /* Gestion des données récupérées sur la trame */
    iphdr *HeaderIP=(iphdr*)trame; // voila
    tcphdr *HeaderTCP=(tcphdr*)(sizeof(iphdr)+trame);
    donnees = (char *)(sizeof(tcphdr)+sizeof(iphdr)+trame);
    char tmp[2048];
    
    for(;;)
    {
        /* En attente de packet */
        recv(sock, trame, sizeof(trame), 0);

        /* Traitement des données */
        printf("\n\n    --------| Nouveau Packet |--------");
        portS = ntohs(HeaderTCP->PortSource);
        portD = ntohs(HeaderTCP->PortDest);
        sprintf(ip,"%s:%d",inet_ntoa(*(struct in_addr *)&HeaderIP->Source), portS);
        printf("\n      [+]IP Source : %s",ip);
        sprintf(ip,"%s:%d",inet_ntoa(*(struct in_addr *)&HeaderIP->Destination), portD);
        printf("\n      [+]IP Destination : %s",ip);
        printf("\n      [+]IP Version : %d -> 0x%x", HeaderIP->Version, HeaderIP->Version);
        printf("\n      [+]IP Checksum : %d -> 0x%x", HeaderIP->Checksum, HeaderIP->Checksum);
        printf("\n      [+]Protocol : %d -> 0x%x", HeaderIP->Protocol, HeaderIP->Protocol);
        
        
        memset(tmp, 0, sizeof(tmp));
        for(int i = 0; i <= 2048; i++)
        {
            tmp[i] = donnees[i];
        }
        printf("\n\n    -----* Donnees *----- \n\n%s\n               [...]\n    ------------------------------\n", tmp);
        
    }

    closesocket(sock);
    
    system("PAUSE");
    return EXIT_SUCCESS;
}


 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
  • libws2_32.aTélécharger ce fichier [Réservé aux membres club]82 086 octets
  • main.cppTélécharger ce fichier [Réservé aux membres club]Voir ce fichier5 342 octets
  • Project1.devTélécharger ce fichier [Réservé aux membres club]881 octets

Télécharger le zip


 Historique

25 janvier 2008 16:31:11 :
Changement de catégorie
25 janvier 2008 20:18:46 :
Correction d'une erreur.
25 janvier 2008 20:42:43 :
idem

 Sources du même auteur

Source avec une capture STACK WATCHER
PROCESS DUMPER
Source avec Zip INJECTION DE DLL DANS UN PROCESSUS
PE ANALYSER

 Sources de la même categorie

Source avec Zip ÊTRE AVERTIS LORS D'UN NOUVEL ARTICLE SUR UN BLOG DE TYPE SK... par jojo930
Source avec Zip TIM_RESEAU, CLASSES POUR RESEAU COMPLET par williamallas
Source avec Zip INTERNET IP FINDER TROUVER VOS ADRESSE IP (INTERNET) par xmustapha
Source avec Zip CLIENT/SERVEUR AVEC TSOCKETSERVER & TCLIENTSOCKET par xmustapha
Source avec Zip REMOTE SHELL GEN par ganjarasta

 Sources en rapport avec celle ci

Source avec Zip PARALLEL OBJECT PROGRAMMING IN C++ (POP-C++) : DEMO par lwinkler
Source avec Zip COMMUNICATION CLIENT SERVEUR , TRANSMITION DE DONNÉES PAR TR... par Bug_Bug
Source avec Zip Source avec une capture [C/WINPCAP]SNIFFER TCP(ANALYSEUR DE TRAMES) POUR WINDOWS par psyphi
Source avec Zip SNIFFER D'EN-TÊTES par G0ss3Yn
Source avec Zip TUTORIAL : LES SOCKETS SOUS WIN (TCP & UDP) par vbnul

Commentaires et avis

Commentaire de max12 le 25/01/2008 20:13:58 administrateur CS

printf("\n[!]Ecoute impossible.\n--- Erreur avec bind() : %d\n\n", WSAGetLastError());

remplace %s par %d pour évider un crash monumental. Sinon sa l'air de bien marcher :D

Commentaire de lilxam7 le 25/01/2008 20:19:43

Oups oui voilà j'ai corrigé.

Commentaire de omnia le 26/01/2008 14:57:32

Ouai boff,

il y a déja plein de source de ce genre sur le site.
et intenet.

Il manque pleins de contrôles de retours ...

franchement je vois pas trop ce que cette source apporte?

bon codage et bonne continuation

Commentaire de Kian_ix le 15/05/2008 04:33:58

ca ne sniff aucun packet chez moi alors que je sais qu'il en transite plein, meme apres avoir entré la bonne ip...

Commentaire de lilxam7 le 15/05/2008 10:01:01

Es-tu sur que c'est la bonne ip ? As-tu un message d'erreur ?

Commentaire de ryder0007 le 25/06/2008 15:40:50

Chez moi ca marche pas a chaque fois il me dit qu'il y a une erreur avec bind

Commentaire de lilxam7 le 26/06/2008 09:57:37

Et quel est le code d'erreur ?

Commentaire de ryder0007 le 26/06/2008 14:09:30

Le code d'erreur est 10013.

Commentaire de lilxam7 le 28/06/2008 20:48:01

Tu peux te référer ici : http://msdn.microsoft.com/en-us/library/ms740668(VS.85).aspx

Apparemment c'est un problème de permission, regarde si tu ne reconnais pas sur ton système quelque chose qui correspondrait à ce qui est écrit en remarque.

Commentaire de omnia le 29/06/2008 12:33:10

Salut,

il faut être administrateur pour utiliser les raw socket !

Commentaire de Kian_ix le 24/08/2008 22:39:42

yop yop
je cherche un moyen de récupérer les paquets ip émis par le systeme (pas seulement recus)
y'a-t-il un moyen autre qu'avec winpcap ? (plutot du genre de cette source)

Commentaire de lilxam7 le 25/08/2008 10:02:55

Et bien cette source permet de récupérer les paquets reçus et émis. Les paquets émis auront ton ip en 'IP Source' tout comme les paquets reçus ont ton ip en 'IP Destination'. La récupération de l'ip de l'expéditeur se fait ici :

#  sprintf(ip,"%s:%d",inet_ntoa(*(struct in_addr *)&HeaderIP->Source), portS);
# printf("\n [+]IP Source : %s",ip);

Voilà j'espère avoir été clair.

Commentaire de omnia le 25/08/2008 17:47:23

bonsoir,

et bien non ce n'est pas vrais les paquets émis ne sont pas visibles en raw soket, à mois d'avoir un hub (concentrateur) sur le réseau qui réemet tous les paquets.

il faut soi créer son propre drivers avec un hook sur le soket soi avec lib pcap pas d'autres alternatives.

bon codage

Commentaire de lilxam7 le 25/08/2008 18:14:33

En es-tu sur ? Je ne vois pas pourquoi ils ne seraient pas visible.
J'ai loggé une session de 'sniff' et j'ai bien trouvé un paquet qui ressemble à une emission :

    --------| Nouveau Packet |--------
      [+]IP Source : 192.168.0.10 : 2809
      [+]IP Destination : 72.14.221.191:80 : 80
      [+]IP Version : 4 -> 0x4
      [+]IP Checksum : 22113 -> 0x5661
      [+]Protocol : 6 -> 0x6

    -----* Donnees *-----

GET /2008/01/sniffer-tcp-with-raw-sockets.html HTTP/1.1

Host: lilxam.blogspot.com

User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.0.1) Gecko/2008070208 Firefox/3.0.1

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Accept-Language: fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3

Accept-Encoding: gzip,deflate

Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7

Keep-Alive: 300

Connection: keep-alive

Cookie: __utma=195000368.766002268.1214856601.1219616479.1219679941.64; __utmz=195000368.1217256789.29.2.utmccn=(organic)|utmcsr=google|utmctr=PROCESSINFOCLASS|utmcmd=organic; __utmb=195000368.4.10.1219679941; __utmc=195000368

If-Modified-Since: Tue, 22 Jul 2008 14:50:07 GMT

If-None-Match: "857886ad-50f6-45c1-b291-9bbf0983ae0f"

Cache-Control: max-age=0




               [...]
    ------------------------------

On vois bien l'ip source (192.168.0.10) qui est la mienne. Donc voilà est-ce que tu pourrais expliquer ce qui te fais dire ça ?
Merci.

Commentaire de max12 le 26/08/2008 02:20:30 administrateur CS

Aucun problème a sniffer ses propre packet entrant/sortant ... L'histoire du hub c'est seulement avec le mode promiscious que c'est vrai pour écouter les packets adressés aux autre machines du réseau ...

Commentaire de omnia le 26/08/2008 12:54:34

bonjours,


bon bah un test tout simple on capture le réseau, et essayez de vous connectez a une page web.

voyez vous la requête GET de votre machine ?

Commentaire de omnia le 26/08/2008 13:13:38

Bon c vrais on peut récupéré les trames émises aussi je confond :p

c'est dans le cas de génération de trames qu'il faut utiliser un driver :p

bonne journée :)

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Raw Socket -> TCP/IP [ par krum ] Voila plus d'une semaine que je fouille/cherche sur les moteurs de recherches,les forums ..des sources,des tutos,des papers sur les raw sockets (sous Requêtes sortantes et raw sockets [ par Thib_G ] Bonjour, J'ai commenc&#233;, il y a quelque temps, un sniffer que je met r&#233;guli&#232;rement &#224; jour... Au d&#233;but, je r&#233;cup&#233;rai aide RAW sockets [ par alien9900 ] je veux une sur RAW Sockets;et merci; Sockets asychrones et client serveur TCP [ par argali ] Bonjour,Est-ce qqun pourrait m'indiquer ou je pourrai trouver un cours complet sur les sockets asynchrones et leurs options (WSAAsyncSelect, FD_ACCEPT Grave pb Raw socket [ par valoue ] Bonjour,J'essaie d'utiliser les Raw Socket afin de voir tout ce qui passe sur le reseau, ne garder que ce qui me concerne, et calculer le nbre de tram raw socket et protocole TCP/IP [ par robertmouac ] Bonjour tout le monde. Je suis en train de coder une version simplifier du protocol TCP/IP en raw socket. Je formate et deformate bien les trames (ve programmation avec les RAW sockets sous linux [ par sami0069 ] je veux savoir comment obtenir la taille de la fenetre de congestion d'une connexion TCP &#224; l'aide d'un programme en C.merci d'avance :) Aide Sniffer Wifi [ par cadavor ] Bonjour,J'ai un problème avec un projet que je n'arrive pas à commencer !Je possède une carte électronique (avec un FPGA, une borne wifi et une caméra RTP raw file [ par dodii ] Bonjour tout le monde,Pour mon projet de fin d'etude je suis entrain de preparer un sniffer en voip (il capture les communication VOIP sur le LAN et l Analyseur de trame en C++ [ par zebulon88 ] Bonjour Je cherche à analyser des trames tcp pour cela j'ai récupéré winpcap et un programme en C qui fonctionne très bien et m'affiche les packets s


Nos sponsors


Sondage...

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

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 (3)

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