IMA4 2021/2022 EC6 : Différence entre versions

De Wiki d'activités IMA
(Objectif)
(Documents Rendus)
Ligne 42 : Ligne 42 :
  
 
= Documents Rendus =
 
= Documents Rendus =
 +
// Programme temporaire
 +
#include <stdio.h>
 +
#include <stdlib.h>
 +
#include <string.h>
 +
#include <sys/stat.h>
 +
#define DEFAUT_SIZE 300
 +
 +
struct etherFrame
 +
{
 +
    char sourceMac[17];
 +
    char destMac[17];
 +
    char etherType[4];
 +
};
 +
 +
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;
 +
 +
// Récupération de l'addresse mac de destination
 +
    for(i=0;i<12;i=i+2){
 +
        strncat(ether1.destMac,&packetChar[i],1);
 +
        strncat(ether1.destMac,&packetChar[i+1],1);
 +
        strncat(ether1.destMac,":",1);       
 +
    };
 +
    printf("%d",strlen(ether1.destMac));
 +
    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){
 +
        strncat(ether1.sourceMac,&packetChar[i],1);
 +
        strncat(ether1.sourceMac,&packetChar[i+1],1);
 +
        strncat(ether1.sourceMac,":",1);
 +
    }
 +
    printf("%d",strlen(ether1.sourceMac));
 +
    printf("Addresse mac de destination: %s\n",ether1.sourceMac);
 +
    ;// bug de mémoire des caractères sont ajoutés sans raison
 +
}
 +
   
 +
void main(){
 +
get_packet();
 +
    struct etherFrame ether2;
 +
    printf("\n%s\n",packetChar);
 +
    printf("\n");
 +
    getMacAddressType(ether2);
 +
   
 +
 +
}

Version du 29 août 2022 à 23:27

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

// Programme temporaire

  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[17];
   char destMac[17];
   char etherType[4];

};

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;

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

   for(i=0;i<12;i=i+2){
       strncat(ether1.destMac,&packetChar[i],1);
       strncat(ether1.destMac,&packetChar[i+1],1);
       strncat(ether1.destMac,":",1);        
   };
   printf("%d",strlen(ether1.destMac));
   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){
       strncat(ether1.sourceMac,&packetChar[i],1);
       strncat(ether1.sourceMac,&packetChar[i+1],1);
       strncat(ether1.sourceMac,":",1);
   }
    printf("%d",strlen(ether1.sourceMac));
   printf("Addresse mac de destination: %s\n",ether1.sourceMac);
   ;// bug de mémoire des caractères sont ajoutés sans raison 

}

void main(){ get_packet();

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

}