begin process at 2010 02 10 08:11:29
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Réseau / Internet

 > 

socket RAW ICMP - fonctionnement et implémentation...


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

socket RAW ICMP - fonctionnement et implémentation...

mardi 15 novembre 2005 à 17:01:13 | socket RAW ICMP - fonctionnement et implémentation...

smirnoff69ice

Salut,

Je suis sur un projet et je dois simuler l'envoi de paquets ICMP sur le réseau. J'ai déjà fait un petit programme de test (repris en partie depuis le forum). Il est sensé envoyer une demande d'echo puis recevoir la réponse, et j'ai un autre programme qui répond mais lors de l'exécution, mon programme plante totalement! Je ne comprends vraiment pas d'où vient l'erreur...

Pour information, je développe sous Wndows avec Dev-C++, mais mon code doit aussi être portable sous Linux.
Merci de m'aider au plus vite......

Voici mon code :

================================================================================
#include <winsock2.h>
#include <stdio.h>
#include <conio.h>

//Structures IP et ICMP
typedef struct _IP_HEADER
{
  unsigned char VS_LET;
  unsigned char TOS;
  unsigned short Size;
  unsigned short ID;
  unsigned Flags:3;
  unsigned Offset:13;
  unsigned char TTL;
  unsigned char Proto;
  unsigned short Checksum;
  unsigned int IPsource;
  unsigned int IPdest;
  char IP_DATA[1];
}IPHEADER;

typedef struct _ICMP_HEADER
{
  unsigned char Type;
  unsigned char Code;
  unsigned short Checksum;
  unsigned short ID;
  unsigned short SEQ;
  char ICMP_DATA[1];
}ICMPHEADER;

int main()
{
  //Déclaration des variables
  ICMPHEADER *ICMP_HEADER;
  IPHEADER *IP_HEADER;
  char ip_buffer[100], icmp_buffer[100], rcv_buffer[100];
  int mySocket;
  struct sockaddr_in IP_sock_info;
  int tailleSocket = sizeof(IP_sock_info);
 
  //Début du code
  WSACleanup();
  WSADATA WSAData;
  WSAStartup(MAKEWORD(2,0), &WSAData);
 
  mySocket = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
  bind(mySocket, (SOCKADDR*)&IP_sock_info, tailleSocket);
  IP_sock_info.sin_family = AF_INET;
  IP_sock_info.sin_addr.s_addr = inet_addr("157.26.98.200");
 
  //Initialisation de la partie ICMP
  ICMP_HEADER->Type = 8;
  ICMP_HEADER->Code = 0;
  ICMP_HEADER->ID = 1;
  ICMP_HEADER->SEQ = 1;
  ICMP_HEADER->Checksum = 0;
  strcpy(ICMP_HEADER->ICMP_DATA, "12345678");
 
  //Initialisation de la partie IP
  IP_HEADER->VS_LET = 69;
  IP_HEADER->TOS = 0;
  IP_HEADER->Size = 36;
  IP_HEADER->ID = 16;
  IP_HEADER->Flags = 2;
  IP_HEADER->Offset = 0;
  IP_HEADER->TTL = 100;
  IP_HEADER->Proto = 1;
  IP_HEADER->Checksum = 0;
  IP_HEADER->IPsource = inet_addr("157.26.98.204");
  IP_HEADER->IPsource = inet_addr("157.26.98.200");
  memcpy(&IP_HEADER->IP_DATA, &ICMP_HEADER, 16);
 
  //Début de la communication
  sendto(mySocket, (char *)IP_HEADER, 36, 0, (struct sockaddr *)&IP_sock_info, tailleSocket);
  printf("Datagramm envoyé\n");
 
  recvfrom(mySocket, rcv_buffer, 100, 0, NULL, NULL);
  printf("Réception du paquet OK\n");
 
  printf("Copie des header reçus...");
  memcpy(IP_HEADER, &rcv_buffer[0], 36);
  printf("  ->");
  memcpy(ICMP_HEADER, &rcv_buffer[0], 16);
  printf("  -> Copie terminée\n");
 
  printf("Chaine reçue : %s", ICMP_HEADER->ICMP_DATA);
 
  getch();
}
================================================================================

vendredi 18 novembre 2005 à 16:27:47 | Re : socket RAW ICMP - fonctionnement et implémentation...

roswell117

L'une des premières remarques que je peux faire en voyant ce code, c'est que la fonction "bind" n'a pas sa place.

De plus, si tu n'utilises pas la fonction "setsockopt", apparement indisponible / inaccessible sous windows, je ne suis pas sur que tu puisses avoir accès à la construction de l'en-tête IP.

Tu devrais vérifier avec un sniffer de paquet si tes fonctions de réceptions recupèrent les bons octets au bon endroit (au niveau du premier memcpy, je serais tenté de mettre une taille de 20 car dans ton message d'envoi, tu as un buffer de 36 de données [20 pour l'IP et 16 pour l'ICMP] mais un buffer de 52 en réception [36 + 16]).

mercredi 4 janvier 2006 à 16:39:57 | Re : socket RAW ICMP - fonctionnement et implémentation...

poporiding

bonjour, bonne année.

je m'incruste ds cette discution car j'ai un petit problème avec les socket RAW. je n'aarive pas a initialiser mes structures.

Voici un bout de code :
// déclaration des Header IP et ICMP
typedef struct _IP_HEADER
    {
        unsigned char ip_hl:4; // 4 bits("Internet header lengh") représentant la taille de l'entête IP
        unsigned char ip_v:4; // ip_v la version (pour le moment version 4 de IP)
        unsigned char ip_tos; // "Type Of Service" est codé sur 8 bits.
        unsigned short int ip_len; // Le champ Longueur totale est codé sur 16 bits et représente la longueur du paquet incluant l'entête IP et les Data associées
        unsigned short int ip_id; // Le champ Identification est codé sur 16 bits et constitue l'identification utilisée pour reconstituer les différents fragments.
        unsigned short int ip_off; // Codé sur ce bits cette valeur comporte le flag (3 bits indiquant l'état de la fragmentation) et le champ Position fragment (13 bits indiquant la position du fragment par rapport à la première trame)
        unsigned char ip_ttl; // Time To Live : la durée de vie du socket.
        unsigned char ip_proto; // Le protocol utilisé pour transporter les données. Peut être tcp(6), udp(17), icmp(1)
        unsigned short int ip_sum; // Le checksum du datagram
        unsigned int ip_src; //Adresse IP source
        unsigned int ip_dst; // Adresse IP destination
    }IP_HEADER;

    typedef struct _ICMP_HEADER
    {
        unsigned char icmp_type; // Permet d'identifier le type de message envoyé ou recu (0 = Echo Reply, 8 = Echo Request, 11 = TTL exceeded)
        unsigned char icmp_code; // Associé au champ type il représente la définition de message d'erreur.
        unsigned short int icmp_cksum; // Le champ Checksum est codé sur 16 bits et représente la validité du paquet de la couche 3 ICMP
        unsigned short int icmp_id; // 16 bits définissant l’identifiant de l’émetteur
        unsigned short int icmp_seq; // 16 bits permettant au récepteur d’identifier si il manque un paquet
    }ICMP_HEADER;

//code me permettant d'initialiser le tout.
    public: void initStruct()
            {
                // Déclaration des structures IP_HEADER et ICMP_HEADER;
                IP_HEADER *ipEntete;
                ICMP_HEADER *icmpEntete;
                // Initialisation de l'entête IP
                ipEntete->ip_hl = 20;
                ipEntete->ip_v = 4;
                ipEntete->ip_tos = 0;
                ipEntete->ip_len = 92;
                ipEntete->ip_id = 16;
                ipEntete->ip_off = 0;
                ipEntete->ip_ttl = 1;
                ipEntete->ip_proto = 1; //on utilise ICMP
                ipEntete->ip_sum = 0;
                ipEntete->ip_src = inet_addr("1.2.3.4");
                ipEntete->ip_dst = inet_addr("127.0.0.1");

                //Initialisation de l'entête ICMP
                icmpEntete->icmp_type = 8; //ICMP de type "Echo Request"
                icmpEntete->icmp_code = 0;
                icmpEntete->icmp_cksum = 0;
                icmpEntete->icmp_id = 0;
                icmpEntete->icmp_seq = 1;
            }
Mon problème se situ au niveau de la déclaration des adresse avec inet_addr, car le compilateur n'aime pas cette ligne. Voila le message d'erreur qu'il me sort :

c:\test\form1.h(316) : warning C4700: variable locale 'ipEntete' utilisée sans avoir été initialisée
c:\test\form1.h(329) : warning C4700: variable locale 'icmpEntete' utilisée sans avoir été initialisée
Édition des liens en cours...
Form1.obj : error LNK2001: symbole externe non résolu "unsigned long __stdcall inet_addr(char const *)" (?inet_addr@@$$J14YGKPBD@Z)
C:\Test\Debug\TraceRoute.exe : fatal error LNK1120: 1 externes non résolus

Donc voila, si quelqu'un a une idée et souhaite la partager je suis preneur.

Merci d'avance.

vendredi 6 janvier 2006 à 09:55:33 | Re : socket RAW ICMP - fonctionnement et implémentation...

poporiding

juste un oubli : #pragma comment(lib, "ws2_32.lib")


Cette discussion est classée dans : icmp, ip, header, char, unsigned


Répondre à ce message

Sujets en rapport avec ce message

RAW SOCKET - IP - ICMP - Ping [ par dark1933 ] Salut à tous,Voici le code d'un programme qui envoye un ping (ici à Google), mais ne reçoit aucune réponse.La socket utilisée est du type : socket(AF_ RAW SOCKET - IP - Sendto() - Erreur 'WSAEADDRNOTAVAIL' [ par dark1933 ] Salut à tous,J'essaye désespérément d'envoyer un Ping en forgeant le datagramme IP adéquat.J'obtiens l'erreur "WSAEADDRNOTAVAIL" au moment de l'appel Sniffing - raw socket [ par krum ] J'ai essayé de coder un programme capable de me donner la description de l'en tete IP et TCP des packets que je reçois d'une certaine IP,mais lorsque envoi de paquet ip [ par sendouda ] Bonjour;j'ai écrit un programme qui permet d'envoyer des paquets ip à une destination.mais quand j'ai voulu le sniffer j'ai pas pu le capter.J'ai beso urgent:envoi paquet [ par sendouda ] Bonjour;j'ai écrit un programme qui permet d'envoyer des paquets ip à une destination.mais quand j'ai voulu le sniffer j'ai pas pu le capter.J'ai beso pb lors de l'envoie de donnée avec les sockets [ par poporiding ] bonjour tout le monde. Je me galère vraiment sur la création d'un programme qui envoie des socket en mode RAW. j'ai un ensemble d'erreur, capturé winsock raw socket ping icmp recv [ par 4aBestWord ] bonjour,j'ai repris un code source en c pour faire un un ping icmp en utilisant les raw sockets sous windows (XP). L'envoie du ping fontionne bien par Manipulation de Tableaux, structures en C++ [ par katerson ] Bonjour,Je travaille actuellement sur un projet (en stage) dans lequel je dois envoyer deux trames: l'une d'entre elles faisant 88 et l'autre 161 octe Sélection d'octet [ par dayvid75014 ] Bonjour à tous, Je récupère les octets de mon fichier vidéo dans un buffer "Buffer[]" et je voudrais sélectionner les octets 0x47 et je n'y a Pb avec petit programme port parallèle [ par llorden ] Bonjour,J'ai fait un petit programme pour écrire et lire le port parallèle mais ça ne fonctionne pas.De plus quand je branche mon montage toutes les L


Nos sponsors


Sondage...

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,749 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales