Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1424 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  C++ Raw Socket

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

C++ Raw Socket

n°832423
Deimos_
Posté le 26-08-2004 à 00:37:26  profilanswer
 

Bonsoir à toutes et à tous,
 
Voilà je programme un sniffer en C++ avec les Raw Socket. Seulement il doit y avoir un problême quelque part, car TOUS les champs du packet (entête ip, icmp) ont comme valeur "204" ...
ip source : 204.204.204.204, ip destination = 204.204.204.204, ttl = 204, tos = 204 Etc !
 
VOici le bout du code nécessaire pour m'aider  :

Code :
  1. #define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)
  2. DWORD  dwBytesRet;
  3. unsigned int  optval = 1;
  4. WSAIoctl( sock, SIO_RCVALL, &optval, sizeof(optval), NULL, 0, &dwBytesRet, NULL, NULL);
  5. char paquet[8192];
  6. HEADERIP* IP_HDR = (HEADERIP*)paquet;
  7. HEADERICMP* ICMP_HDR = (HEADERICMP*)(sizeof(HEADERIP)+paquet);
  8.         while(!recv(socket,paquet,sizeof(paquet),0)) { }
  9. char source[16],dest[16],ttl[4],tos[4];
  10. strcpy(source,inet_ntoa(*(struct in_addr *)&IP_HDR->saddr));
  11. strcpy(dest,inet_ntoa(*(struct in_addr *)&IP_HDR->daddr));
  12. wsprintf(ttl,"%i",IP_HDR>ttl);
  13. wsprintf(tos,"%i",IP_HDR->tos);
  14. printf("IP Source : %s",source);
  15. printf("\nIp Destination : %s",dest);
  16. printf("\nTTL : %s",ttl);
  17. printf("\nToS : %s",tos);


 
Merci de m'aider, je galère vaiment trop avec cette erreur :s !
 
Bonne soirée ;) ++

mood
Publicité
Posté le 26-08-2004 à 00:37:26  profilanswer
 

n°832434
HelloWorld
Salut tout le monde!
Posté le 26-08-2004 à 01:23:21  profilanswer
 

Tu as appelé WSAStartup ?

n°832439
Deimos_
Posté le 26-08-2004 à 01:46:19  profilanswer
 

Ouais j'ai déclaré tout ça ! Mais ya aucun prob nivo compilage / linkage, si je les avait pas déclaré, il mettrait une erreur je pense ...

n°832465
Ace17
Posté le 26-08-2004 à 08:14:42  profilanswer
 

Non, pas déclaré, appelé.

n°832691
Deimos_
Posté le 26-08-2004 à 12:23:59  profilanswer
 

Oui bon je l'ai appelé, ok :
[cpp]
WSADATA wsa;
WSAStartup(MAKEWORD(2,0),&wsa);
[cpp]

n°832731
HelloWorld
Salut tout le monde!
Posté le 26-08-2004 à 12:48:49  profilanswer
 

C'est marrant parce que 204 en hexa ça fait 0xCC = valeur des variables de pile non initialisées.
En tous cas ça a l'air brouillon :  

Code :
  1. inet_ntoa(*(struct in_addr *)&IP_HDR->saddr));


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°832752
Deimos_
Posté le 26-08-2004 à 13:28:02  profilanswer
 

Je vois pas en quoi c'est brouillon, c'est la structure de la fonction inet_ntoa, c'est tout !
Si les variables de la pile ne sont pas initialisées, comment je dois les initaliser alors :s ?

n°832783
Ace17
Posté le 26-08-2004 à 14:06:10  profilanswer
 

Ne les initialise pas (je parle du tableau qui recoit le paquet), tout ce que tu risques, c'est de rendre ton probleme plus difficile a détecter. Es-tu sur que le recv a marché?

n°832823
HelloWorld
Salut tout le monde!
Posté le 26-08-2004 à 14:33:17  profilanswer
 

Deimos_ a écrit :

Je vois pas en quoi c'est brouillon, c'est la structure de la fonction inet_ntoa, c'est tout !
Si les variables de la pile ne sont pas initialisées, comment je dois les initaliser alors :s ?


 
et comme ça :

Citation :

inet_ntoa(*(struct in_addr *)&IP_HDR->saddr);
inet_ntoa(
    element_pointe_par(
        adresse_de(

            IP_HDR->saddr ) ) )


Et ca c'est une erreur de recopie ou c'est dans le code :

Code :
  1. wsprintf(ttl,"%i",IP_HDR>ttl);


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°832918
Deimos_
Posté le 26-08-2004 à 15:34:00  profilanswer
 

C'est une erreur de recopiage ^^
Non, ça marche touours pas :( ...

mood
Publicité
Posté le 26-08-2004 à 15:34:00  profilanswer
 

n°832923
Deimos_
Posté le 26-08-2004 à 15:35:26  profilanswer
 

mnt j'ai changé mon recv en recvfrom en rajoutant comme les deux bons arguments, mais toujours rien ...

n°832961
Ace17
Posté le 26-08-2004 à 16:02:48  profilanswer
 

Déja le probleme vient manifestement pas des inet_ntoa car tu nous dis que ca le fait aussi pour ttl et tos. Essaie de faire

Code :
  1. char paquet[8192];
  2. for(int i=0;i < 8192;++i)
  3.    paquet[i] = 0x22; // valeur arbitraire


Et dis nous ce que tu vois dans les champs de l'entete IP


Message édité par Ace17 le 26-08-2004 à 16:04:36
n°832974
Deimos_
Posté le 26-08-2004 à 16:10:31  profilanswer
 

Touours la même chose :S  
Un gars avait la même chose que moi (pour l'adresse ip), le cas est un peu différent car lui il utilise le protocole TCP, mais si vous voulez jeter un oeil : http://www.developpez.net/forums/viewtopic.php?p=1288411

n°833036
HelloWorld
Salut tout le monde!
Posté le 26-08-2004 à 16:46:18  profilanswer
 

Et t'as bien créer une socket SOCK_RAW, et ça a marché ?


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°833046
Deimos_
Posté le 26-08-2004 à 16:51:16  profilanswer
 

ouais :
 

Code :
  1. SOCKET sock2 = socket(AF_INET,SOCK_RAW,IPPROTO_IP);
  2. SOCKADDR_IN sin2;
  3. sin2.sin_family = AF_INET;
  4. sin2.sin_addr.S_un.S_addr = inet_addr("192.68.0.1" );
  5. bind(sock2,(SOCKADDR*)&sin2,sizeof(sin2));

n°833149
HelloWorld
Salut tout le monde!
Posté le 26-08-2004 à 18:39:33  profilanswer
 

tu tests pas sock2 ni bind... :sarcastic:
Faut des droits spéciaux pour les RAW SOCKET...

n°833256
Deimos_
Posté le 26-08-2004 à 20:55:11  profilanswer
 

Des droits spéciaux pour les raw socket :s ???
Tous les tutos que j'ai vu sur les raw sockets et toutes les sources que j'ai lu, j'ai jamais vu de truc spécial pour les raw socket !
Tu pourrais me dire ce que c que ces droits spéciaux :) ?
 

Code :
  1. #include
  2. #pragma comment(lib,"ws2_32.lib" )


 
Tu parles de ça ?

n°833285
Deimos_
Posté le 26-08-2004 à 21:50:30  profilanswer
 

Le problême vient en effet du recv() !
Car si je met (pour le test :) ) :  

Code :
  1. while(1)
  2. {
  3.  if(recv(sock2,paquet2,sizeof(paquet2),0))
  4.  { printf("lala" ); } }


 
Il devrait m'afficher "lala" lorsque je reçois un packet, or il m'affiche lala tout le temps, comme si le if() existait pas, mm que j'émet et reçois absolument aucun packet pendant 2 minutes, ça s'affiche touours ....
Comment ça se fait qu'il me saute ce if() alors ??? Prob au rec() c sûr, mais je vois pas pk !

n°833341
Ace17
Posté le 26-08-2004 à 22:46:24  profilanswer
 

Deimos_ a écrit :

Des droits spéciaux pour les raw socket :s ???
Tous les tutos que j'ai vu sur les raw sockets et toutes les sources que j'ai lu, j'ai jamais vu de truc spécial pour les raw socket !
Tu pourrais me dire ce que c que ces droits spéciaux :) ?
 

Code :
  1. #include
  2. #pragma comment(lib,"ws2_32.lib" )


 
Tu parles de ça ?


 
Non, rien a voir  :o

n°833352
Deimos_
Posté le 26-08-2004 à 22:56:34  profilanswer
 

ça marche mnt ......
Foutu Ip ! en fait je sniffais sur 192.68.0.1 alors qu'il fallait sniffer sur 127.0.0.1 ... :S

n°833379
Ace17
Posté le 26-08-2004 à 23:07:40  profilanswer
 

Accessoirement, c'est plutot 192.168.0.1 l'addresse valide

n°834477
HelloWorld
Salut tout le monde!
Posté le 27-08-2004 à 18:56:48  profilanswer
 

Pour l'histoire des droits, c'est pas de la prog, mais de la configuration système. Un compte Utilisateur limité ne peut pas créer de Raw Socket par exemple. C'est pareil sous UNIX, faut être root.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°834487
Deimos_
Posté le 27-08-2004 à 19:11:55  profilanswer
 

Ah okok ^^
Ace17 : ouais c'est vrai :) j'avais oublié le "1" mais même en sniffant sur 192.168.0.1 ça marchait pas ^^

n°834850
HelloWorld
Salut tout le monde!
Posté le 28-08-2004 à 00:32:44  profilanswer
 

Je viens aussi de lire que le SP2 de XP ajoute des conraintes sur les traffic Raw Socket sortant. Notamment, l'adresse IP source doit être valide, donc pas de IP spoofing...


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  C++ Raw Socket

 

Sujets relatifs
pb d'arg avec ioctl pour une rs232 en mode RAWSocket dans une dll
[Application Center Test] Qu'est ce qu'une socket error ?[Perl] probleme de socket bloquant
[Servlet Java] [Php] [Socket] Circulation des données Java <-> PhpErreur http 400 et socket
[Socket] Répondre à une requête HTTPSocket et Java
C# - Secruité socketpb transfert fichier -socket VC++6
Plus de sujets relatifs à : C++ Raw Socket


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR