IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

raw sockets et sniffer


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2005
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 18
    Par défaut raw sockets et sniffer
    Bonjour,
    Je commence les raw sockets en C++ par un sniffer, en regardant un code, j'ai à peu près compris comment ca fonctionne... Seulement, la réception d'un paquet renvoie l'erreur 10014...

    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <iostream.h>
    #include <winsock2.h>
    #define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)
     
    int main(void)
    {
     WSADATA wsaData;
     WSAStartup(MAKEWORD(2,2), &wsaData);
     SOCKET socksniffer;
     struct hostent *hp;
     socksniffer = WSASocket(AF_INET, SOCK_RAW, IPPROTO_IP, NULL, 0, WSA_FLAG_OVERLAPPED);
     
     struct sockaddr_in dest,from;
     char Hostname[32], packet[2048];
     DWORD dwBufferLen[10],dwBufferInLen = 1,dwBytesReturned = 0,dwSize;
     
     int fromlen = sizeof(from);
     
     dwSize = 32 * sizeof(DWORD);
     GetComputerName(Hostname,&dwSize);
     cout << Hostname;
     
     hp = gethostbyname(Hostname);
     int i = 0;
     while((hp->h_addr_list[i+1]) != NULL) i++;
     
     memcpy(&from.sin_addr.s_addr, hp->h_addr_list[i], hp->h_length);
     
     hp = gethostbyname(inet_ntoa(from.sin_addr));
     
     memcpy(&dest.sin_addr.s_addr, hp->h_addr_list[0], hp->h_length);
     dest.sin_family = AF_INET;
     dest.sin_port = htons(8000);
     
     bind(socksniffer, (PSOCKADDR)&dest, sizeof(dest));
     
     WSAIoctl(socksniffer, SIO_RCVALL, &dwBufferInLen, sizeof(dwBufferInLen), &dwBufferLen, sizeof(dwBufferLen),&dwBytesReturned , NULL , NULL);
     
     int sread;
     for(int j=0;j<5;j++)
      {
       sread = recvfrom(socksniffer, packet, 8191, 0, (struct sockaddr*)&from, &fromlen);
       if(sread <0 || sread == SOCKET_ERROR) cout << WSAGetLastError();
       cout << packet << "\n\n\n";
      }
     
     
     system("pause");
     WSACleanup();
     return 0;
    }
    J'aimerais savoir pourquoi il renvoie l'erreur 10014 et éventuellement avoir des remarques sur l'optimisation de ce code...

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    150
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 150
    Par défaut
    La 10014 c'est un BAD POINTER.

    Ou est initialisé "packet" ???

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2005
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 18
    Par défaut
    J'ai initialisé packet ligne 16...
    Mais je l'ai pas initialisé comme un pointeur mais comme une chaîne de caractères C...
    Il fallait que je le déclare come un pointeur ?
    Là, le problème qui se poserait serait que je ne saurais pas où le contenu arriverait ( j'utilise presque pas les pointeurs, moi )...

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    150
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 150
    Par défaut
    packet[2048];
    A donc une taille de 2048 octets


    sread = recvfrom(socksniffer, packet, 8191, 0 [...]

    Tu lui demandes de remplir un buffer de 8191 octets.

    Changes :

    sread = recvfrom(socksniffer, packet, 2048, 0 [...]

    Dis nous si ca corrige le probleme.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2005
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 18
    Par défaut
    OK, ca fonctionne...
    Par contre, mon buffer se résume à "E" pour n'importe quelle requête...

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    150
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 150
    Par défaut
    Peut etre un fin de ligne sur packet.
    Traces pas à pas et regardes le contenu de packet. En effet, a priori, packet contient toute sorte de données binaires, donc peut contenir un \0 à la deuxiement position.

    Cout va couper s'il rencontre un \0...

    Parcours plutot le buffer et affiches en hexadeximale chaque element du tableau packet.

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    150
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 150
    Par défaut
    Peut etre un fin de ligne sur packet.
    Traces pas à pas et regardes le contenu de packet. En effet, a priori, packet contient toute sorte de données binaires, donc peut contenir un \0 à la deuxiement position.

    Cout va couper s'il rencontre un \0...

    Parcours plutot le buffer et affiches en hexadeximale chaque element du tableau packet.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Février 2005
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 18
    Par défaut
    Tu as raison, (int)packet[1] renvoie "0"...
    Deux autre questions, comment isoler les requêtes passées sur un seul port ?
    Comment n'afficher que le "corps" de la requête ( c'est une en-tête, je suppose, ce que je recois comme premiers caractères, vu que je commence par "sniffer" des requêtes HTTP ) ?

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Février 2005
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 18
    Par défaut
    Je voudrais également pouvoir isoler la requête selon le "sens" ( du serveur à mon PC, et l'inverse )...

  10. #10
    Membre expérimenté
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    150
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 150
    Par défaut
    Pour ce genre de question je te renvoi vers le forum, plus specialisé de Programmation Reseaux.

    Quelques pistes, toutefois : regardes sur Google la norme du protocole HTTP...

    Je ne connais pas suffisament le sniff reso pour savoir detecter le sens de messages. Mais une documentation riche doit pouvoir se trouver sur Google.

    Enfin, penses à la la balise [Resolu], vu que ton probleme d'origine semble etre resolu.

    Merci.

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Février 2005
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 18
    Par défaut [Resolu]
    OK...
    Cependant, c'est pas seulement pour de l'HTTP que je fais ca...
    [Resolu]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. sniffer raw socket
    Par youp_db dans le forum C++
    Réponses: 5
    Dernier message: 12/09/2008, 08h38
  2. Réponses: 15
    Dernier message: 04/01/2007, 11h15
  3. [C#] raw socket?
    Par Blo0d4x3 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 29/12/2004, 12h20
  4. Raw socket
    Par trax44 dans le forum Assembleur
    Réponses: 2
    Dernier message: 24/11/2004, 18h26
  5. raw socket et langage c
    Par SlayDave dans le forum Développement
    Réponses: 2
    Dernier message: 29/08/2002, 19h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo