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

Réseau C Discussion :

probleme sniffer avec raw_socket


Sujet :

Réseau C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 15
    Par défaut probleme sniffer avec raw_socket
    Bonjour j'ai fait un sniffer simple mais qui ne marche pas. Je ne sais pas si c'est le code en lui meme car meme l'appel a WSAStartup echoue :S donc le reste je ne sais pas. Il me semble que ca fait ca pour tous mes programmes
    voici le 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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
     
    #define IPTOSTR(x) inet_ntoa(*((IN_ADDR*)&(x)))
     
    VOID dump_ip(PVOID buffer)
    {
    IPHEADER* ip = (PIPHEADER)buffer;
    buffer = ((char*)buffer) + ip->hlen * 4;
       switch(ip->protocole)
       {
          case IPPROTO_UDP :
          {
          UDPHEADER *udp = (PUDPHEADER)buffer;
             char datas[2048];
             BOOL r = strcpy_at(datas, (char*)buffer, sizeof(udpheader) + sizeof(ipheader));
             }
             else
             {
             char datas[2048];
             BOOL r = strcpy_at(datas, (char*)buffer, sizeof(udpheader) + sizeof(tcpheader)); // On recupere seulement les datas pas l'entete 
             save_datas_in_file(datas, udp->port_dst, IPTOSTR(ip->ip_source));
             }
          }
          break;
          case IPPROTO_TCP:
          {
          TCPHEADER* tcp = (PTCPHEADER)buffer;
          if (!(is_filtered_port(tcp_network_ports_filter, ntohs(tcp->port_dst)))) return;
          if (ntohs(tcp->port_dst) == 80 && tcp->flags != TCP_FIN) return;
          char datas[2048];
          BOOL r = strcpy_at(datas, (char*)buffer, sizeof(tcpheader) + sizeof(ipheader));
          save_datas_in_file(datas, tcp->port_dst, IPTOSTR(ip->ip_source));
          }
          break;
          case IPPROTO_ICMP:
          break;
          default:
          break;
       }
    }
     
    BOOL __stdcall strcpy_at(char src_tab[], char dst_tab[], SIZE_T index)
    {
    UINT nbr_chrs_copy = strlen(src_tab) - index;
    if (nbr_chrs_copy > strlen(dst_tab)) return FALSE;
    for (register UINT i = 0; i < nbr_chrs_copy; i++)
    dst_tab[i] = src_tab[index + i];
    dst_tab[strlen(dst_tab)] = '\0';
    return TRUE;
    }
     
    INT enable_rcvall(SOCKET s)
    {
    DWORD dwInBuffer = TRUE, dwBytesReturned;
    return WSAIoctl(s, SIO_RCVALL, &dwInBuffer, sizeof(dwInBuffer), NULL, 0, &dwBytesReturned, NULL, NULL);
    }
     
    DWORD sniffer()
    {
    WSADATA wsaData;
    if (WSAStartup(MAKEWORD(2, 0), &wsaData) != 0) return 0;
       else
       {
       SOCKET s;
       s = socket(PF_INET, SOCK_RAW, IPPROTO_IP);
       if (s == INVALID_SOCKET) return FALSE;
          else
          {
          DWORD sockopt = TRUE;
          if (setsockopt(s, IPPROTO_IP, IP_HDRINCL, (char *)&sockopt, sizeof(sockopt)) == SOCKET_ERROR) return FALSE;
             else
             {
             ULONG u_addr;
             if (resolve_computer_addr(&u_addr) == NULL) return FALSE;
                else
                {
                SOCKADDR_IN sock_in;
                ZeroMemory(&sock_in, sizeof(sock_in));
                sock_in.sin_family       = PF_INET;
                sock_in.sin_addr.s_addr  = u_addr;
                if (bind(s, (LPSOCKADDR)&sock_in, sizeof(sock_in)) == SOCKET_ERROR) return FALSE;
                   else
                   {
                   if (enable_rcvall(s) == SOCKET_ERROR) return FALSE;
                      else
                      {
                      SOCKADDR_IN from;
                      INT from_len;
                      char buffer[4096];
                         while (1)
                         {
                         memset(buffer, 0x0, 4096);
                         from_len = sizeof(from);
                         recvfrom(s, buffer, sizeof(buffer), 0, (LPSOCKADDR)&from, &from_len);
                         dump_ip(buffer);
                         }
                      }
                   }
                }
             }
          }
        closesocket(s);
       }
    }
    Je suis debutant donc aider moi si il y a des problemes dans le code merci
    et je sais qu'il y en a. De plus je travaille sous win XP SP2 et je suis en administrateur (utile pour les raw_sockets)

  2. #2
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    Tu fais comme tu le sens bien sûr, mais pour avoir bouffé des raw sockets sur pas mal d'OS (Windows, Linux, *nix-like, etc.), je peux te garantir un truc : c'est pas ce que je conseillerais à un débutant en C et/ou en réseaux...

    Si vraiment tu veux sniffer un réseau, passe par libpcap (Winpcap sous Windows), tu verras que tu as déjà largement de quoi t'occuper. Et au moins, ça t'évitera de te taper la tête contre les murs pour ouvrir une socket valide...

    Si l'immense majorité des sniffers (comme Wireshark par exemple) s'appuient exclusivement sur cette librairie, il y a une bonne raison, crois-moi...
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 15
    Par défaut
    En effet, suite a ton message j'ai commencé a programmer avec winpcap et c'est très intéressant mais tu n'aurais pas un tuto complet en pdf en anglais ou français parce que je n'aime pas trop la doc fragmentée. Merci

  4. #4
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015

Discussions similaires

  1. [String] Probleme incomprehensible avec split
    Par scorpiwolf dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 20/07/2004, 21h21
  2. [JTextAera][JScrollPane]Probleme mineur avec l'ascenseur
    Par Voxdei dans le forum Composants
    Réponses: 2
    Dernier message: 18/07/2004, 09h52
  3. [VB.NET] - Probleme Label avec Database
    Par codez dans le forum ASP.NET
    Réponses: 4
    Dernier message: 03/06/2004, 17h37
  4. probleme sql avec delphi
    Par lil_jam63 dans le forum Bases de données
    Réponses: 7
    Dernier message: 25/02/2004, 04h32
  5. probleme GRAVE avec directx 9
    Par l'arbre en plastique dans le forum DirectX
    Réponses: 3
    Dernier message: 02/09/2003, 23h59

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