IMA4 2021/2022 EC6 : Différence entre versions

De Wiki d'activités IMA
(Documents Rendus)
(Documents Rendus)
Ligne 121 : Ligne 121 :
 
     printf("Addresse mac de destination%s\n",ether1.sourceMac);
 
     printf("Addresse mac de destination%s\n",ether1.sourceMac);
 
     ;// bug de mémoire des caractères sont ajoutés sans raison (solved)
 
     ;// bug de mémoire des caractères sont ajoutés sans raison (solved)
 +
   
 +
   
 
// Récupération du type  
 
// Récupération du type  
printf("%d",strlen(ether1.etherType));
 
  
 
    printf("test%s",ether1.etherType);
 
    printf("\n%d",strlen(ether1.etherType));
 
 
     *(ether1.etherType)=*(packetChar+24);
 
     *(ether1.etherType)=*(packetChar+24);
 
     *(ether1.etherType+1)=*(packetChar+25);
 
     *(ether1.etherType+1)=*(packetChar+25);
 
     *(ether1.etherType+2)=*(packetChar+26);
 
     *(ether1.etherType+2)=*(packetChar+26);
 
     *(ether1.etherType+3)=*(packetChar+27);
 
     *(ether1.etherType+3)=*(packetChar+27);
 +
   
 +
    // J'avais ici une erreur dans ma string. Lorsque je rajoutais le nameType la char etherType "récupérait" aussi la valeur IPV4 ce qui me rendait printf(etherType) 0800IPV4
 +
    // La lenght de etherType changeait aussi sans raison
 +
    // En utilisant autre chose qu'une fonction toute faite comme strcat ou strcpy je n'ai pas ajouté \0 à la fin de ma string. etherType et nameType sont collés dans la mémoire. Alors sans \0 la mémoire considérait que
 +
    // etherType s'arretait à \0 de nameType
 
     *(ether1.etherType+4)='\0';
 
     *(ether1.etherType+4)='\0';
 +
   
 
     // Vérification du type etherType
 
     // Vérification du type etherType
 
    printf("\n%d\n",strlen(ether1.etherType));
 
 
     if (strcmp(ether1.etherType,"0800")==0){
 
     if (strcmp(ether1.etherType,"0800")==0){
        printf("\nLenght %d\n",strlen(ether1.etherType));
 
 
         strcpy(ether1.nameType,"IPV4");
 
         strcpy(ether1.nameType,"IPV4");
        printf("\nrlenght %d\n",strlen(ether1.etherType));
+
            }
    }
 
 
     else if (strcmp(ether1.etherType,"0806")==0){
 
     else if (strcmp(ether1.etherType,"0806")==0){
 
         strcpy(ether1.nameType,"ARP");         
 
         strcpy(ether1.nameType,"ARP");         
Ligne 151 : Ligne 151 :
 
     }
 
     }
  
     printf("\n%s etherType:%s\n",ether1.etherType,ether1.nameType);
+
     printf("\nType en Hexa: %s etherType:%s\n",ether1.etherType,ether1.nameType);
 
}
 
}
 
      
 
      

Version du 31 août 2022 à 17:00

Objectif

Développer un micro utilitaire de type tcpdump pour analyser les paquets TCP/IP.

En vous basant sur les sources du logiciel d'interception des paquets réseau des travaux dirigés du semestre 7, réalisez un analyseur de paquets TCP/IP avec les caractéristiques suivantes :

  • les paquets sont toujours affichés sous leur forme numérique ;
  • les entêtes Ethernet sont affichées en clair (les trois champs que vous connaissez bien) ;
  • si le paquet Ethernet contient un paquet IPv4, les entêtes IPv4 sont affichées en clair et la somme de contrôle est vérifiée ;
  • si le paquet IPv4 contient un paquet UDP, les entêtes UDP sont affichées en clair et l'éventuelle somme de contrôle est vérifiée.

Vous devez documenter vos avancées sur cette page Wiki. Au vu du retard que vous avez pris dans l'épreuve, merci de mettre à jour votre Wiki au moins deux fois par semaine.

Travail réaliser

Pour réaliser ce projet j'ai commencé par récupérer différents paquets ethernet "type" qui me permettront de développer mon programme . Pour cela j'utilise l'utilitaire wireshark Cela me permet de récupérer un exemple de trame ipv4 :

0000   48 f1 7f d0 32 20 78 81 02 31 36 76 86 dd 60 00   H...2 x..16v..`.
0010   00 00 00 21 11 3b 2a 00 14 50 40 07 08 0f 00 00   ...!.;*..P@.....
0020   00 00 00 00 20 02 2a 01 cb 00 0a a2 68 00 7d 7c   .... .*.....h.}|
0030   c5 0a 46 7f fe f6 01 bb d8 4c 00 21 0d c0 40 2e   ..F......L.!..@.
0040   40 71 fe 71 19 9e 41 f3 a7 a0 1c 35 5a 25 73 8b   @q.q..A....5Z%s.
0050   cf 41 11 bb 80 b3 b4                              .A.....

Ainsi que les informations associées:

Frame 680: 87 bytes on wire (696 bits), 87 bytes captured (696 bits) on interface \Device\NPF_{4DB062CB-0742-4EDE-86A1-1CFB3480F3BE}, id 0
Ethernet II, Src: Sercomm_31:36:76 (78:81:02:31:36:76), Dst: IntelCor_d0:32:20 (48:f1:7f:d0:32:20)
Internet Protocol Version 6, Src: 2a00:1450:4007:80f::2002, Dst: 2a01:cb00:aa2:6800:7d7c:c50a:467f:fef6
User Datagram Protocol, Src Port: 443, Dst Port: 55372
Data (25 bytes)

J'ai réalisé le même processus pour une trame UDP. Pour le moment c'est trames sont stockées dans un fichier texte mais l'idéal est d'utiliser directement l'utilitaire ether pour récupérer un paquet J'ai décomposé mon programme en plusieurs routine. Récupération de la trame-> Récupération des en-têtes ethernet -> Sélection du type de protocole -> si c'est un IPV4 affichage de ses en-têtes et vérification de la checksum

Récupération de la trame: Ma première routine me permet de récupérer un paquet complet sous la forme d'un char Exemple 48 f1 7f d0 32 20 78 81 02 31 36 76 86 dd 60 00 00 00 00 21 11 3b 2a 00 14 50 40 07 08 0f 00 00 00 00 00 00 20 02 2a 01 cb 00 0a a2 68 00 7d 7c c5 0a 46 7f fe f6 01 bb d8 4c 00 21 0d c0 40 2e 40 71 fe 71 19 9e 41 f3 a7 a0 1c 35 5a 25 73 8b cf 41 11 bb 80 b3 b4

Je traite cette chaine de caractère avec des boucles for. Je sais que l'adresse mac source et de destination et source sont composées de 6 octets alors il me suffit de récupérer les octets correspondants que je met dans une struct dédiée correspondant aux en-têtes ethernet.

Documents Rendus

  1. include <stdio.h>
  2. include <stdlib.h>
  3. include <string.h>
  4. include <sys/stat.h>
  5. define DEFAUT_SIZE 300

struct etherFrame {

   char sourceMac[18];
   char destMac[18];
   char etherType[5];
   char nameType[15];

};

const char* filename = "ip4.txt"; char packetChar[DEFAUT_SIZE]; int indexPacket=0;

int get_packet() //ouverture et récupération du packet dans le fichier choisi {

   FILE *in_file = fopen(filename, "r");
   if (!in_file) {
       perror("fopen");
       exit(EXIT_FAILURE);
   }
   struct stat sb;
   if (stat(filename, &sb) == -1) {
       perror("stat");
       exit(EXIT_FAILURE);
   }
   // Allocation de la taille de la mémoire en fonction de la taille du texte 
   char *file_contents = malloc(sb.st_size);
   
   while (fscanf(in_file, "%[^\n ] ", file_contents) != EOF) {
      
       strcat(packetChar,file_contents);
       //printf(" %s\n", file_contents); 
       //packetChar[indexPacket]=file_contents;
       //indexPacket++;        
   }
   printf("\n");
   //printf("%s", packetChar);
   indexPacket=0;
   fclose(in_file);
   }
   

int getMacAddressType(struct etherFrame ether1){

   int i;
   // nettoyage de la chaîne de charactère à cause d'un bug :"G��U48:f1:7f:f0:32:20:" en plus de la mac address des charactère sont présents au début 
   // Je pense que l'erreur ici est que j'ai alloué une zone mémoire à ma string mais je ne l'ai pas initialisé 
   strcpy(ether1.destMac,"");
   strcpy(ether1.sourceMac,"");
   strcpy(ether1.etherType,"");
   strcpy(ether1.nameType,"");
   // Pour résoudre ça je copie dans ma string un texte vide 

// Récupération de l'addresse mac de destination

   for(i=0;i<12;i=i+2){
       strcat(ether1.destMac,":"); 
       strncat(ether1.destMac,&packetChar[i],1);
       strncat(ether1.destMac,&packetChar[i+1],1);
              
   };
   printf("Addresse mac de destination%s\n",ether1.destMac);

//Récupération de l'addresse mac source

   for(i=12;i<24;i=i+2){
       strcat(ether1.sourceMac,":");
       strncat(ether1.sourceMac,&packetChar[i],1);
       strncat(ether1.sourceMac,&packetChar[i+1],1);
       
   }
   printf("Addresse mac de destination%s\n",ether1.sourceMac);
   ;// bug de mémoire des caractères sont ajoutés sans raison (solved)
   
   

// Récupération du type

   *(ether1.etherType)=*(packetChar+24);
   *(ether1.etherType+1)=*(packetChar+25);
   *(ether1.etherType+2)=*(packetChar+26);
   *(ether1.etherType+3)=*(packetChar+27);
   
   // J'avais ici une erreur dans ma string. Lorsque je rajoutais le nameType la char etherType "récupérait" aussi la valeur IPV4 ce qui me rendait printf(etherType) 0800IPV4
   // La lenght de etherType changeait aussi sans raison
   // En utilisant autre chose qu'une fonction toute faite comme strcat ou strcpy je n'ai pas ajouté \0 à la fin de ma string. etherType et nameType sont collés dans la mémoire. Alors sans \0 la mémoire considérait que
   // etherType s'arretait à \0 de nameType
   *(ether1.etherType+4)='\0';
   
   // Vérification du type etherType
   if (strcmp(ether1.etherType,"0800")==0){
       strcpy(ether1.nameType,"IPV4");
           }
   else if (strcmp(ether1.etherType,"0806")==0){
       strcpy(ether1.nameType,"ARP");        
   }
   else if (strcmp(ether1.etherType,"86dd")==0){
       strcpy(ether1.nameType,"IPV6");        
       
   }
   else {
       strcpy(ether1.nameType,"UNKNOWNS");
   }
   printf("\nType en Hexa: %s etherType:%s\n",ether1.etherType,ether1.nameType);

}


void main(){ get_packet();

   struct etherFrame ether2;
   printf("\n%s\n",packetChar);
   printf("\n");
   getMacAddressType(ether2);
   

}