PING (ICMP ET RAW SOCKET) DEV-CPP

ivdz Messages postés 17 Date d'inscription jeudi 4 juillet 2002 Statut Membre Dernière intervention 5 août 2003 - 16 juin 2003 à 17:29
nissanab Messages postés 2 Date d'inscription dimanche 20 mars 2011 Statut Membre Dernière intervention 30 avril 2011 - 30 avril 2011 à 21:29
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/10926-ping-icmp-et-raw-socket-dev-cpp

nissanab Messages postés 2 Date d'inscription dimanche 20 mars 2011 Statut Membre Dernière intervention 30 avril 2011
30 avril 2011 à 21:29
Slt

j'utilise actuellement le programme pingueur.c pour similer la commande dos ping (protocole ICMP), lorsque l'adresse IP est correcte le programme fonctionne bien, mais si je tape une adresse inexistante ou réseau non fonctionnel, il m'affiche "délai d'attente dépassé".

1) voci la partie du programme affichant ce message :
if (select(sock+1, &fdsr, NULL, NULL, &tv_timeout) <= 0)
{
// Dans le cas où le temps est écoulé, on veut sortir de la boucle
// on compte le paquet comme envoyé mais perdu
printf("D\202lai d'attente de la demande depass\202.\n");

2) En principe il doit afficher les autres cas lorsque le type
est différent de 8

if((icmphdr->type)!=8 && (icmphdr->code)!=0)
{
// En cas d'erreur, identification
switch(icmphdr->type)
{
case 3 :
printf("R\202ponse de %s : %s.\n", inet_ntoa(from- >sin_addr), Erreur3[icmphdr->code]);
envoye++;
return 1;
case 4 :
printf("R\202ponse de %s : %s.\n", inet_ntoa(from->sin_addr), Erreur4[icmphdr->code]);
envoye++;
return 1;
case 5 :
printf("R\202ponse de %s : %s.\n", inet_ntoa(from->sin_addr), Erreur5[icmphdr->code]);
envoye++;
return 1;
case 11 :
printf("R\202ponse de %s : %s.\n", inet_ntoa(from->sin_addr), Erreur11[icmphdr->code]);
envoye++;
return 1;
case 12 :
printf("R\202ponse de %s : %s.\n", inet_ntoa(from->sin_addr), Erreur12[icmphdr->code]);
envoye++;
return 1;


J'attends votre aide avec impatience et MERCI
nissanab Messages postés 2 Date d'inscription dimanche 20 mars 2011 Statut Membre Dernière intervention 30 avril 2011
18 avril 2011 à 16:42
slt
je viens d'exécuter ce pgm et il fonctionne correctement lorsq le ping passe mais lorsq ce dernier ne passe pas je n'aurai pas les messages d'erreurs qui ont été présentés dans le pgm , il m'affiche juste " délai d'attente dépassé " . je ne sais pas ou est le pb ...
veuillez svp me répondre le plutot possible .
retaks666 Messages postés 286 Date d'inscription jeudi 2 janvier 2003 Statut Membre Dernière intervention 16 juillet 2007
22 mai 2009 à 14:08
Petite chose quand même, le champ timestamp n'éxiste pas vraiment, il s'agit du champs data, et c'est d'ailleurs dommage qu'on ne puisse pas choisir le nombre d'octets à envoyer, et j'aurai mis le max_packet à plus que 1024. A part ça ça marche bien :)
cs_argentino Messages postés 2 Date d'inscription vendredi 24 février 2006 Statut Membre Dernière intervention 21 juin 2007
21 juin 2007 à 09:53
Bonjour,
Je trouve ton programme bien fait.
Mais, j'ai une question: Je voulais savoir si c'est possible à partir de plusieurs @IP, d'envoyer plusieurs ping avec ton programme.
Et si oui comment?

J'ai essayé avec une liste d'adresse predefinie dans un fichier mais ca ne marche bien.

Merci d'avance.

AD
morientes104 Messages postés 2 Date d'inscription vendredi 13 octobre 2006 Statut Membre Dernière intervention 30 octobre 2006
18 janv. 2007 à 11:44
ouaou ia du boulot deriere tous sa !
merci au posteur, meme si je vais jsut commencer a etudier le prog car a premiere vu jne pige rien :d
!!
cs_Zeroc00l Messages postés 367 Date d'inscription lundi 1 avril 2002 Statut Membre Dernière intervention 11 février 2010
31 août 2006 à 00:40
Chez moi , cette ligne renvoie toujours NULL :

sn = gethostbyaddr((char *)&in, 4, AF_INET);

WSAGetLastError() renvoie le code WSANO_DATA.
Une idée pourquoi ?
cs_Zeroc00l Messages postés 367 Date d'inscription lundi 1 avril 2002 Statut Membre Dernière intervention 11 février 2010
29 août 2006 à 22:35
Amelioration :
tv_timeout.tv_sec = tpslimite/1000; Nombre en seconde
tv_timeout.tv_usec = (tpslimite % 1000) * 1000; // et en micro seconde
cs_Zeroc00l Messages postés 367 Date d'inscription lundi 1 avril 2002 Statut Membre Dernière intervention 11 février 2010
29 août 2006 à 22:24
la variable "tpslimite" est pas initialisé a 1000 !!!
cs_Zeroc00l Messages postés 367 Date d'inscription lundi 1 avril 2002 Statut Membre Dernière intervention 11 février 2010
29 août 2006 à 21:59
Les message d'erreurs me semble bizarres !

Exemple :

le tableau Erreur12 contient deux chaines de 24 caracteres
Or dans "Option requise manquante" il y en a 25 (24 + le zero terminal)
Pour les autres tableaux, c'est pareil ...
cs_Zeroc00l Messages postés 367 Date d'inscription lundi 1 avril 2002 Statut Membre Dernière intervention 11 février 2010
29 août 2006 à 21:54
Encore quelques comentaires :)

Dans la la structure iphdr, le fait de preciser la taille de tous les argument en bit c pas tres joli :/

Ne devrais tu pas "packager" les structures ?

pour gcc : mettre "__attribute((packed))" entre l'accolade fermante de la declaration de la structure et avant le ';' final.

Pour packager sous borland il faut mettre avant les types a packager :
#pragma pack(push, 1)
et apres
#pragma pack(pop)
cs_Zeroc00l Messages postés 367 Date d'inscription lundi 1 avril 2002 Statut Membre Dernière intervention 11 février 2010
29 août 2006 à 21:27
Ah ça y est j'ai réussit à voter :)
cs_Zeroc00l Messages postés 367 Date d'inscription lundi 1 avril 2002 Statut Membre Dernière intervention 11 février 2010
29 août 2006 à 21:26
Le passage sous borland c++ builder 6 se fait sans probleme :

Menu : Fichier -> Nouveau -> Autre
Choisir "Expert console"
Clickez sur OK.
Décocher "Utiliser la VCL" et "utiliser la CLX"
Cocher "Application console"
Faites ce que vous voulez avec Multithread :)
Clickez sur OK

Dans le fichier génére par borland :
Remplacer la fonction main créée par borland par le contenu du fichier pingueur.c
Remplacez "sleep(1000);" par "Sleep(1000);" (chez moi le sleep semble bloquer indefiniment)

Menu Executer->Parametres
Mettez dans le textbox intitulé "Paramètres" : -t www.google.com
Clickez sur OK

Compilez et appreciez :)

Super source ! j'ai bien tenté de mettre un 10/10 mais le site me dit qu' "Il y a eu une erreur lors de la notation. Veuillez réesayer"

Note : les variables "recept" et "envoi" sont inutilisées, seule chose regrettable a mes yeux. Si tu trouves que c'est saoulant de faire la gestion des erreurs (je te comprends), mets au moins des assertions !
NikatorS Messages postés 147 Date d'inscription mercredi 18 septembre 2002 Statut Membre Dernière intervention 15 avril 2011
1 nov. 2005 à 23:14
Super j'avai besoin d'un example clair de l'utilisation du proto ICMP.
Je vais pouvoir créer un traceur des packets de chez soi jusqu'à une machine X. Un peu comme NeoTrace car mon but est de le reproduire mais en gratuit.
mellouli_oussama Messages postés 1 Date d'inscription mardi 18 octobre 2005 Statut Membre Dernière intervention 27 octobre 2005
27 oct. 2005 à 04:10
comment ca compile, avec quel compilateur, quels sont les libs requises?
wizard512 Messages postés 459 Date d'inscription dimanche 9 janvier 2005 Statut Membre Dernière intervention 11 mai 2013 2
9 juil. 2005 à 11:46
10/10
cs_durkheim Messages postés 2 Date d'inscription dimanche 12 septembre 2004 Statut Membre Dernière intervention 19 janvier 2005
19 janv. 2005 à 09:51
Absolument précis et clair, c'est exactement ce que je cherchais. Bravo!
roswell117 Messages postés 61 Date d'inscription jeudi 31 janvier 2002 Statut Membre Dernière intervention 18 novembre 2005
31 oct. 2004 à 14:28
je ne penses pas qu'il y ait un problème car c'est exactement ce qui est codé :

// Structure de l'en-tête IP
typedef struct iphdr {
unsigned int h_len:4;
unsigned int version:4;

h_len, soit la longueur, est codée sur 4 bits.
version, soit la version, est codée sur 4 bits.
4 bits+ 4 bits= 8 bits soit 1 octet.
Le compte est bon.
homer242 Messages postés 13 Date d'inscription mercredi 29 janvier 2003 Statut Membre Dernière intervention 30 septembre 2007
30 oct. 2004 à 22:13
y'a pas un problème dans la structure de l'ip ??

la version et la longueur de l'entete ip doit être codé sur un 1 octet et là je crois que c pas le cas....
GFACTION Messages postés 199 Date d'inscription lundi 19 mai 2003 Statut Membre Dernière intervention 7 avril 2005
21 mai 2004 à 15:16
non, j'ai rien dit
GFACTION Messages postés 199 Date d'inscription lundi 19 mai 2003 Statut Membre Dernière intervention 7 avril 2005
20 mai 2004 à 22:31
Error executing cl.exe.
pingueur.exe - 8 error(s), 17 warning(s)

J'ai ouvert le dsw, j'ai compilé et voilà le résulat.

Ca me saoule... Vous savez pourquoi ?
BlackGoddess Messages postés 338 Date d'inscription jeudi 22 août 2002 Statut Membre Dernière intervention 14 juin 2005
5 mai 2004 à 21:22
bin tu te fais une boucle et tu utilises son code ...
mIxtEr_ThE_BoSs Messages postés 13 Date d'inscription dimanche 28 mars 2004 Statut Membre Dernière intervention 8 mai 2004
5 mai 2004 à 18:28
Excusez-moi : il y a pas un code permettant de tester toutes les adresses IP les unes après les autres avec une requête "ping" dans une plage définie?
Exemple : de 121.0.0.0 à 122.0.0.0, ou 0.0.0.0 à 255.255.255.255 (euh... non, faut mieux pas, bonjour la connexion......)
mIxtEr_ThE_BoSs Messages postés 13 Date d'inscription dimanche 28 mars 2004 Statut Membre Dernière intervention 8 mai 2004
4 mai 2004 à 20:34
ché pa dou sa vi1 mé sou windobe xp fam ts lé prog sou dos y souvre é se kite juste apré
èce ke kelk1 peu médé?????????????????????,,
juki_webmaster Messages postés 947 Date d'inscription mercredi 19 novembre 2003 Statut Membre Dernière intervention 5 avril 2008 3
25 avril 2004 à 01:43
Exelent ! n'utilise pas la lib windows.h donc exelent !
9/10
Kornferki Messages postés 17 Date d'inscription jeudi 25 mars 2004 Statut Membre Dernière intervention 6 décembre 2004
28 mars 2004 à 14:48
Coucou,

Alors j ai passe le programme au sniffeur histoire de verifier les packets envoyes. J ai trouve quelques petites erreurs .... ce qui n enleve en rien a la qualite du programme.

Tout d abord, la taille des packets est egale a DATASIZE_ICMP - 8 (taille des headers du bloc ICMP). Cette taille correspond aussi a ce qui est donne par le ping du DOS. En letat 8octets et non 32.

Le TTL que tu indiques dans tes reply est pas le bon non plus. Remonte le TTL dans ta struct de deux lignes vers le haut et tu devrais lire le bon code.

Petites infos complementaires:
Il serait peut etre utile de mettre des caracteres non nuls et differents dans les paquets ICMP. Cela permettra d identifier plus rapidement d eventuels problemes.

Une question: tu saurais comment on pourrait passer a une taille variable de packets ? Le probleme que j ai identifie jusque la, c est que le code en l etat ne permettrait que d envoyer des packets de 500octets (du fait du type char).
BlackGoddess Messages postés 338 Date d'inscription jeudi 22 août 2002 Statut Membre Dernière intervention 14 juin 2005
3 nov. 2003 à 23:59
ce programme ne fonctionne bien sur qu'avec les raw sockets, et pas SOCK_STREAM qui définit un protocole plus haut dans le modele iso comme le tcp.

Sous NT, l'utilisation des raw sockets n'est possible QUE avec les droits administrateur ...
cbestern Messages postés 25 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 17 novembre 2003
3 nov. 2003 à 21:45
Qze, j'ai eu le même problème que toi, voila les modification que j'ai dut faire:
// Définition des messages d'erreur
char Erreur3[16][60];
char Erreur4[1][16];
char Erreur5[4][40];
char Erreur11[2][40];
char Erreur12[2][24];
//Erreur Erreur3[16];
int InitErr()
{
strcpy(Erreur3[0],"Réseau inaccessible");
strcpy(Erreur3[1],"R202seau inaccessible");
strcpy(Erreur3[2],"Impossible de joindre l'hote de destination");
strcpy(Erreur3[3],"Protocole inaccessible");
strcpy(Erreur3[4],"Port inaccessible");
strcpy(Erreur3[5],"Fragmentation necessaire");
strcpy(Erreur3[6],"Echec de la route source");
strcpy(Erreur3[7],"R202seau de destination inconnu");
strcpy(Erreur3[8],"Machine de destination inconnue");
strcpy(Erreur3[9],"Machine source isol202e");
strcpy(Erreur3[10],"R202seau de destination administrativement interdit");
strcpy(Erreur3[11],"Machine de destination administrativement interdite");
strcpy(Erreur3[12],"R202seau inaccessible pour TOS");
strcpy(Erreur3[13],"Machine inaccessible pout TOS");
strcpy(Erreur3[14],"Communication administrativement interdite par filtrage");
strcpy(Erreur3[15],"Violation de la pr202c202dence de la machine");
strcpy(Erreur3[16],"Coupure de la pr202c202dence en action");
strcpy(Erreur4[0],"D202bit trop 202lev202");
strcpy(Erreur5[0],"Redirig202 pour un r202seau");
strcpy(Erreur5[1],"Redirig202 pour une machine");
strcpy(Erreur5[2],"Redirig202 pour type de service et r202seau");
strcpy(Erreur5[3],"Redirig202 pour type de service et machine");
strcpy(Erreur11[0],"Time-to-live a 0 pendant le transit");
strcpy(Erreur11[1],"Time-to-live a 0 pendant le r202assemblage");
strcpy(Erreur12[0],"Mauvais en-tete IP");
strcpy(Erreur12[1],"Option requise manquante");
}
et juste apres le main() j'ai mis la fonction InitErr();

cela régleras ton problème de : initializer-string for array of chars is too long

(il y as sans doute une autre métode mais celle ci fonctionne)

par contre j'ai un problème, le programe devant être executer sous NT sans les droits admin, j'ai essayer de remplacé:
sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
par
sock = socket(AF_INET,SOCK_STREAM,0);
mais cela ne fonctionne pas, si quelqun as une idée ce serais superbe.

Sinon le programme en lui même, superbe
cs_QzE Messages postés 2 Date d'inscription jeudi 21 août 2003 Statut Membre Dernière intervention 22 août 2003
22 août 2003 à 17:14
vraiment, ce code es SUPER! *respect* j'ai cherché quelquechose comme ca depuis des semaines.
mais j'ai un problème: qu'est ce que tu as fait exactement dans le .dev fichier? quand je mets ton code dans mon seul projet ca ne va pas! compiler-erreur: initializer-string for array of chars is too long
tu peux m'aider?
je m'excuse pour mon francais, mais je suis suisse...
cs_QzE Messages postés 2 Date d'inscription jeudi 21 août 2003 Statut Membre Dernière intervention 22 août 2003
22 août 2003 à 17:14
vraiment, ce code es SUPER! *respect* j'ai cherché quelquechose comme ca depuis des semaines.
mais j'ai un problème: qu'est ce que tu as fait exactement dans le .dev fichier? quand je mets ton code dans mon seul projet ca ne va pas! compiler-erreur: initializer-string for array of chars is too long
tu peux m'aider?
je m'excuse pour mon francais, mais je suis suisse...
BlackGoddess Messages postés 338 Date d'inscription jeudi 22 août 2002 Statut Membre Dernière intervention 14 juin 2005
25 juin 2003 à 16:55
les raw_socket ne sont en effet disponible que sous nt, 2000 et xp, et qu'avec les droits admin parait-il
BlackGoddess Messages postés 338 Date d'inscription jeudi 22 août 2002 Statut Membre Dernière intervention 14 juin 2005
25 juin 2003 à 16:54
en lecture, c sur, mais je n'y parviens en ecriture
cs_Kikyo Messages postés 10 Date d'inscription samedi 28 octobre 2000 Statut Membre Dernière intervention 25 juin 2003
25 juin 2003 à 10:27
Je crois que Windows 95/98/Me bloque l'accès aux entêtes IP, et le seul moyen que j'avais pu voir un jour c t de na pas passer par Winsock et de tout gérer avec le soft en Récupérent les infos de la Cartes Rézo ect ect (enfin c à vérifier, je suis pas sur du system de fonctionnement).

Sinon parait-il que l'accès aux Entêtes IP sous NT/XP est possible.
BlackGoddess Messages postés 338 Date d'inscription jeudi 22 août 2002 Statut Membre Dernière intervention 14 juin 2005
18 juin 2003 à 21:27
apres des recherches sur le net, il semblerais que ce ne soit pas possible avec les raw_sockets de windows... a verifier.
BlackGoddess Messages postés 338 Date d'inscription jeudi 22 août 2002 Statut Membre Dernière intervention 14 juin 2005
18 juin 2003 à 15:58
http://www.insecure.org/sploits/xtacacs.server.dos.html

a l'origine c pour faire une attaque au ping, mais ds l'exemple ils construisent des paquets icmp (je suis pas arrivé a traduire pour de l'udp sous win, la apparement c sous unix)
roswell117 Messages postés 61 Date d'inscription jeudi 31 janvier 2002 Statut Membre Dernière intervention 18 novembre 2005
18 juin 2003 à 14:06
la fonction pour calculer le checksum, qui n'est pas de moi, sert à calculer toute somme de contrôle sur 16 bits, comme celle d'ip et de udp.
La somme de contrôle IP s'effectue seulement sur l'en-tete IP, alors que la somme de contrôle UDP se calcule sur l'en-tete et les données. Une astuce pour ne pas calculer la somme de contrôle UDP est de la mettre à 0 car elle n'est pas obligatoire, contrairement à TCP.

En ce qui concerne la methode pour construire des paquets avec en-tete, je n'ai jamais réussi à faire mes propres paquets mais elle apparait comme étant celle à mettre en oeuvre, meme si je n'ai pas trouvé d'exemple.
Pour faire plus simple, g essayé de faire de paquets ICMP.
Mais j'y arrive toujours pas :-/
BlackGoddess Messages postés 338 Date d'inscription jeudi 22 août 2002 Statut Membre Dernière intervention 14 juin 2005
18 juin 2003 à 13:42
mmh ... en envoyant ac send il me dit que le socket est pas connecté, et avec sendto il me dit que c'est une mauvaise adresse.

g testé avec source mon ip et dest mon ip
puis avec source mon ip et dest broadcast
BlackGoddess Messages postés 338 Date d'inscription jeudi 22 août 2002 Statut Membre Dernière intervention 14 juin 2005
18 juin 2003 à 12:02
ta fonction pour calaculer le checksum fonctionne aussi pour calculer celui de l'en-tete ip et udp ?
BlackGoddess Messages postés 338 Date d'inscription jeudi 22 août 2002 Statut Membre Dernière intervention 14 juin 2005
18 juin 2003 à 11:46
merci du conseil, je pars tester de suite :) l'interet est de pouvoir repondre a une app udp directement en local
roswell117 Messages postés 61 Date d'inscription jeudi 31 janvier 2002 Statut Membre Dernière intervention 18 novembre 2005
18 juin 2003 à 11:20
ce que tu veut, c forger toi-meme l'en-tete IP pour y spécifier les adresses que tu veut. Mais j'ai beau essayé, je n'arrives pas à créer mes en-tetes IP. Voila le principe qu'il faudrait appliquer (forte supposition dûe à des recherches intenses sur le net) :

faire un raw socket (je ne sais pas quel protocole choisir)
parametrer setsockopt() avec l'option IP_HDRINCL (dont le define se trouve dans ws2tcpip.h)
remplir la structure contenant les champs de l'en-tete IP
remplir la structure contenant les champs de l'en-tete UDP
envoyer le tout

voila le principe, et comme dit l'autre, y'a plus qu'à.
Alors je te souhaite bonne chance (je vais quand meme continuer à chercher) mais je comprends pas bien pourquoi tu veut faire ca.
BlackGoddess Messages postés 338 Date d'inscription jeudi 22 août 2002 Statut Membre Dernière intervention 14 juin 2005
17 juin 2003 à 16:55
jolie source !!!
saurais-tu comment faire pour créer une trame (udp) qui est en adresse ip source une adresse externe, et en adresse destination la mienne ?

(par exemple si mon poste a l'ip 192.168.0.1 crée une trame ac comme source 192.168.0.2 et comme destination 192.168.0.1)

parce que la a la reception du a bien toute la trame ip, mais pas a l'emission : tu n'as pas a envoyer l'en-tete ip
roswell117 Messages postés 61 Date d'inscription jeudi 31 janvier 2002 Statut Membre Dernière intervention 18 novembre 2005
17 juin 2003 à 10:59
merci pour cette remarque, c'est corrigé, car en effet il y avait redondance au niveau de ce test.

sinon, je vous remercie pour vos commentaires.
cs_Nebula Messages postés 787 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 7 juin 2007 2
17 juin 2003 à 09:29
Excellent, çà m'a permis de capter (enfin ! lol) les raw sockets.

Une seule petite remarque :
phe = gethostbyname(hostname);
if(!phe)
{
printf("hote inconnu %s
",hostname);
return -1;
}
Ce test est justifié car en cas d'erreur sur l'host tu quittes le programme, mais pourquoi après continuer à faire des if(phe) ?

Sinon à part çà excellent programme, bravo :p
cs_Skyman Messages postés 24 Date d'inscription vendredi 6 juin 2003 Statut Membre Dernière intervention 26 septembre 2003
16 juin 2003 à 22:05
JOULIIII !!!!
Bravo, c'est parfait je pense qu'on peut pas vraiment l'ameliorer ca vaut bien 9/10
(meme si perso je pige pas tout ;)
ivdz Messages postés 17 Date d'inscription jeudi 4 juillet 2002 Statut Membre Dernière intervention 5 août 2003
16 juin 2003 à 17:29
Très bonne source. On se croirait sous DOS.
Rejoignez-nous