C++ Raw Socket

C++ Raw Socket - C++ - Programmation

Marsh Posté le 26-08-2004 à 00:37:26    

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 ;) ++

Reply

Marsh Posté le 26-08-2004 à 00:37:26   

Reply

Marsh Posté le 26-08-2004 à 01:23:21    

Tu as appelé WSAStartup ?

Reply

Marsh Posté le 26-08-2004 à 01:46:19    

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 ...

Reply

Marsh Posté le 26-08-2004 à 08:14:42    

Non, pas déclaré, appelé.

Reply

Marsh Posté le 26-08-2004 à 12:23:59    

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

Reply

Marsh Posté le 26-08-2004 à 12:48:49    

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
Reply

Marsh Posté le 26-08-2004 à 13:28:02    

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 ?

Reply

Marsh Posté le 26-08-2004 à 14:06:10    

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é?

Reply

Marsh Posté le 26-08-2004 à 14:33:17    

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
Reply

Marsh Posté le 26-08-2004 à 15:34:00    

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

Reply

Marsh Posté le 26-08-2004 à 15:34:00   

Reply

Marsh Posté le 26-08-2004 à 15:35:26    

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

Reply

Marsh Posté le 26-08-2004 à 16:02:48    

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
Reply

Marsh Posté le 26-08-2004 à 16:10:31    

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

Reply

Marsh Posté le 26-08-2004 à 16:46:18    

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


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 26-08-2004 à 16:51:16    

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));

Reply

Marsh Posté le 26-08-2004 à 18:39:33    

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

Reply

Marsh Posté le 26-08-2004 à 20:55:11    

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 ?

Reply

Marsh Posté le 26-08-2004 à 21:50:30    

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 !

Reply

Marsh Posté le 26-08-2004 à 22:46:24    

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

Reply

Marsh Posté le 26-08-2004 à 22:56:34    

ç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

Reply

Marsh Posté le 26-08-2004 à 23:07:40    

Accessoirement, c'est plutot 192.168.0.1 l'addresse valide

Reply

Marsh Posté le 27-08-2004 à 18:56:48    

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
Reply

Marsh Posté le 27-08-2004 à 19:11:55    

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 ^^

Reply

Marsh Posté le 28-08-2004 à 00:32:44    

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
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed