<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
		<id>https://wiki-ima.plil.fr/mediawiki//api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Tblondin</id>
		<title>Wiki d'activités IMA - Contributions de l’utilisateur [fr]</title>
		<link rel="self" type="application/atom+xml" href="https://wiki-ima.plil.fr/mediawiki//api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Tblondin"/>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php/Sp%C3%A9cial:Contributions/Tblondin"/>
		<updated>2026-05-13T00:23:01Z</updated>
		<subtitle>Contributions de l’utilisateur</subtitle>
		<generator>MediaWiki 1.29.2</generator>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=IMA4_2021/2022_EC6&amp;diff=58625</id>
		<title>IMA4 2021/2022 EC6</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=IMA4_2021/2022_EC6&amp;diff=58625"/>
				<updated>2022-09-07T17:46:39Z</updated>
		
		<summary type="html">&lt;p&gt;Tblondin : /* Travail réaliser */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectif =&lt;br /&gt;
&lt;br /&gt;
Développer un micro utilitaire de type &amp;lt;code&amp;gt;tcpdump&amp;lt;/code&amp;gt; pour analyser les paquets TCP/IP. &lt;br /&gt;
&lt;br /&gt;
En vous basant sur les sources du logiciel d'interception des paquets réseau des travaux dirigés du semestre 7, réalisez&lt;br /&gt;
un analyseur de paquets TCP/IP avec les caractéristiques suivantes :&lt;br /&gt;
* les paquets sont toujours affichés sous leur forme numérique ;&lt;br /&gt;
* les entêtes Ethernet sont affichées en clair (les trois champs que vous connaissez bien) ;&lt;br /&gt;
* 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 ;&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
Vous devez documenter vos avancées sur cette page Wiki. Au vu du retard que vous avez pris dans l'épreuve, merci&lt;br /&gt;
de mettre à jour votre Wiki au moins deux fois par semaine.&lt;br /&gt;
&lt;br /&gt;
= Travail réaliser =&lt;br /&gt;
Pour réaliser ce projet j'ai commencé par récupérer différents paquets ethernet &amp;quot;type&amp;quot; qui me permettront de développer mon programme . Pour cela j'utilise l'utilitaire wireshark&lt;br /&gt;
Cela me permet de récupérer un exemple de trame ipv4 :&lt;br /&gt;
&lt;br /&gt;
 0000   48 f1 7f d0 32 20 78 81 02 31 36 76 86 dd 60 00   H...2 x..16v..`.&lt;br /&gt;
 0010   00 00 00 21 11 3b 2a 00 14 50 40 07 08 0f 00 00   ...!.;*..P@.....&lt;br /&gt;
 0020   00 00 00 00 20 02 2a 01 cb 00 0a a2 68 00 7d 7c   .... .*.....h.}|&lt;br /&gt;
 0030   c5 0a 46 7f fe f6 01 bb d8 4c 00 21 0d c0 40 2e   ..F......L.!..@.&lt;br /&gt;
 0040   40 71 fe 71 19 9e 41 f3 a7 a0 1c 35 5a 25 73 8b   @q.q..A....5Z%s.&lt;br /&gt;
 0050   cf 41 11 bb 80 b3 b4                              .A.....&lt;br /&gt;
&lt;br /&gt;
Ainsi que les informations associées:&lt;br /&gt;
&lt;br /&gt;
 Frame 680: 87 bytes on wire (696 bits), 87 bytes captured (696 bits) on interface \Device\NPF_{4DB062CB-0742-4EDE-86A1-1CFB3480F3BE}, id 0&lt;br /&gt;
 Ethernet II, Src: Sercomm_31:36:76 (78:81:02:31:36:76), Dst: IntelCor_d0:32:20 (48:f1:7f:d0:32:20)&lt;br /&gt;
 Internet Protocol Version 6, Src: 2a00:1450:4007:80f::2002, Dst: 2a01:cb00:aa2:6800:7d7c:c50a:467f:fef6&lt;br /&gt;
 User Datagram Protocol, Src Port: 443, Dst Port: 55372&lt;br /&gt;
 Data (25 bytes)&lt;br /&gt;
&lt;br /&gt;
J'ai réalisé le même processus pour une trame UDP. Pour le moment ces 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&lt;br /&gt;
J'ai décomposé mon programme en plusieurs routines. &lt;br /&gt;
Récupération de la trame-&amp;gt; Récupération des en-têtes ethernet -&amp;gt; Sélection du type de protocole -&amp;gt; si c'est un IPV4 affichage de ses en-têtes et vérification de la checksum&lt;br /&gt;
&lt;br /&gt;
Récupération de la trame:&lt;br /&gt;
Ma première routine me permet de récupérer un paquet complet sous la forme d'un char&lt;br /&gt;
Exemple&lt;br /&gt;
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&lt;br /&gt;
&lt;br /&gt;
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 mets dans une struct dédiée correspondant aux en-têtes ethernet.&lt;br /&gt;
&lt;br /&gt;
= Documents Rendus =&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/stat.h&amp;gt;&lt;br /&gt;
#define DEFAUT_SIZE 300&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;errno.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;getopt.h&amp;gt;&lt;br /&gt;
#include &amp;lt;time.h&amp;gt;&lt;br /&gt;
#include &amp;lt;signal.h&amp;gt;&lt;br /&gt;
#include &amp;lt;net/if.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/socket.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/ioctl.h&amp;gt;&lt;br /&gt;
#include &amp;lt;linux/in.h&amp;gt;&lt;br /&gt;
#include &amp;lt;linux/if_ether.h&amp;gt;&lt;br /&gt;
#include &amp;lt;linux/if_packet.h&amp;gt;&lt;br /&gt;
#include &amp;lt;linux/filter.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define BUFFER_SIZE 2048&lt;br /&gt;
#define MAX_COLUMNS 16&lt;br /&gt;
#define ETHER_ADDR_LEN 6&lt;br /&gt;
&lt;br /&gt;
#define MODE_DISPLAY 0&lt;br /&gt;
#define MODE_SEND 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
struct etherFrame&lt;br /&gt;
{&lt;br /&gt;
    char sourceMac[18];&lt;br /&gt;
    char destMac[18];&lt;br /&gt;
    char etherType[5];&lt;br /&gt;
    char nameType[15];&lt;br /&gt;
    int casePacket;&lt;br /&gt;
   &lt;br /&gt;
    &lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct ipFrame{&lt;br /&gt;
    char versionIp[2];&lt;br /&gt;
    char lenghtHeaderIp[2];&lt;br /&gt;
    char DSCP_ECN[2];&lt;br /&gt;
    char lenghtIP[4];&lt;br /&gt;
    char identIp[5];&lt;br /&gt;
    char flagIp[3];&lt;br /&gt;
    char TTL[5];&lt;br /&gt;
    char protocolIP[3];&lt;br /&gt;
    char CsIP[5];&lt;br /&gt;
    unsigned char sourceIP[4];&lt;br /&gt;
    unsigned char destIP[4];&lt;br /&gt;
    char fullHeader[40];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const char* filename = &amp;quot;temp.txt&amp;quot;;&lt;br /&gt;
int indexPacket=0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
char *ifname=&amp;quot;enp0s3&amp;quot;;  /* Interface reseau a utiliser */&lt;br /&gt;
unsigned char broadcast=1; /* Capture ou non des diffusions */&lt;br /&gt;
unsigned char unicast=0; /* Capture limitee a une adresse MAC ou non */&lt;br /&gt;
char macAddress[ETHER_ADDR_LEN];/* adresse MAC a surveiller */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int openRawEthernetSocket(char *ifname){&lt;br /&gt;
  struct sockaddr_ll address;&lt;br /&gt;
  int proto=htons(ETH_P_ALL);&lt;br /&gt;
  int result;&lt;br /&gt;
&lt;br /&gt;
  if((result=socket(PF_PACKET,SOCK_RAW,proto))&amp;lt;0){&lt;br /&gt;
    perror(&amp;quot;openRawEthernetSocket.socket&amp;quot;);&lt;br /&gt;
    exit(1);&lt;br /&gt;
  }&lt;br /&gt;
  return result;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  void readPacket(int sock,char *packet,int *size){&lt;br /&gt;
  *size=recvfrom(sock,packet,*size,0,NULL,NULL);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
int get_packet(char *packet, char *buffer, int size){&lt;br /&gt;
&lt;br /&gt;
	int i,j;&lt;br /&gt;
	j=0;&lt;br /&gt;
	&lt;br /&gt;
	//packet=(char *)malloc(sizeof(char)*size);&lt;br /&gt;
	for (i=0;i&amp;lt;size;i++){&lt;br /&gt;
		sprintf(&amp;amp;packet[j],&amp;quot;%02x&amp;quot;,(unsigned char)buffer[i]);&lt;br /&gt;
		j=j+2;&lt;br /&gt;
		}&lt;br /&gt;
	packet[j]='\0';&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
struct etherFrame getMacAddressType(char *packetChar){&lt;br /&gt;
    struct etherFrame ether1;&lt;br /&gt;
    int i;&lt;br /&gt;
    // nettoyage de la chaîne de charactère à cause d'un bug :&amp;quot;G��U48:f1:7f:f0:32:20:&amp;quot; en plus de la mac address des charactère sont présents au début &lt;br /&gt;
    // Je pense que l'erreur ici est que j'ai alloué une zone mémoire à ma string mais je ne l'ai pas initialisé &lt;br /&gt;
    strcpy(ether1.destMac,&amp;quot;&amp;quot;);&lt;br /&gt;
    strcpy(ether1.sourceMac,&amp;quot;&amp;quot;);&lt;br /&gt;
    strcpy(ether1.etherType,&amp;quot;&amp;quot;);&lt;br /&gt;
    strcpy(ether1.nameType,&amp;quot;&amp;quot;);&lt;br /&gt;
    // Pour résoudre ça je copie dans ma string un texte vide &lt;br /&gt;
&lt;br /&gt;
// Récupération de l'addresse mac de destination&lt;br /&gt;
    for(i=0;i&amp;lt;12;i=i+2){&lt;br /&gt;
        strcat(ether1.destMac,&amp;quot;:&amp;quot;); &lt;br /&gt;
        strncat(ether1.destMac,&amp;amp;packetChar[i],1);&lt;br /&gt;
        strncat(ether1.destMac,&amp;amp;packetChar[i+1],1);&lt;br /&gt;
               &lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\nAddresse mac de destination%s\n&amp;quot;,ether1.destMac);&lt;br /&gt;
//Récupération de l'addresse mac source &lt;br /&gt;
    for(i=12;i&amp;lt;24;i=i+2){&lt;br /&gt;
        strcat(ether1.sourceMac,&amp;quot;:&amp;quot;);&lt;br /&gt;
        strncat(ether1.sourceMac,&amp;amp;packetChar[i],1);&lt;br /&gt;
        strncat(ether1.sourceMac,&amp;amp;packetChar[i+1],1);&lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Addresse mac source%s\n&amp;quot;,ether1.sourceMac);&lt;br /&gt;
    ;// bug de mémoire des caractères sont ajoutés sans raison (solved)&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
// Récupération du type &lt;br /&gt;
&lt;br /&gt;
    *(ether1.etherType)=*(packetChar+24);&lt;br /&gt;
    *(ether1.etherType+1)=*(packetChar+25);&lt;br /&gt;
    *(ether1.etherType+2)=*(packetChar+26);&lt;br /&gt;
    *(ether1.etherType+3)=*(packetChar+27);&lt;br /&gt;
    &lt;br /&gt;
    // J'avais ici une erreur dans ma string. Lorsque je rajoutais le nameType la char etherType &amp;quot;récupérait&amp;quot; aussi la valeur IPV4 ce qui me rendait printf(etherType) 0800IPV4&lt;br /&gt;
    // La lenght de etherType changeait aussi sans raison&lt;br /&gt;
    // 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&lt;br /&gt;
    // etherType s'arretait à \0 de nameType&lt;br /&gt;
    *(ether1.etherType+4)='\0';&lt;br /&gt;
    &lt;br /&gt;
    // Vérification du type etherType&lt;br /&gt;
    if (strcmp(ether1.etherType,&amp;quot;0800&amp;quot;)==0){&lt;br /&gt;
        strcpy(ether1.nameType,&amp;quot;IPV4&amp;quot;);&lt;br /&gt;
        ether1.casePacket =1;&lt;br /&gt;
            }&lt;br /&gt;
    else if (strcmp(ether1.etherType,&amp;quot;0806&amp;quot;)==0){&lt;br /&gt;
        strcpy(ether1.nameType,&amp;quot;ARP&amp;quot;);  &lt;br /&gt;
        ether1.casePacket =2;&lt;br /&gt;
    }&lt;br /&gt;
    else if (strcmp(ether1.etherType,&amp;quot;86dd&amp;quot;)==0){&lt;br /&gt;
        strcpy(ether1.nameType,&amp;quot;IPV6&amp;quot;);        &lt;br /&gt;
        ether1.casePacket =3;&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        strcpy(ether1.nameType,&amp;quot;UNKNOWNS&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Type en Hexa: %s/ EtherType:%s\n&amp;quot;,ether1.etherType,ether1.nameType);&lt;br /&gt;
    return ether1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
struct ipFrame analyseIP4(struct etherFrame ether1, char *packetChar){&lt;br /&gt;
    struct ipFrame ip;&lt;br /&gt;
    // récupération de la version IP et de la longueur de l'en-tête&lt;br /&gt;
    //printf(&amp;quot;Test&amp;quot;);&lt;br /&gt;
    char *ptr;&lt;br /&gt;
    strcpy(ip.versionIp,&amp;quot;&amp;quot;);&lt;br /&gt;
    strcpy(ip.lenghtHeaderIp,&amp;quot;&amp;quot;);&lt;br /&gt;
    strcpy(ip.DSCP_ECN,&amp;quot;&amp;quot;);&lt;br /&gt;
    strcpy(ip.lenghtIP,&amp;quot;&amp;quot;);&lt;br /&gt;
    strcpy(ip.identIp,&amp;quot;&amp;quot;);&lt;br /&gt;
    ip.versionIp[0]=*(packetChar+28);&lt;br /&gt;
    ip.lenghtHeaderIp[0]=*(packetChar+29);&lt;br /&gt;
&lt;br /&gt;
    int tailleHeader = atoi(ip.lenghtHeaderIp)*4;&lt;br /&gt;
    printf(&amp;quot;\nTaille Header %d byte&amp;quot;,tailleHeader);&lt;br /&gt;
    &lt;br /&gt;
    ip.DSCP_ECN[0]=*(packetChar+30);&lt;br /&gt;
    ip.DSCP_ECN[1]=*(packetChar+31);&lt;br /&gt;
    &lt;br /&gt;
    ip.lenghtIP[0]=*(packetChar+32);&lt;br /&gt;
    ip.lenghtIP[1]=*(packetChar+33);&lt;br /&gt;
    ip.lenghtIP[2]=*(packetChar+34);&lt;br /&gt;
    ip.lenghtIP[3]=*(packetChar+35);&lt;br /&gt;
    &lt;br /&gt;
    //printf(&amp;quot;%s&amp;quot;,ip.lenghtIP);&lt;br /&gt;
    long taillePaquetIp=strtol(ip.lenghtIP,NULL,16);&lt;br /&gt;
    printf(&amp;quot;\nTaille du paquet IP: %ld&amp;quot;,taillePaquetIp);&lt;br /&gt;
    &lt;br /&gt;
    ip.identIp[0]=*(packetChar+36);&lt;br /&gt;
    ip.identIp[1]=*(packetChar+37);&lt;br /&gt;
    ip.identIp[2]=*(packetChar+38);&lt;br /&gt;
    ip.identIp[3]=*(packetChar+39);&lt;br /&gt;
    ip.identIp[4]='\0';&lt;br /&gt;
    printf(&amp;quot;\nIdentification %s&amp;quot;,ip.identIp);&lt;br /&gt;
    &lt;br /&gt;
    ip.flagIp[0]=*(packetChar+40);&lt;br /&gt;
    ip.flagIp[1]=*(packetChar+41);&lt;br /&gt;
    ip.flagIp[2]='\0';&lt;br /&gt;
    printf(&amp;quot;\nFlag IP: %s&amp;quot;, ip.flagIp);&lt;br /&gt;
    &lt;br /&gt;
    ip.TTL[0]=*(packetChar+42);&lt;br /&gt;
    ip.TTL[1]=*(packetChar+43);&lt;br /&gt;
    ip.TTL[2]=*(packetChar+44);&lt;br /&gt;
    ip.TTL[3]=*(packetChar+45);&lt;br /&gt;
    ip.TTL[4]='\0';&lt;br /&gt;
    printf(&amp;quot;\nTTL: %s&amp;quot;, ip.TTL);&lt;br /&gt;
    &lt;br /&gt;
    ip.protocolIP[0]=*(packetChar+46);&lt;br /&gt;
    ip.protocolIP[1]=*(packetChar+47);&lt;br /&gt;
    ip.protocolIP[2]='\0';&lt;br /&gt;
    printf(&amp;quot;\nProtocole:%s&amp;quot;, ip.protocolIP);&lt;br /&gt;
    ;&lt;br /&gt;
    ip.CsIP[0]=*(packetChar+48);&lt;br /&gt;
    ip.CsIP[1]=*(packetChar+49);&lt;br /&gt;
    ip.CsIP[2]=*(packetChar+50);&lt;br /&gt;
    ip.CsIP[3]=*(packetChar+51);&lt;br /&gt;
    ip.CsIP[4]='\0';&lt;br /&gt;
    printf(&amp;quot;\nCS= %s&amp;quot;,ip.CsIP);&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    // Récupération de l'ip source&lt;br /&gt;
    char tempChar[2];    &lt;br /&gt;
    tempChar[2]='\0';&lt;br /&gt;
    tempChar[0]=*(packetChar+52);&lt;br /&gt;
    tempChar[1]=*(packetChar+53);&lt;br /&gt;
&lt;br /&gt;
    ip.sourceIP[0]= strtol(tempChar,NULL,16);&lt;br /&gt;
    &lt;br /&gt;
    tempChar[0]=*(packetChar+54);&lt;br /&gt;
    tempChar[1]=*(packetChar+55);&lt;br /&gt;
    ip.sourceIP[1]=strtol(tempChar,NULL,16);&lt;br /&gt;
    &lt;br /&gt;
    tempChar[0]=*(packetChar+56);&lt;br /&gt;
    tempChar[1]=*(packetChar+57);&lt;br /&gt;
    ip.sourceIP[2]= strtol(tempChar,NULL,16);&lt;br /&gt;
    &lt;br /&gt;
    tempChar[0]=*(packetChar+58);&lt;br /&gt;
    tempChar[1]=*(packetChar+59);&lt;br /&gt;
    ip.sourceIP[3]= strtol(tempChar,NULL,16);&lt;br /&gt;
    &lt;br /&gt;
    //Récupération de l'ip dest&lt;br /&gt;
    tempChar[0]=*(packetChar+60);&lt;br /&gt;
    tempChar[1]=*(packetChar+61);&lt;br /&gt;
    ip.destIP[0]= strtol(tempChar,NULL,16);&lt;br /&gt;
    &lt;br /&gt;
    tempChar[0]=*(packetChar+62);&lt;br /&gt;
    tempChar[1]=*(packetChar+63);&lt;br /&gt;
    ip.destIP[1]= strtol(tempChar,NULL,16);&lt;br /&gt;
    &lt;br /&gt;
    tempChar[0]=*(packetChar+64);&lt;br /&gt;
    tempChar[1]=*(packetChar+65);&lt;br /&gt;
    ip.destIP[2]= strtol(tempChar,NULL,16);&lt;br /&gt;
    &lt;br /&gt;
    tempChar[0]=*(packetChar+66);&lt;br /&gt;
    &lt;br /&gt;
    tempChar[1]=*(packetChar+67);&lt;br /&gt;
    ip.destIP[3]= strtol(tempChar,NULL,16);&lt;br /&gt;
    &lt;br /&gt;
    printf(&amp;quot;\nIp source %d.%d.%d.%d&amp;quot;,ip.sourceIP[0],ip.sourceIP[1],ip.sourceIP[2],ip.sourceIP[3]);&lt;br /&gt;
    printf(&amp;quot;\nIp de destination %d.%d.%d.%d&amp;quot;,ip.destIP[0],ip.destIP[1],ip.destIP[2],ip.destIP[3]);&lt;br /&gt;
    &lt;br /&gt;
//     printf(&amp;quot;tes 1 %d\n&amp;quot;,strlen(ip.fullHeader));&lt;br /&gt;
//     printf(&amp;quot;test 2 %d\n&amp;quot;,sizeof(ip.fullHeader));&lt;br /&gt;
//     &lt;br /&gt;
    printf(&amp;quot;\n%d &amp;quot;, tailleHeader);&lt;br /&gt;
//     ip.fullHeader = malloc(tailleHeader);&lt;br /&gt;
//     printf(&amp;quot;test 3 %d\n&amp;quot;,strlen(ip.fullHeader));&lt;br /&gt;
//     printf(&amp;quot;test 4 %d\n&amp;quot;,sizeof(ip.fullHeader));&lt;br /&gt;
    &lt;br /&gt;
    int index=0;&lt;br /&gt;
    int i;&lt;br /&gt;
    &lt;br /&gt;
    for(i=28;i&amp;lt;28+(tailleHeader*2);i=i+1){&lt;br /&gt;
//         printf(&amp;quot;%d\n&amp;quot;,strlen(ip.fullHeader));&lt;br /&gt;
//         printf(&amp;quot;%s&amp;quot;,ip.fullHeader);&lt;br /&gt;
&lt;br /&gt;
        ip.fullHeader[index]=packetChar[i];&lt;br /&gt;
        index++;&lt;br /&gt;
    }&lt;br /&gt;
    ip.fullHeader[tailleHeader*2]='\0';&lt;br /&gt;
    //printf(&amp;quot;\n%s&amp;quot;,ip.fullHeader);&lt;br /&gt;
    return ip;&lt;br /&gt;
}&lt;br /&gt;
void displayPacket(FILE *stream,char *packet,int size){&lt;br /&gt;
  int i,count=MAX_COLUMNS;&lt;br /&gt;
  for(i=0;i&amp;lt;size;i++){&lt;br /&gt;
    fprintf(stream,&amp;quot;%2.2x &amp;quot;,(unsigned char)packet[i]);&lt;br /&gt;
    count--;&lt;br /&gt;
    if(count&amp;lt;=0){ fprintf(stream,&amp;quot;\n&amp;quot;); count=MAX_COLUMNS; }&lt;br /&gt;
    }&lt;br /&gt;
  if(count!=MAX_COLUMNS) fprintf(stream,&amp;quot;\n&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
    &lt;br /&gt;
 void checksum(char *header, char *inputCS){&lt;br /&gt;
 	char byte1[]=&amp;quot;0000000000000000&amp;quot;;&lt;br /&gt;
 	char byte2[]=&amp;quot;0000000000000000&amp;quot;;&lt;br /&gt;
 	char word[]=&amp;quot;0000&amp;quot;;&lt;br /&gt;
 	char wordBinary[]=&amp;quot;0000000000000000&amp;quot;;&lt;br /&gt;
 	char checkResult[]=&amp;quot;0000000000000000&amp;quot;;&lt;br /&gt;
 	char carry[]=&amp;quot;0&amp;quot;;&lt;br /&gt;
 	int len=strlen(header);&lt;br /&gt;
 	&lt;br /&gt;
 	int i=0;&lt;br /&gt;
 	int j,k;&lt;br /&gt;
 	byte2[17]='\0';&lt;br /&gt;
 	&lt;br /&gt;
 	while (i&amp;lt;len){&lt;br /&gt;
&lt;br /&gt;
	 	sprintf(word,&amp;quot;%.4s&amp;quot;, header+i); // récupération des 2 octets&lt;br /&gt;
	 	&lt;br /&gt;
	 	if(strcmp(word,inputCS)==0){&lt;br /&gt;
	 		strcpy(word,&amp;quot;0000&amp;quot;);&lt;br /&gt;
	 		strcpy(wordBinary,&amp;quot;0000000000000000&amp;quot;);&lt;br /&gt;
	 		strcpy(byte1,&amp;quot;0000000000000000&amp;quot;);&lt;br /&gt;
	 	} // exclusion de la CS du header &lt;br /&gt;
	 		&lt;br /&gt;
	 	else{&lt;br /&gt;
	 		strcpy(byte1,&amp;quot;0000000000000000&amp;quot;);&lt;br /&gt;
		 	sprintf(wordBinary,&amp;quot;%b&amp;quot;,strtol(word,NULL,16));	 	&lt;br /&gt;
		 	k=16;&lt;br /&gt;
		 &lt;br /&gt;
		 	&lt;br /&gt;
		 	for (j=strlen(wordBinary); j!=-1; j=j-1){&lt;br /&gt;
		 		byte1[k]=wordBinary[j];&lt;br /&gt;
		 		k=k-1;&lt;br /&gt;
		 	}&lt;br /&gt;
	 	}&lt;br /&gt;
	 	&lt;br /&gt;
	 	// addiftion de byte1 et byte2 &lt;br /&gt;
	 	for (j=15;j!=-1;j--){&lt;br /&gt;
	 		if (byte1[j]=='0' &amp;amp;&amp;amp; byte2[j]=='0' &amp;amp;&amp;amp; carry[0]=='0') {&lt;br /&gt;
	 			byte2[j]='0';&lt;br /&gt;
	 			}&lt;br /&gt;
	 		else if (byte1[j]=='0' &amp;amp;&amp;amp; byte2[j]=='0'&amp;amp;&amp;amp; carry[0]=='1'){&lt;br /&gt;
	 			byte2[j]='1';&lt;br /&gt;
	 			carry[0]='0';}&lt;br /&gt;
	 		else if (byte1[j]=='0' &amp;amp;&amp;amp; byte2[j]=='1' &amp;amp;&amp;amp; carry[0]=='0'){&lt;br /&gt;
	 			byte2[j]='1';&lt;br /&gt;
	 			carry[0]='0';}&lt;br /&gt;
	 		else if (byte1[j]=='1' &amp;amp;&amp;amp; byte2[j]=='0' &amp;amp;&amp;amp; carry[0]=='0'){&lt;br /&gt;
	 			byte2[j]='1';&lt;br /&gt;
	 			carry[0]='0';}&lt;br /&gt;
	 		else if (byte1[j]=='1' &amp;amp;&amp;amp; byte2[j]=='1' &amp;amp;&amp;amp; carry[0]=='0'){&lt;br /&gt;
	 			byte2[j]='0';&lt;br /&gt;
	 			carry[0]='1';}&lt;br /&gt;
	 		else if (byte1[j]=='1' &amp;amp;&amp;amp; byte2[j]=='1' &amp;amp;&amp;amp; carry[0]=='1'){&lt;br /&gt;
	 			byte2[j]='1';&lt;br /&gt;
	 			carry[0]='1';}&lt;br /&gt;
	 		&lt;br /&gt;
	 	}&lt;br /&gt;
	 	&lt;br /&gt;
	 	/**&lt;br /&gt;
	 	printf(&amp;quot;\nHexa %s&amp;quot;,word);&lt;br /&gt;
	 	printf(&amp;quot;\nWord: %s&amp;quot;,byte1);&lt;br /&gt;
	 	printf(&amp;quot;\nCS:   %s\n&amp;quot;,byte2);&lt;br /&gt;
	 	*/&lt;br /&gt;
	 	i=i+4;&lt;br /&gt;
 	}&lt;br /&gt;
 	// complément à 1 du résultat et affichage en hex&lt;br /&gt;
 	//printf(&amp;quot;\nChecksum calculé: %lx \n&amp;quot;,strtol(byte2,NULL,2));&lt;br /&gt;
 	for (j=15;j&amp;gt;0;j--){&lt;br /&gt;
	 		if (byte2[j]=='0' ){&lt;br /&gt;
	 			checkResult[j]='0';&lt;br /&gt;
	 			}&lt;br /&gt;
	 		else {	checkResult[j]='1';&lt;br /&gt;
	 			}&lt;br /&gt;
	 	}&lt;br /&gt;
	 	&lt;br /&gt;
	 	printf(&amp;quot;\nChecksum calculé: %lx \n&amp;quot;,strtol(checkResult,NULL,2));&lt;br /&gt;
	 	&lt;br /&gt;
	 &lt;br /&gt;
 &lt;br /&gt;
 } &lt;br /&gt;
   &lt;br /&gt;
void main(){&lt;br /&gt;
&lt;br /&gt;
	int sock;&lt;br /&gt;
  	int size;&lt;br /&gt;
  	char buffer[BUFFER_SIZE];  	&lt;br /&gt;
  	sock=openRawEthernetSocket(ifname);&lt;br /&gt;
  	readPacket(sock,buffer,&amp;amp;size);&lt;br /&gt;
  	&lt;br /&gt;
  	&lt;br /&gt;
  	if (strlen(buffer)==0){printf(&amp;quot;Aucun paquet reçu\n&amp;quot;);exit(0);};&lt;br /&gt;
  	printf(&amp;quot;\nAffichage du paquet:\n&amp;quot;);&lt;br /&gt;
   	displayPacket(stdout,buffer,size);&lt;br /&gt;
   	&lt;br /&gt;
   	&lt;br /&gt;
   	char packetChar[2+size*2];&lt;br /&gt;
	get_packet(packetChar,buffer,size);&lt;br /&gt;
	//printf(&amp;quot;\n%s&amp;quot;, packetChar);&lt;br /&gt;
	struct etherFrame ether2;&lt;br /&gt;
	ether2=getMacAddressType(packetChar);&lt;br /&gt;
  &lt;br /&gt;
    	switch(ether2.casePacket){&lt;br /&gt;
        case 1:&lt;br /&gt;
            printf(&amp;quot;\nCase IPV4:&amp;quot;);&lt;br /&gt;
            struct ipFrame resultIP= analyseIP4(ether2, packetChar);&lt;br /&gt;
&lt;br /&gt;
            int caseIp = atoi(resultIP.protocolIP);&lt;br /&gt;
            &lt;br /&gt;
            switch(caseIp){&lt;br /&gt;
                case 6:&lt;br /&gt;
                    printf(&amp;quot;\nTCP:\n&amp;quot;);&lt;br /&gt;
                    // Case TCP &lt;br /&gt;
                    checksum(resultIP.fullHeader, resultIP.CsIP);&lt;br /&gt;
                    ;&lt;br /&gt;
                    break;&lt;br /&gt;
                case 17:&lt;br /&gt;
                    // UDP &lt;br /&gt;
                    printf(&amp;quot;\nUDP\n&amp;quot;);&lt;br /&gt;
                    checksum(resultIP.fullHeader, resultIP.CsIP);&lt;br /&gt;
            ;&lt;br /&gt;
            break;&lt;br /&gt;
    }}&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Tblondin</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=IMA4_2021/2022_EC6&amp;diff=58624</id>
		<title>IMA4 2021/2022 EC6</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=IMA4_2021/2022_EC6&amp;diff=58624"/>
				<updated>2022-09-07T17:38:19Z</updated>
		
		<summary type="html">&lt;p&gt;Tblondin : /* Documents Rendus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectif =&lt;br /&gt;
&lt;br /&gt;
Développer un micro utilitaire de type &amp;lt;code&amp;gt;tcpdump&amp;lt;/code&amp;gt; pour analyser les paquets TCP/IP. &lt;br /&gt;
&lt;br /&gt;
En vous basant sur les sources du logiciel d'interception des paquets réseau des travaux dirigés du semestre 7, réalisez&lt;br /&gt;
un analyseur de paquets TCP/IP avec les caractéristiques suivantes :&lt;br /&gt;
* les paquets sont toujours affichés sous leur forme numérique ;&lt;br /&gt;
* les entêtes Ethernet sont affichées en clair (les trois champs que vous connaissez bien) ;&lt;br /&gt;
* 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 ;&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
Vous devez documenter vos avancées sur cette page Wiki. Au vu du retard que vous avez pris dans l'épreuve, merci&lt;br /&gt;
de mettre à jour votre Wiki au moins deux fois par semaine.&lt;br /&gt;
&lt;br /&gt;
= Travail réaliser =&lt;br /&gt;
Pour réaliser ce projet j'ai commencé par récupérer différents paquets ethernet &amp;quot;type&amp;quot; qui me permettront de développer mon programme . Pour cela j'utilise l'utilitaire wireshark&lt;br /&gt;
Cela me permet de récupérer un exemple de trame ipv4 :&lt;br /&gt;
&lt;br /&gt;
 0000   48 f1 7f d0 32 20 78 81 02 31 36 76 86 dd 60 00   H...2 x..16v..`.&lt;br /&gt;
 0010   00 00 00 21 11 3b 2a 00 14 50 40 07 08 0f 00 00   ...!.;*..P@.....&lt;br /&gt;
 0020   00 00 00 00 20 02 2a 01 cb 00 0a a2 68 00 7d 7c   .... .*.....h.}|&lt;br /&gt;
 0030   c5 0a 46 7f fe f6 01 bb d8 4c 00 21 0d c0 40 2e   ..F......L.!..@.&lt;br /&gt;
 0040   40 71 fe 71 19 9e 41 f3 a7 a0 1c 35 5a 25 73 8b   @q.q..A....5Z%s.&lt;br /&gt;
 0050   cf 41 11 bb 80 b3 b4                              .A.....&lt;br /&gt;
&lt;br /&gt;
Ainsi que les informations associées:&lt;br /&gt;
&lt;br /&gt;
 Frame 680: 87 bytes on wire (696 bits), 87 bytes captured (696 bits) on interface \Device\NPF_{4DB062CB-0742-4EDE-86A1-1CFB3480F3BE}, id 0&lt;br /&gt;
 Ethernet II, Src: Sercomm_31:36:76 (78:81:02:31:36:76), Dst: IntelCor_d0:32:20 (48:f1:7f:d0:32:20)&lt;br /&gt;
 Internet Protocol Version 6, Src: 2a00:1450:4007:80f::2002, Dst: 2a01:cb00:aa2:6800:7d7c:c50a:467f:fef6&lt;br /&gt;
 User Datagram Protocol, Src Port: 443, Dst Port: 55372&lt;br /&gt;
 Data (25 bytes)&lt;br /&gt;
&lt;br /&gt;
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&lt;br /&gt;
J'ai décomposé mon programme en plusieurs routine. &lt;br /&gt;
Récupération de la trame-&amp;gt; Récupération des en-têtes ethernet -&amp;gt; Sélection du type de protocole -&amp;gt; si c'est un IPV4 affichage de ses en-têtes et vérification de la checksum&lt;br /&gt;
&lt;br /&gt;
Récupération de la trame:&lt;br /&gt;
Ma première routine me permet de récupérer un paquet complet sous la forme d'un char&lt;br /&gt;
Exemple&lt;br /&gt;
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&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
= Documents Rendus =&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/stat.h&amp;gt;&lt;br /&gt;
#define DEFAUT_SIZE 300&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;errno.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;getopt.h&amp;gt;&lt;br /&gt;
#include &amp;lt;time.h&amp;gt;&lt;br /&gt;
#include &amp;lt;signal.h&amp;gt;&lt;br /&gt;
#include &amp;lt;net/if.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/socket.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/ioctl.h&amp;gt;&lt;br /&gt;
#include &amp;lt;linux/in.h&amp;gt;&lt;br /&gt;
#include &amp;lt;linux/if_ether.h&amp;gt;&lt;br /&gt;
#include &amp;lt;linux/if_packet.h&amp;gt;&lt;br /&gt;
#include &amp;lt;linux/filter.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define BUFFER_SIZE 2048&lt;br /&gt;
#define MAX_COLUMNS 16&lt;br /&gt;
#define ETHER_ADDR_LEN 6&lt;br /&gt;
&lt;br /&gt;
#define MODE_DISPLAY 0&lt;br /&gt;
#define MODE_SEND 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
struct etherFrame&lt;br /&gt;
{&lt;br /&gt;
    char sourceMac[18];&lt;br /&gt;
    char destMac[18];&lt;br /&gt;
    char etherType[5];&lt;br /&gt;
    char nameType[15];&lt;br /&gt;
    int casePacket;&lt;br /&gt;
   &lt;br /&gt;
    &lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct ipFrame{&lt;br /&gt;
    char versionIp[2];&lt;br /&gt;
    char lenghtHeaderIp[2];&lt;br /&gt;
    char DSCP_ECN[2];&lt;br /&gt;
    char lenghtIP[4];&lt;br /&gt;
    char identIp[5];&lt;br /&gt;
    char flagIp[3];&lt;br /&gt;
    char TTL[5];&lt;br /&gt;
    char protocolIP[3];&lt;br /&gt;
    char CsIP[5];&lt;br /&gt;
    unsigned char sourceIP[4];&lt;br /&gt;
    unsigned char destIP[4];&lt;br /&gt;
    char fullHeader[40];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const char* filename = &amp;quot;temp.txt&amp;quot;;&lt;br /&gt;
int indexPacket=0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
char *ifname=&amp;quot;enp0s3&amp;quot;;  /* Interface reseau a utiliser */&lt;br /&gt;
unsigned char broadcast=1; /* Capture ou non des diffusions */&lt;br /&gt;
unsigned char unicast=0; /* Capture limitee a une adresse MAC ou non */&lt;br /&gt;
char macAddress[ETHER_ADDR_LEN];/* adresse MAC a surveiller */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int openRawEthernetSocket(char *ifname){&lt;br /&gt;
  struct sockaddr_ll address;&lt;br /&gt;
  int proto=htons(ETH_P_ALL);&lt;br /&gt;
  int result;&lt;br /&gt;
&lt;br /&gt;
  if((result=socket(PF_PACKET,SOCK_RAW,proto))&amp;lt;0){&lt;br /&gt;
    perror(&amp;quot;openRawEthernetSocket.socket&amp;quot;);&lt;br /&gt;
    exit(1);&lt;br /&gt;
  }&lt;br /&gt;
  return result;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  void readPacket(int sock,char *packet,int *size){&lt;br /&gt;
  *size=recvfrom(sock,packet,*size,0,NULL,NULL);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
int get_packet(char *packet, char *buffer, int size){&lt;br /&gt;
&lt;br /&gt;
	int i,j;&lt;br /&gt;
	j=0;&lt;br /&gt;
	&lt;br /&gt;
	//packet=(char *)malloc(sizeof(char)*size);&lt;br /&gt;
	for (i=0;i&amp;lt;size;i++){&lt;br /&gt;
		sprintf(&amp;amp;packet[j],&amp;quot;%02x&amp;quot;,(unsigned char)buffer[i]);&lt;br /&gt;
		j=j+2;&lt;br /&gt;
		}&lt;br /&gt;
	packet[j]='\0';&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
struct etherFrame getMacAddressType(char *packetChar){&lt;br /&gt;
    struct etherFrame ether1;&lt;br /&gt;
    int i;&lt;br /&gt;
    // nettoyage de la chaîne de charactère à cause d'un bug :&amp;quot;G��U48:f1:7f:f0:32:20:&amp;quot; en plus de la mac address des charactère sont présents au début &lt;br /&gt;
    // Je pense que l'erreur ici est que j'ai alloué une zone mémoire à ma string mais je ne l'ai pas initialisé &lt;br /&gt;
    strcpy(ether1.destMac,&amp;quot;&amp;quot;);&lt;br /&gt;
    strcpy(ether1.sourceMac,&amp;quot;&amp;quot;);&lt;br /&gt;
    strcpy(ether1.etherType,&amp;quot;&amp;quot;);&lt;br /&gt;
    strcpy(ether1.nameType,&amp;quot;&amp;quot;);&lt;br /&gt;
    // Pour résoudre ça je copie dans ma string un texte vide &lt;br /&gt;
&lt;br /&gt;
// Récupération de l'addresse mac de destination&lt;br /&gt;
    for(i=0;i&amp;lt;12;i=i+2){&lt;br /&gt;
        strcat(ether1.destMac,&amp;quot;:&amp;quot;); &lt;br /&gt;
        strncat(ether1.destMac,&amp;amp;packetChar[i],1);&lt;br /&gt;
        strncat(ether1.destMac,&amp;amp;packetChar[i+1],1);&lt;br /&gt;
               &lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\nAddresse mac de destination%s\n&amp;quot;,ether1.destMac);&lt;br /&gt;
//Récupération de l'addresse mac source &lt;br /&gt;
    for(i=12;i&amp;lt;24;i=i+2){&lt;br /&gt;
        strcat(ether1.sourceMac,&amp;quot;:&amp;quot;);&lt;br /&gt;
        strncat(ether1.sourceMac,&amp;amp;packetChar[i],1);&lt;br /&gt;
        strncat(ether1.sourceMac,&amp;amp;packetChar[i+1],1);&lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Addresse mac source%s\n&amp;quot;,ether1.sourceMac);&lt;br /&gt;
    ;// bug de mémoire des caractères sont ajoutés sans raison (solved)&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
// Récupération du type &lt;br /&gt;
&lt;br /&gt;
    *(ether1.etherType)=*(packetChar+24);&lt;br /&gt;
    *(ether1.etherType+1)=*(packetChar+25);&lt;br /&gt;
    *(ether1.etherType+2)=*(packetChar+26);&lt;br /&gt;
    *(ether1.etherType+3)=*(packetChar+27);&lt;br /&gt;
    &lt;br /&gt;
    // J'avais ici une erreur dans ma string. Lorsque je rajoutais le nameType la char etherType &amp;quot;récupérait&amp;quot; aussi la valeur IPV4 ce qui me rendait printf(etherType) 0800IPV4&lt;br /&gt;
    // La lenght de etherType changeait aussi sans raison&lt;br /&gt;
    // 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&lt;br /&gt;
    // etherType s'arretait à \0 de nameType&lt;br /&gt;
    *(ether1.etherType+4)='\0';&lt;br /&gt;
    &lt;br /&gt;
    // Vérification du type etherType&lt;br /&gt;
    if (strcmp(ether1.etherType,&amp;quot;0800&amp;quot;)==0){&lt;br /&gt;
        strcpy(ether1.nameType,&amp;quot;IPV4&amp;quot;);&lt;br /&gt;
        ether1.casePacket =1;&lt;br /&gt;
            }&lt;br /&gt;
    else if (strcmp(ether1.etherType,&amp;quot;0806&amp;quot;)==0){&lt;br /&gt;
        strcpy(ether1.nameType,&amp;quot;ARP&amp;quot;);  &lt;br /&gt;
        ether1.casePacket =2;&lt;br /&gt;
    }&lt;br /&gt;
    else if (strcmp(ether1.etherType,&amp;quot;86dd&amp;quot;)==0){&lt;br /&gt;
        strcpy(ether1.nameType,&amp;quot;IPV6&amp;quot;);        &lt;br /&gt;
        ether1.casePacket =3;&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        strcpy(ether1.nameType,&amp;quot;UNKNOWNS&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Type en Hexa: %s/ EtherType:%s\n&amp;quot;,ether1.etherType,ether1.nameType);&lt;br /&gt;
    return ether1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
struct ipFrame analyseIP4(struct etherFrame ether1, char *packetChar){&lt;br /&gt;
    struct ipFrame ip;&lt;br /&gt;
    // récupération de la version IP et de la longueur de l'en-tête&lt;br /&gt;
    //printf(&amp;quot;Test&amp;quot;);&lt;br /&gt;
    char *ptr;&lt;br /&gt;
    strcpy(ip.versionIp,&amp;quot;&amp;quot;);&lt;br /&gt;
    strcpy(ip.lenghtHeaderIp,&amp;quot;&amp;quot;);&lt;br /&gt;
    strcpy(ip.DSCP_ECN,&amp;quot;&amp;quot;);&lt;br /&gt;
    strcpy(ip.lenghtIP,&amp;quot;&amp;quot;);&lt;br /&gt;
    strcpy(ip.identIp,&amp;quot;&amp;quot;);&lt;br /&gt;
    ip.versionIp[0]=*(packetChar+28);&lt;br /&gt;
    ip.lenghtHeaderIp[0]=*(packetChar+29);&lt;br /&gt;
&lt;br /&gt;
    int tailleHeader = atoi(ip.lenghtHeaderIp)*4;&lt;br /&gt;
    printf(&amp;quot;\nTaille Header %d byte&amp;quot;,tailleHeader);&lt;br /&gt;
    &lt;br /&gt;
    ip.DSCP_ECN[0]=*(packetChar+30);&lt;br /&gt;
    ip.DSCP_ECN[1]=*(packetChar+31);&lt;br /&gt;
    &lt;br /&gt;
    ip.lenghtIP[0]=*(packetChar+32);&lt;br /&gt;
    ip.lenghtIP[1]=*(packetChar+33);&lt;br /&gt;
    ip.lenghtIP[2]=*(packetChar+34);&lt;br /&gt;
    ip.lenghtIP[3]=*(packetChar+35);&lt;br /&gt;
    &lt;br /&gt;
    //printf(&amp;quot;%s&amp;quot;,ip.lenghtIP);&lt;br /&gt;
    long taillePaquetIp=strtol(ip.lenghtIP,NULL,16);&lt;br /&gt;
    printf(&amp;quot;\nTaille du paquet IP: %ld&amp;quot;,taillePaquetIp);&lt;br /&gt;
    &lt;br /&gt;
    ip.identIp[0]=*(packetChar+36);&lt;br /&gt;
    ip.identIp[1]=*(packetChar+37);&lt;br /&gt;
    ip.identIp[2]=*(packetChar+38);&lt;br /&gt;
    ip.identIp[3]=*(packetChar+39);&lt;br /&gt;
    ip.identIp[4]='\0';&lt;br /&gt;
    printf(&amp;quot;\nIdentification %s&amp;quot;,ip.identIp);&lt;br /&gt;
    &lt;br /&gt;
    ip.flagIp[0]=*(packetChar+40);&lt;br /&gt;
    ip.flagIp[1]=*(packetChar+41);&lt;br /&gt;
    ip.flagIp[2]='\0';&lt;br /&gt;
    printf(&amp;quot;\nFlag IP: %s&amp;quot;, ip.flagIp);&lt;br /&gt;
    &lt;br /&gt;
    ip.TTL[0]=*(packetChar+42);&lt;br /&gt;
    ip.TTL[1]=*(packetChar+43);&lt;br /&gt;
    ip.TTL[2]=*(packetChar+44);&lt;br /&gt;
    ip.TTL[3]=*(packetChar+45);&lt;br /&gt;
    ip.TTL[4]='\0';&lt;br /&gt;
    printf(&amp;quot;\nTTL: %s&amp;quot;, ip.TTL);&lt;br /&gt;
    &lt;br /&gt;
    ip.protocolIP[0]=*(packetChar+46);&lt;br /&gt;
    ip.protocolIP[1]=*(packetChar+47);&lt;br /&gt;
    ip.protocolIP[2]='\0';&lt;br /&gt;
    printf(&amp;quot;\nProtocole:%s&amp;quot;, ip.protocolIP);&lt;br /&gt;
    ;&lt;br /&gt;
    ip.CsIP[0]=*(packetChar+48);&lt;br /&gt;
    ip.CsIP[1]=*(packetChar+49);&lt;br /&gt;
    ip.CsIP[2]=*(packetChar+50);&lt;br /&gt;
    ip.CsIP[3]=*(packetChar+51);&lt;br /&gt;
    ip.CsIP[4]='\0';&lt;br /&gt;
    printf(&amp;quot;\nCS= %s&amp;quot;,ip.CsIP);&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    // Récupération de l'ip source&lt;br /&gt;
    char tempChar[2];    &lt;br /&gt;
    tempChar[2]='\0';&lt;br /&gt;
    tempChar[0]=*(packetChar+52);&lt;br /&gt;
    tempChar[1]=*(packetChar+53);&lt;br /&gt;
&lt;br /&gt;
    ip.sourceIP[0]= strtol(tempChar,NULL,16);&lt;br /&gt;
    &lt;br /&gt;
    tempChar[0]=*(packetChar+54);&lt;br /&gt;
    tempChar[1]=*(packetChar+55);&lt;br /&gt;
    ip.sourceIP[1]=strtol(tempChar,NULL,16);&lt;br /&gt;
    &lt;br /&gt;
    tempChar[0]=*(packetChar+56);&lt;br /&gt;
    tempChar[1]=*(packetChar+57);&lt;br /&gt;
    ip.sourceIP[2]= strtol(tempChar,NULL,16);&lt;br /&gt;
    &lt;br /&gt;
    tempChar[0]=*(packetChar+58);&lt;br /&gt;
    tempChar[1]=*(packetChar+59);&lt;br /&gt;
    ip.sourceIP[3]= strtol(tempChar,NULL,16);&lt;br /&gt;
    &lt;br /&gt;
    //Récupération de l'ip dest&lt;br /&gt;
    tempChar[0]=*(packetChar+60);&lt;br /&gt;
    tempChar[1]=*(packetChar+61);&lt;br /&gt;
    ip.destIP[0]= strtol(tempChar,NULL,16);&lt;br /&gt;
    &lt;br /&gt;
    tempChar[0]=*(packetChar+62);&lt;br /&gt;
    tempChar[1]=*(packetChar+63);&lt;br /&gt;
    ip.destIP[1]= strtol(tempChar,NULL,16);&lt;br /&gt;
    &lt;br /&gt;
    tempChar[0]=*(packetChar+64);&lt;br /&gt;
    tempChar[1]=*(packetChar+65);&lt;br /&gt;
    ip.destIP[2]= strtol(tempChar,NULL,16);&lt;br /&gt;
    &lt;br /&gt;
    tempChar[0]=*(packetChar+66);&lt;br /&gt;
    &lt;br /&gt;
    tempChar[1]=*(packetChar+67);&lt;br /&gt;
    ip.destIP[3]= strtol(tempChar,NULL,16);&lt;br /&gt;
    &lt;br /&gt;
    printf(&amp;quot;\nIp source %d.%d.%d.%d&amp;quot;,ip.sourceIP[0],ip.sourceIP[1],ip.sourceIP[2],ip.sourceIP[3]);&lt;br /&gt;
    printf(&amp;quot;\nIp de destination %d.%d.%d.%d&amp;quot;,ip.destIP[0],ip.destIP[1],ip.destIP[2],ip.destIP[3]);&lt;br /&gt;
    &lt;br /&gt;
//     printf(&amp;quot;tes 1 %d\n&amp;quot;,strlen(ip.fullHeader));&lt;br /&gt;
//     printf(&amp;quot;test 2 %d\n&amp;quot;,sizeof(ip.fullHeader));&lt;br /&gt;
//     &lt;br /&gt;
    printf(&amp;quot;\n%d &amp;quot;, tailleHeader);&lt;br /&gt;
//     ip.fullHeader = malloc(tailleHeader);&lt;br /&gt;
//     printf(&amp;quot;test 3 %d\n&amp;quot;,strlen(ip.fullHeader));&lt;br /&gt;
//     printf(&amp;quot;test 4 %d\n&amp;quot;,sizeof(ip.fullHeader));&lt;br /&gt;
    &lt;br /&gt;
    int index=0;&lt;br /&gt;
    int i;&lt;br /&gt;
    &lt;br /&gt;
    for(i=28;i&amp;lt;28+(tailleHeader*2);i=i+1){&lt;br /&gt;
//         printf(&amp;quot;%d\n&amp;quot;,strlen(ip.fullHeader));&lt;br /&gt;
//         printf(&amp;quot;%s&amp;quot;,ip.fullHeader);&lt;br /&gt;
&lt;br /&gt;
        ip.fullHeader[index]=packetChar[i];&lt;br /&gt;
        index++;&lt;br /&gt;
    }&lt;br /&gt;
    ip.fullHeader[tailleHeader*2]='\0';&lt;br /&gt;
    //printf(&amp;quot;\n%s&amp;quot;,ip.fullHeader);&lt;br /&gt;
    return ip;&lt;br /&gt;
}&lt;br /&gt;
void displayPacket(FILE *stream,char *packet,int size){&lt;br /&gt;
  int i,count=MAX_COLUMNS;&lt;br /&gt;
  for(i=0;i&amp;lt;size;i++){&lt;br /&gt;
    fprintf(stream,&amp;quot;%2.2x &amp;quot;,(unsigned char)packet[i]);&lt;br /&gt;
    count--;&lt;br /&gt;
    if(count&amp;lt;=0){ fprintf(stream,&amp;quot;\n&amp;quot;); count=MAX_COLUMNS; }&lt;br /&gt;
    }&lt;br /&gt;
  if(count!=MAX_COLUMNS) fprintf(stream,&amp;quot;\n&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
    &lt;br /&gt;
 void checksum(char *header, char *inputCS){&lt;br /&gt;
 	char byte1[]=&amp;quot;0000000000000000&amp;quot;;&lt;br /&gt;
 	char byte2[]=&amp;quot;0000000000000000&amp;quot;;&lt;br /&gt;
 	char word[]=&amp;quot;0000&amp;quot;;&lt;br /&gt;
 	char wordBinary[]=&amp;quot;0000000000000000&amp;quot;;&lt;br /&gt;
 	char checkResult[]=&amp;quot;0000000000000000&amp;quot;;&lt;br /&gt;
 	char carry[]=&amp;quot;0&amp;quot;;&lt;br /&gt;
 	int len=strlen(header);&lt;br /&gt;
 	&lt;br /&gt;
 	int i=0;&lt;br /&gt;
 	int j,k;&lt;br /&gt;
 	byte2[17]='\0';&lt;br /&gt;
 	&lt;br /&gt;
 	while (i&amp;lt;len){&lt;br /&gt;
&lt;br /&gt;
	 	sprintf(word,&amp;quot;%.4s&amp;quot;, header+i); // récupération des 2 octets&lt;br /&gt;
	 	&lt;br /&gt;
	 	if(strcmp(word,inputCS)==0){&lt;br /&gt;
	 		strcpy(word,&amp;quot;0000&amp;quot;);&lt;br /&gt;
	 		strcpy(wordBinary,&amp;quot;0000000000000000&amp;quot;);&lt;br /&gt;
	 		strcpy(byte1,&amp;quot;0000000000000000&amp;quot;);&lt;br /&gt;
	 	} // exclusion de la CS du header &lt;br /&gt;
	 		&lt;br /&gt;
	 	else{&lt;br /&gt;
	 		strcpy(byte1,&amp;quot;0000000000000000&amp;quot;);&lt;br /&gt;
		 	sprintf(wordBinary,&amp;quot;%b&amp;quot;,strtol(word,NULL,16));	 	&lt;br /&gt;
		 	k=16;&lt;br /&gt;
		 &lt;br /&gt;
		 	&lt;br /&gt;
		 	for (j=strlen(wordBinary); j!=-1; j=j-1){&lt;br /&gt;
		 		byte1[k]=wordBinary[j];&lt;br /&gt;
		 		k=k-1;&lt;br /&gt;
		 	}&lt;br /&gt;
	 	}&lt;br /&gt;
	 	&lt;br /&gt;
	 	// addiftion de byte1 et byte2 &lt;br /&gt;
	 	for (j=15;j!=-1;j--){&lt;br /&gt;
	 		if (byte1[j]=='0' &amp;amp;&amp;amp; byte2[j]=='0' &amp;amp;&amp;amp; carry[0]=='0') {&lt;br /&gt;
	 			byte2[j]='0';&lt;br /&gt;
	 			}&lt;br /&gt;
	 		else if (byte1[j]=='0' &amp;amp;&amp;amp; byte2[j]=='0'&amp;amp;&amp;amp; carry[0]=='1'){&lt;br /&gt;
	 			byte2[j]='1';&lt;br /&gt;
	 			carry[0]='0';}&lt;br /&gt;
	 		else if (byte1[j]=='0' &amp;amp;&amp;amp; byte2[j]=='1' &amp;amp;&amp;amp; carry[0]=='0'){&lt;br /&gt;
	 			byte2[j]='1';&lt;br /&gt;
	 			carry[0]='0';}&lt;br /&gt;
	 		else if (byte1[j]=='1' &amp;amp;&amp;amp; byte2[j]=='0' &amp;amp;&amp;amp; carry[0]=='0'){&lt;br /&gt;
	 			byte2[j]='1';&lt;br /&gt;
	 			carry[0]='0';}&lt;br /&gt;
	 		else if (byte1[j]=='1' &amp;amp;&amp;amp; byte2[j]=='1' &amp;amp;&amp;amp; carry[0]=='0'){&lt;br /&gt;
	 			byte2[j]='0';&lt;br /&gt;
	 			carry[0]='1';}&lt;br /&gt;
	 		else if (byte1[j]=='1' &amp;amp;&amp;amp; byte2[j]=='1' &amp;amp;&amp;amp; carry[0]=='1'){&lt;br /&gt;
	 			byte2[j]='1';&lt;br /&gt;
	 			carry[0]='1';}&lt;br /&gt;
	 		&lt;br /&gt;
	 	}&lt;br /&gt;
	 	&lt;br /&gt;
	 	/**&lt;br /&gt;
	 	printf(&amp;quot;\nHexa %s&amp;quot;,word);&lt;br /&gt;
	 	printf(&amp;quot;\nWord: %s&amp;quot;,byte1);&lt;br /&gt;
	 	printf(&amp;quot;\nCS:   %s\n&amp;quot;,byte2);&lt;br /&gt;
	 	*/&lt;br /&gt;
	 	i=i+4;&lt;br /&gt;
 	}&lt;br /&gt;
 	// complément à 1 du résultat et affichage en hex&lt;br /&gt;
 	//printf(&amp;quot;\nChecksum calculé: %lx \n&amp;quot;,strtol(byte2,NULL,2));&lt;br /&gt;
 	for (j=15;j&amp;gt;0;j--){&lt;br /&gt;
	 		if (byte2[j]=='0' ){&lt;br /&gt;
	 			checkResult[j]='0';&lt;br /&gt;
	 			}&lt;br /&gt;
	 		else {	checkResult[j]='1';&lt;br /&gt;
	 			}&lt;br /&gt;
	 	}&lt;br /&gt;
	 	&lt;br /&gt;
	 	printf(&amp;quot;\nChecksum calculé: %lx \n&amp;quot;,strtol(checkResult,NULL,2));&lt;br /&gt;
	 	&lt;br /&gt;
	 &lt;br /&gt;
 &lt;br /&gt;
 } &lt;br /&gt;
   &lt;br /&gt;
void main(){&lt;br /&gt;
&lt;br /&gt;
	int sock;&lt;br /&gt;
  	int size;&lt;br /&gt;
  	char buffer[BUFFER_SIZE];  	&lt;br /&gt;
  	sock=openRawEthernetSocket(ifname);&lt;br /&gt;
  	readPacket(sock,buffer,&amp;amp;size);&lt;br /&gt;
  	&lt;br /&gt;
  	&lt;br /&gt;
  	if (strlen(buffer)==0){printf(&amp;quot;Aucun paquet reçu\n&amp;quot;);exit(0);};&lt;br /&gt;
  	printf(&amp;quot;\nAffichage du paquet:\n&amp;quot;);&lt;br /&gt;
   	displayPacket(stdout,buffer,size);&lt;br /&gt;
   	&lt;br /&gt;
   	&lt;br /&gt;
   	char packetChar[2+size*2];&lt;br /&gt;
	get_packet(packetChar,buffer,size);&lt;br /&gt;
	//printf(&amp;quot;\n%s&amp;quot;, packetChar);&lt;br /&gt;
	struct etherFrame ether2;&lt;br /&gt;
	ether2=getMacAddressType(packetChar);&lt;br /&gt;
  &lt;br /&gt;
    	switch(ether2.casePacket){&lt;br /&gt;
        case 1:&lt;br /&gt;
            printf(&amp;quot;\nCase IPV4:&amp;quot;);&lt;br /&gt;
            struct ipFrame resultIP= analyseIP4(ether2, packetChar);&lt;br /&gt;
&lt;br /&gt;
            int caseIp = atoi(resultIP.protocolIP);&lt;br /&gt;
            &lt;br /&gt;
            switch(caseIp){&lt;br /&gt;
                case 6:&lt;br /&gt;
                    printf(&amp;quot;\nTCP:\n&amp;quot;);&lt;br /&gt;
                    // Case TCP &lt;br /&gt;
                    checksum(resultIP.fullHeader, resultIP.CsIP);&lt;br /&gt;
                    ;&lt;br /&gt;
                    break;&lt;br /&gt;
                case 17:&lt;br /&gt;
                    // UDP &lt;br /&gt;
                    printf(&amp;quot;\nUDP\n&amp;quot;);&lt;br /&gt;
                    checksum(resultIP.fullHeader, resultIP.CsIP);&lt;br /&gt;
            ;&lt;br /&gt;
            break;&lt;br /&gt;
    }}&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Tblondin</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=IMA4_2021/2022_EC6&amp;diff=58584</id>
		<title>IMA4 2021/2022 EC6</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=IMA4_2021/2022_EC6&amp;diff=58584"/>
				<updated>2022-09-06T22:56:47Z</updated>
		
		<summary type="html">&lt;p&gt;Tblondin : /* Documents Rendus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectif =&lt;br /&gt;
&lt;br /&gt;
Développer un micro utilitaire de type &amp;lt;code&amp;gt;tcpdump&amp;lt;/code&amp;gt; pour analyser les paquets TCP/IP. &lt;br /&gt;
&lt;br /&gt;
En vous basant sur les sources du logiciel d'interception des paquets réseau des travaux dirigés du semestre 7, réalisez&lt;br /&gt;
un analyseur de paquets TCP/IP avec les caractéristiques suivantes :&lt;br /&gt;
* les paquets sont toujours affichés sous leur forme numérique ;&lt;br /&gt;
* les entêtes Ethernet sont affichées en clair (les trois champs que vous connaissez bien) ;&lt;br /&gt;
* 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 ;&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
Vous devez documenter vos avancées sur cette page Wiki. Au vu du retard que vous avez pris dans l'épreuve, merci&lt;br /&gt;
de mettre à jour votre Wiki au moins deux fois par semaine.&lt;br /&gt;
&lt;br /&gt;
= Travail réaliser =&lt;br /&gt;
Pour réaliser ce projet j'ai commencé par récupérer différents paquets ethernet &amp;quot;type&amp;quot; qui me permettront de développer mon programme . Pour cela j'utilise l'utilitaire wireshark&lt;br /&gt;
Cela me permet de récupérer un exemple de trame ipv4 :&lt;br /&gt;
&lt;br /&gt;
 0000   48 f1 7f d0 32 20 78 81 02 31 36 76 86 dd 60 00   H...2 x..16v..`.&lt;br /&gt;
 0010   00 00 00 21 11 3b 2a 00 14 50 40 07 08 0f 00 00   ...!.;*..P@.....&lt;br /&gt;
 0020   00 00 00 00 20 02 2a 01 cb 00 0a a2 68 00 7d 7c   .... .*.....h.}|&lt;br /&gt;
 0030   c5 0a 46 7f fe f6 01 bb d8 4c 00 21 0d c0 40 2e   ..F......L.!..@.&lt;br /&gt;
 0040   40 71 fe 71 19 9e 41 f3 a7 a0 1c 35 5a 25 73 8b   @q.q..A....5Z%s.&lt;br /&gt;
 0050   cf 41 11 bb 80 b3 b4                              .A.....&lt;br /&gt;
&lt;br /&gt;
Ainsi que les informations associées:&lt;br /&gt;
&lt;br /&gt;
 Frame 680: 87 bytes on wire (696 bits), 87 bytes captured (696 bits) on interface \Device\NPF_{4DB062CB-0742-4EDE-86A1-1CFB3480F3BE}, id 0&lt;br /&gt;
 Ethernet II, Src: Sercomm_31:36:76 (78:81:02:31:36:76), Dst: IntelCor_d0:32:20 (48:f1:7f:d0:32:20)&lt;br /&gt;
 Internet Protocol Version 6, Src: 2a00:1450:4007:80f::2002, Dst: 2a01:cb00:aa2:6800:7d7c:c50a:467f:fef6&lt;br /&gt;
 User Datagram Protocol, Src Port: 443, Dst Port: 55372&lt;br /&gt;
 Data (25 bytes)&lt;br /&gt;
&lt;br /&gt;
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&lt;br /&gt;
J'ai décomposé mon programme en plusieurs routine. &lt;br /&gt;
Récupération de la trame-&amp;gt; Récupération des en-têtes ethernet -&amp;gt; Sélection du type de protocole -&amp;gt; si c'est un IPV4 affichage de ses en-têtes et vérification de la checksum&lt;br /&gt;
&lt;br /&gt;
Récupération de la trame:&lt;br /&gt;
Ma première routine me permet de récupérer un paquet complet sous la forme d'un char&lt;br /&gt;
Exemple&lt;br /&gt;
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&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
= Documents Rendus =&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/stat.h&amp;gt;&lt;br /&gt;
#define DEFAUT_SIZE 300&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;errno.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;getopt.h&amp;gt;&lt;br /&gt;
#include &amp;lt;time.h&amp;gt;&lt;br /&gt;
#include &amp;lt;signal.h&amp;gt;&lt;br /&gt;
#include &amp;lt;net/if.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/socket.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/ioctl.h&amp;gt;&lt;br /&gt;
#include &amp;lt;linux/in.h&amp;gt;&lt;br /&gt;
#include &amp;lt;linux/if_ether.h&amp;gt;&lt;br /&gt;
#include &amp;lt;linux/if_packet.h&amp;gt;&lt;br /&gt;
#include &amp;lt;linux/filter.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define BUFFER_SIZE 2048&lt;br /&gt;
#define MAX_COLUMNS 16&lt;br /&gt;
#define ETHER_ADDR_LEN 6&lt;br /&gt;
&lt;br /&gt;
#define MODE_DISPLAY 0&lt;br /&gt;
#define MODE_SEND 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
struct etherFrame&lt;br /&gt;
{&lt;br /&gt;
    char sourceMac[18];&lt;br /&gt;
    char destMac[18];&lt;br /&gt;
    char etherType[5];&lt;br /&gt;
    char nameType[15];&lt;br /&gt;
    int casePacket;&lt;br /&gt;
   &lt;br /&gt;
   &lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct ipFrame{&lt;br /&gt;
    char versionIp[2];&lt;br /&gt;
    char lenghtHeaderIp[2];&lt;br /&gt;
    char DSCP_ECN[2];&lt;br /&gt;
    char lenghtIP[4];&lt;br /&gt;
    char identIp[5];&lt;br /&gt;
    char flagIp[3];&lt;br /&gt;
    char TTL[5];&lt;br /&gt;
    char protocolIP[3];&lt;br /&gt;
    char CsIP[5];&lt;br /&gt;
    unsigned char sourceIP[4];&lt;br /&gt;
    unsigned char destIP[4];&lt;br /&gt;
    char fullHeader[40];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const char* filename = &amp;quot;temp.txt&amp;quot;;&lt;br /&gt;
char packetChar[DEFAUT_SIZE];&lt;br /&gt;
int indexPacket=0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
char *ifname=&amp;quot;eth0&amp;quot;;  /* Interface reseau a utiliser */&lt;br /&gt;
unsigned char broadcast=1; /* Capture ou non des diffusions */&lt;br /&gt;
unsigned char unicast=0; /* Capture limitee a une adresse MAC ou non */&lt;br /&gt;
char macAddress[ETHER_ADDR_LEN];/* adresse MAC a surveiller */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int openRawEthernetSocket(char *ifname){&lt;br /&gt;
  struct sockaddr_ll address;&lt;br /&gt;
  int proto=htons(ETH_P_ALL);&lt;br /&gt;
  int result;&lt;br /&gt;
&lt;br /&gt;
  if((result=socket(PF_PACKET,SOCK_RAW,proto))&amp;lt;0){&lt;br /&gt;
    perror(&amp;quot;openRawEthernetSocket.socket&amp;quot;);&lt;br /&gt;
    exit(1);&lt;br /&gt;
  }&lt;br /&gt;
  return result;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
  void readPacket(int sock,char *packet,int *size){&lt;br /&gt;
  *size=recvfrom(sock,packet,*size,0,NULL,NULL);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
int get_packet()&lt;br /&gt;
//ouverture et récupération du packet dans le fichier choisi&lt;br /&gt;
// Cette partie est désormais inutile je la garde juste pour visualiser ma trame dans un text file &lt;br /&gt;
{&lt;br /&gt;
    FILE *in_file = fopen(filename, &amp;quot;r&amp;quot;);&lt;br /&gt;
    if (!in_file) {&lt;br /&gt;
    printf(&amp;quot;test&amp;quot;);&lt;br /&gt;
        perror(&amp;quot;fopen&amp;quot;);&lt;br /&gt;
        exit(EXIT_FAILURE);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    struct stat sb;&lt;br /&gt;
    if (stat(filename, &amp;amp;sb) == -1) {&lt;br /&gt;
    printf(&amp;quot;test&amp;quot;);&lt;br /&gt;
        perror(&amp;quot;stat&amp;quot;);&lt;br /&gt;
        exit(EXIT_FAILURE);&lt;br /&gt;
    }&lt;br /&gt;
    // Allocation de la taille de la mémoire en fonction de la taille du texte&lt;br /&gt;
    char *file_contents = malloc(sb.st_size);&lt;br /&gt;
   &lt;br /&gt;
    while (fscanf(in_file, &amp;quot;%[^\n ] &amp;quot;, file_contents) != EOF) {&lt;br /&gt;
       &lt;br /&gt;
        strcat(packetChar,file_contents);&lt;br /&gt;
        //printf(&amp;quot; %s\n&amp;quot;, file_contents);&lt;br /&gt;
        //packetChar[indexPacket]=file_contents;&lt;br /&gt;
        //indexPacket++;        &lt;br /&gt;
    }&lt;br /&gt;
    printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
    //printf(&amp;quot;%s&amp;quot;, packetChar);&lt;br /&gt;
    indexPacket=0;&lt;br /&gt;
    fclose(in_file);&lt;br /&gt;
    }&lt;br /&gt;
   &lt;br /&gt;
struct etherFrame getMacAddressType(){&lt;br /&gt;
    struct etherFrame ether1;&lt;br /&gt;
    int i;&lt;br /&gt;
    // nettoyage de la chaîne de charactère à cause d'un bug :&amp;quot;G��U48:f1:7f:f0:32:20:&amp;quot; en plus de la mac address des charactère sont présents au début&lt;br /&gt;
    // Je pense que l'erreur ici est que j'ai alloué une zone mémoire à ma string mais je ne l'ai pas initialisé&lt;br /&gt;
    strcpy(ether1.destMac,&amp;quot;&amp;quot;);&lt;br /&gt;
    strcpy(ether1.sourceMac,&amp;quot;&amp;quot;);&lt;br /&gt;
    strcpy(ether1.etherType,&amp;quot;&amp;quot;);&lt;br /&gt;
    strcpy(ether1.nameType,&amp;quot;&amp;quot;);&lt;br /&gt;
    // Pour résoudre ça je copie dans ma string un texte vide&lt;br /&gt;
&lt;br /&gt;
// Récupération de l'addresse mac de destination&lt;br /&gt;
    for(i=0;i&amp;lt;12;i=i+2){&lt;br /&gt;
        strcat(ether1.destMac,&amp;quot;:&amp;quot;);&lt;br /&gt;
        strncat(ether1.destMac,&amp;amp;packetChar[i],1);&lt;br /&gt;
        strncat(ether1.destMac,&amp;amp;packetChar[i+1],1);&lt;br /&gt;
               &lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\nAddresse mac de destination%s\n&amp;quot;,ether1.destMac);&lt;br /&gt;
//Récupération de l'addresse mac source&lt;br /&gt;
    for(i=12;i&amp;lt;24;i=i+2){&lt;br /&gt;
        strcat(ether1.sourceMac,&amp;quot;:&amp;quot;);&lt;br /&gt;
        strncat(ether1.sourceMac,&amp;amp;packetChar[i],1);&lt;br /&gt;
        strncat(ether1.sourceMac,&amp;amp;packetChar[i+1],1);&lt;br /&gt;
       &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Addresse mac source%s\n&amp;quot;,ether1.sourceMac);&lt;br /&gt;
    ;// bug de mémoire des caractères sont ajoutés sans raison (solved)&lt;br /&gt;
   &lt;br /&gt;
   &lt;br /&gt;
// Récupération du type&lt;br /&gt;
&lt;br /&gt;
    *(ether1.etherType)=*(packetChar+24);&lt;br /&gt;
    *(ether1.etherType+1)=*(packetChar+25);&lt;br /&gt;
    *(ether1.etherType+2)=*(packetChar+26);&lt;br /&gt;
    *(ether1.etherType+3)=*(packetChar+27);&lt;br /&gt;
   &lt;br /&gt;
    // J'avais ici une erreur dans ma string. Lorsque je rajoutais le nameType la char etherType &amp;quot;récupérait&amp;quot; aussi la valeur IPV4 ce qui me rendait printf(etherType) 0800IPV4&lt;br /&gt;
    // La lenght de etherType changeait aussi sans raison&lt;br /&gt;
    // 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&lt;br /&gt;
    // etherType s'arretait à \0 de nameType&lt;br /&gt;
    *(ether1.etherType+4)='\0';&lt;br /&gt;
   &lt;br /&gt;
    // Vérification du type etherType&lt;br /&gt;
    if (strcmp(ether1.etherType,&amp;quot;0800&amp;quot;)==0){&lt;br /&gt;
        strcpy(ether1.nameType,&amp;quot;IPV4&amp;quot;);&lt;br /&gt;
        ether1.casePacket =1;&lt;br /&gt;
            }&lt;br /&gt;
    else if (strcmp(ether1.etherType,&amp;quot;0806&amp;quot;)==0){&lt;br /&gt;
        strcpy(ether1.nameType,&amp;quot;ARP&amp;quot;);  &lt;br /&gt;
        ether1.casePacket =2;&lt;br /&gt;
    }&lt;br /&gt;
    else if (strcmp(ether1.etherType,&amp;quot;86dd&amp;quot;)==0){&lt;br /&gt;
        strcpy(ether1.nameType,&amp;quot;IPV6&amp;quot;);        &lt;br /&gt;
        ether1.casePacket =3;&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        strcpy(ether1.nameType,&amp;quot;UNKNOWNS&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Type en Hexa: %s/ EtherType:%s\n&amp;quot;,ether1.etherType,ether1.nameType);&lt;br /&gt;
    return ether1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
struct ipFrame analyseIP4(struct etherFrame ether1){&lt;br /&gt;
    struct ipFrame ip;&lt;br /&gt;
    // récupération de la version IP et de la longueur de l'en-tête&lt;br /&gt;
    //printf(&amp;quot;Test&amp;quot;);&lt;br /&gt;
    char *ptr;&lt;br /&gt;
    strcpy(ip.versionIp,&amp;quot;&amp;quot;);&lt;br /&gt;
    strcpy(ip.lenghtHeaderIp,&amp;quot;&amp;quot;);&lt;br /&gt;
    strcpy(ip.DSCP_ECN,&amp;quot;&amp;quot;);&lt;br /&gt;
    strcpy(ip.lenghtIP,&amp;quot;&amp;quot;);&lt;br /&gt;
    strcpy(ip.identIp,&amp;quot;&amp;quot;);&lt;br /&gt;
    ip.versionIp[0]=*(packetChar+28);&lt;br /&gt;
    ip.lenghtHeaderIp[0]=*(packetChar+29);&lt;br /&gt;
&lt;br /&gt;
    int tailleHeader = atoi(ip.lenghtHeaderIp)*4;&lt;br /&gt;
    printf(&amp;quot;\nTaille Header %d byte&amp;quot;,tailleHeader);&lt;br /&gt;
   &lt;br /&gt;
    ip.DSCP_ECN[0]=*(packetChar+30);&lt;br /&gt;
    ip.DSCP_ECN[1]=*(packetChar+31);&lt;br /&gt;
   &lt;br /&gt;
    ip.lenghtIP[0]=*(packetChar+32);&lt;br /&gt;
    ip.lenghtIP[1]=*(packetChar+33);&lt;br /&gt;
    ip.lenghtIP[2]=*(packetChar+34);&lt;br /&gt;
    ip.lenghtIP[3]=*(packetChar+35);&lt;br /&gt;
   &lt;br /&gt;
    //printf(&amp;quot;%s&amp;quot;,ip.lenghtIP);&lt;br /&gt;
    long taillePaquetIp=strtol(ip.lenghtIP,NULL,16);&lt;br /&gt;
    printf(&amp;quot;\nTaille du paquet IP: %ld&amp;quot;,taillePaquetIp);&lt;br /&gt;
   &lt;br /&gt;
    ip.identIp[0]=*(packetChar+36);&lt;br /&gt;
    ip.identIp[1]=*(packetChar+37);&lt;br /&gt;
    ip.identIp[2]=*(packetChar+38);&lt;br /&gt;
    ip.identIp[3]=*(packetChar+39);&lt;br /&gt;
    ip.identIp[4]='\0';&lt;br /&gt;
    printf(&amp;quot;\nIdentification %s&amp;quot;,ip.identIp);&lt;br /&gt;
   &lt;br /&gt;
    ip.flagIp[0]=*(packetChar+40);&lt;br /&gt;
    ip.flagIp[1]=*(packetChar+41);&lt;br /&gt;
    ip.flagIp[2]='\0';&lt;br /&gt;
    printf(&amp;quot;\nFlag IP: %s&amp;quot;, ip.flagIp);&lt;br /&gt;
   &lt;br /&gt;
    ip.TTL[0]=*(packetChar+42);&lt;br /&gt;
    ip.TTL[1]=*(packetChar+43);&lt;br /&gt;
    ip.TTL[2]=*(packetChar+44);&lt;br /&gt;
    ip.TTL[3]=*(packetChar+45);&lt;br /&gt;
    ip.TTL[4]='\0';&lt;br /&gt;
    printf(&amp;quot;\nTTL: %s&amp;quot;, ip.TTL);&lt;br /&gt;
   &lt;br /&gt;
    ip.protocolIP[0]=*(packetChar+46);&lt;br /&gt;
    ip.protocolIP[1]=*(packetChar+47);&lt;br /&gt;
    ip.protocolIP[2]='\0';&lt;br /&gt;
    printf(&amp;quot;\nProtocole:%s&amp;quot;, ip.protocolIP);&lt;br /&gt;
    ;&lt;br /&gt;
    ip.CsIP[0]=*(packetChar+48);&lt;br /&gt;
    ip.CsIP[1]=*(packetChar+49);&lt;br /&gt;
    ip.CsIP[2]=*(packetChar+50);&lt;br /&gt;
    ip.CsIP[3]=*(packetChar+51);&lt;br /&gt;
    ip.CsIP[4]='\0';&lt;br /&gt;
    printf(&amp;quot;\nCS= %s&amp;quot;,ip.CsIP);&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
    // Récupération de l'ip source&lt;br /&gt;
    char tempChar[2];    &lt;br /&gt;
    tempChar[2]='\0';&lt;br /&gt;
    tempChar[0]=*(packetChar+52);&lt;br /&gt;
    tempChar[1]=*(packetChar+53);&lt;br /&gt;
&lt;br /&gt;
    ip.sourceIP[0]= strtol(tempChar,NULL,16);&lt;br /&gt;
   &lt;br /&gt;
    tempChar[0]=*(packetChar+54);&lt;br /&gt;
    tempChar[1]=*(packetChar+55);&lt;br /&gt;
    ip.sourceIP[1]=strtol(tempChar,NULL,16);&lt;br /&gt;
   &lt;br /&gt;
    tempChar[0]=*(packetChar+56);&lt;br /&gt;
    tempChar[1]=*(packetChar+57);&lt;br /&gt;
    ip.sourceIP[2]= strtol(tempChar,NULL,16);&lt;br /&gt;
   &lt;br /&gt;
    tempChar[0]=*(packetChar+58);&lt;br /&gt;
    tempChar[1]=*(packetChar+59);&lt;br /&gt;
    ip.sourceIP[3]= strtol(tempChar,NULL,16);&lt;br /&gt;
   &lt;br /&gt;
    //Récupération de l'ip dest&lt;br /&gt;
    tempChar[0]=*(packetChar+60);&lt;br /&gt;
    tempChar[1]=*(packetChar+61);&lt;br /&gt;
    ip.destIP[0]= strtol(tempChar,NULL,16);&lt;br /&gt;
   &lt;br /&gt;
    tempChar[0]=*(packetChar+62);&lt;br /&gt;
    tempChar[1]=*(packetChar+63);&lt;br /&gt;
    ip.destIP[1]= strtol(tempChar,NULL,16);&lt;br /&gt;
   &lt;br /&gt;
    tempChar[0]=*(packetChar+64);&lt;br /&gt;
    tempChar[1]=*(packetChar+65);&lt;br /&gt;
    ip.destIP[2]= strtol(tempChar,NULL,16);&lt;br /&gt;
   &lt;br /&gt;
    tempChar[0]=*(packetChar+66);&lt;br /&gt;
   &lt;br /&gt;
    tempChar[1]=*(packetChar+67);&lt;br /&gt;
    ip.destIP[3]= strtol(tempChar,NULL,16);&lt;br /&gt;
   &lt;br /&gt;
    printf(&amp;quot;\nIp source %d.%d.%d.%d&amp;quot;,ip.sourceIP[0],ip.sourceIP[1],ip.sourceIP[2],ip.sourceIP[3]);&lt;br /&gt;
    printf(&amp;quot;\nIp de destination %d.%d.%d.%d&amp;quot;,ip.destIP[0],ip.destIP[1],ip.destIP[2],ip.destIP[3]);&lt;br /&gt;
   &lt;br /&gt;
//     printf(&amp;quot;tes 1 %d\n&amp;quot;,strlen(ip.fullHeader));&lt;br /&gt;
//     printf(&amp;quot;test 2 %d\n&amp;quot;,sizeof(ip.fullHeader));&lt;br /&gt;
//    &lt;br /&gt;
    printf(&amp;quot;\n%d &amp;quot;, tailleHeader);&lt;br /&gt;
//     ip.fullHeader = malloc(tailleHeader);&lt;br /&gt;
//     printf(&amp;quot;test 3 %d\n&amp;quot;,strlen(ip.fullHeader));&lt;br /&gt;
//     printf(&amp;quot;test 4 %d\n&amp;quot;,sizeof(ip.fullHeader));&lt;br /&gt;
   &lt;br /&gt;
    int index=0;&lt;br /&gt;
    int i;&lt;br /&gt;
   &lt;br /&gt;
    for(i=28;i&amp;lt;28+(tailleHeader*2);i=i+1){&lt;br /&gt;
//         printf(&amp;quot;%d\n&amp;quot;,strlen(ip.fullHeader));&lt;br /&gt;
//         printf(&amp;quot;%s&amp;quot;,ip.fullHeader);&lt;br /&gt;
&lt;br /&gt;
        ip.fullHeader[index]=packetChar[i];&lt;br /&gt;
        index++;&lt;br /&gt;
    }&lt;br /&gt;
    ip.fullHeader[tailleHeader*2]='\0';&lt;br /&gt;
    printf(&amp;quot;\n%s&amp;quot;,ip.fullHeader);&lt;br /&gt;
    return ip;&lt;br /&gt;
}&lt;br /&gt;
    void displayPacket(FILE *stream,char *packet,int size){&lt;br /&gt;
FILE *fileOpen = fopen(filename,&amp;quot;w&amp;quot;);&lt;br /&gt;
chmod(filename, 777);&lt;br /&gt;
  int i,count=MAX_COLUMNS;&lt;br /&gt;
  for(i=0;i&amp;lt;size;i++){&lt;br /&gt;
    fprintf(stream,&amp;quot;%2.2x&amp;quot;,(unsigned char)packet[i]);&lt;br /&gt;
    fprintf(fileOpen,&amp;quot;%2.2x&amp;quot;,(unsigned char)packet[i]);&lt;br /&gt;
    }&lt;br /&gt;
    fclose(fileOpen);&lt;br /&gt;
    }&lt;br /&gt;
   &lt;br /&gt;
void main(){&lt;br /&gt;
&lt;br /&gt;
int sock;&lt;br /&gt;
  int size;&lt;br /&gt;
  char buffer[BUFFER_SIZE];&lt;br /&gt;
  sock=openRawEthernetSocket(ifname);&lt;br /&gt;
  readPacket(sock,buffer,&amp;amp;size);&lt;br /&gt;
    displayPacket(stdout,buffer,size);&lt;br /&gt;
get_packet();&lt;br /&gt;
    struct etherFrame ether2;&lt;br /&gt;
    ether2=getMacAddressType();&lt;br /&gt;
   &lt;br /&gt;
   printf(&amp;quot;\n%c&amp;quot;,buffer[20]);&lt;br /&gt;
    printf(&amp;quot;\n%1.1x&amp;quot;,buffer[20]);&lt;br /&gt;
    printf(&amp;quot;\n%d\n&amp;quot;,buffer[20]);&lt;br /&gt;
   &lt;br /&gt;
   &lt;br /&gt;
    switch(ether2.casePacket){&lt;br /&gt;
        case 1:&lt;br /&gt;
            printf(&amp;quot;\nCase IPV4:&amp;quot;);&lt;br /&gt;
            struct ipFrame resultIP= analyseIP4(ether2);&lt;br /&gt;
//             printf(&amp;quot;%s\n&amp;quot;,resultIP.CsIP);&lt;br /&gt;
//             printf(&amp;quot;%d\n&amp;quot;, sizeof(resultIP.CsIP));&lt;br /&gt;
//             printf(&amp;quot;%d\n&amp;quot;, strlen(resultIP.CsIP));&lt;br /&gt;
            int caseIp = atoi(resultIP.protocolIP);&lt;br /&gt;
            &lt;br /&gt;
            switch(caseIp){&lt;br /&gt;
                case 6:&lt;br /&gt;
                    printf(&amp;quot;TCP\n&amp;quot;);&lt;br /&gt;
                    // Case TCP&lt;br /&gt;
                   &lt;br /&gt;
                    ;&lt;br /&gt;
                    break;&lt;br /&gt;
                case 17:&lt;br /&gt;
                    // UDP&lt;br /&gt;
            ;&lt;br /&gt;
            break;&lt;br /&gt;
    }}&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Tblondin</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=IMA4_2021/2022_EC6&amp;diff=58583</id>
		<title>IMA4 2021/2022 EC6</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=IMA4_2021/2022_EC6&amp;diff=58583"/>
				<updated>2022-09-06T22:54:17Z</updated>
		
		<summary type="html">&lt;p&gt;Tblondin : /* Documents Rendus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectif =&lt;br /&gt;
&lt;br /&gt;
Développer un micro utilitaire de type &amp;lt;code&amp;gt;tcpdump&amp;lt;/code&amp;gt; pour analyser les paquets TCP/IP. &lt;br /&gt;
&lt;br /&gt;
En vous basant sur les sources du logiciel d'interception des paquets réseau des travaux dirigés du semestre 7, réalisez&lt;br /&gt;
un analyseur de paquets TCP/IP avec les caractéristiques suivantes :&lt;br /&gt;
* les paquets sont toujours affichés sous leur forme numérique ;&lt;br /&gt;
* les entêtes Ethernet sont affichées en clair (les trois champs que vous connaissez bien) ;&lt;br /&gt;
* 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 ;&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
Vous devez documenter vos avancées sur cette page Wiki. Au vu du retard que vous avez pris dans l'épreuve, merci&lt;br /&gt;
de mettre à jour votre Wiki au moins deux fois par semaine.&lt;br /&gt;
&lt;br /&gt;
= Travail réaliser =&lt;br /&gt;
Pour réaliser ce projet j'ai commencé par récupérer différents paquets ethernet &amp;quot;type&amp;quot; qui me permettront de développer mon programme . Pour cela j'utilise l'utilitaire wireshark&lt;br /&gt;
Cela me permet de récupérer un exemple de trame ipv4 :&lt;br /&gt;
&lt;br /&gt;
 0000   48 f1 7f d0 32 20 78 81 02 31 36 76 86 dd 60 00   H...2 x..16v..`.&lt;br /&gt;
 0010   00 00 00 21 11 3b 2a 00 14 50 40 07 08 0f 00 00   ...!.;*..P@.....&lt;br /&gt;
 0020   00 00 00 00 20 02 2a 01 cb 00 0a a2 68 00 7d 7c   .... .*.....h.}|&lt;br /&gt;
 0030   c5 0a 46 7f fe f6 01 bb d8 4c 00 21 0d c0 40 2e   ..F......L.!..@.&lt;br /&gt;
 0040   40 71 fe 71 19 9e 41 f3 a7 a0 1c 35 5a 25 73 8b   @q.q..A....5Z%s.&lt;br /&gt;
 0050   cf 41 11 bb 80 b3 b4                              .A.....&lt;br /&gt;
&lt;br /&gt;
Ainsi que les informations associées:&lt;br /&gt;
&lt;br /&gt;
 Frame 680: 87 bytes on wire (696 bits), 87 bytes captured (696 bits) on interface \Device\NPF_{4DB062CB-0742-4EDE-86A1-1CFB3480F3BE}, id 0&lt;br /&gt;
 Ethernet II, Src: Sercomm_31:36:76 (78:81:02:31:36:76), Dst: IntelCor_d0:32:20 (48:f1:7f:d0:32:20)&lt;br /&gt;
 Internet Protocol Version 6, Src: 2a00:1450:4007:80f::2002, Dst: 2a01:cb00:aa2:6800:7d7c:c50a:467f:fef6&lt;br /&gt;
 User Datagram Protocol, Src Port: 443, Dst Port: 55372&lt;br /&gt;
 Data (25 bytes)&lt;br /&gt;
&lt;br /&gt;
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&lt;br /&gt;
J'ai décomposé mon programme en plusieurs routine. &lt;br /&gt;
Récupération de la trame-&amp;gt; Récupération des en-têtes ethernet -&amp;gt; Sélection du type de protocole -&amp;gt; si c'est un IPV4 affichage de ses en-têtes et vérification de la checksum&lt;br /&gt;
&lt;br /&gt;
Récupération de la trame:&lt;br /&gt;
Ma première routine me permet de récupérer un paquet complet sous la forme d'un char&lt;br /&gt;
Exemple&lt;br /&gt;
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&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
= Documents Rendus =&lt;br /&gt;
&amp;lt;p&amp;gt;#include &amp;lt;stdio.h&amp;gt; #include &amp;lt;stdlib.h&amp;gt; #include &amp;lt;string.h&amp;gt; #include &amp;lt;sys/stat.h&amp;gt; #define DEFAUT_SIZE 300&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; #include &amp;lt;errno.h&amp;gt; #include &amp;lt;unistd.h&amp;gt; #include &amp;lt;getopt.h&amp;gt; #include &amp;lt;time.h&amp;gt; #include &amp;lt;signal.h&amp;gt; #include &amp;lt;net/if.h&amp;gt; #include &amp;lt;sys/socket.h&amp;gt; #include &amp;lt;sys/types.h&amp;gt; #include &amp;lt;sys/ioctl.h&amp;gt; #include &amp;lt;linux/in.h&amp;gt; #include &amp;lt;linux/if_ether.h&amp;gt; #include &amp;lt;linux/if_packet.h&amp;gt; #include &amp;lt;linux/filter.h&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;#define BUFFER_SIZE 2048 #define MAX_COLUMNS 16 #define ETHER_ADDR_LEN 6&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;#define MODE_DISPLAY 0 #define MODE_SEND 1&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; struct etherFrame {  char sourceMac[18];  char destMac[18];  char etherType[5];  char nameType[15];  int casePacket;     };&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;struct ipFrame{  char versionIp[2];  char lenghtHeaderIp[2];  char DSCP_ECN[2];  char lenghtIP[4];  char identIp[5];  char flagIp[3];  char TTL[5];  char protocolIP[3];  char CsIP[5];  unsigned char sourceIP[4];  unsigned char destIP[4];  char fullHeader[40]; };&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;const char* filename = &amp;amp;quot;temp.txt&amp;amp;quot;; char packetChar[DEFAUT_SIZE]; int indexPacket=0;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; char *ifname=&amp;amp;quot;eth0&amp;amp;quot;; /* Interface reseau a utiliser */ unsigned char broadcast=1; /* Capture ou non des diffusions */ unsigned char unicast=0; /* Capture limitee a une adresse MAC ou non */ char macAddress[ETHER_ADDR_LEN];/* adresse MAC a surveiller */&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; int openRawEthernetSocket(char *ifname){  struct sockaddr_ll address;  int proto=htons(ETH_P_ALL);  int result;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; if((result=socket(PF_PACKET,SOCK_RAW,proto))&amp;lt;0){  perror(&amp;amp;quot;openRawEthernetSocket.socket&amp;amp;quot;);  exit(1);  }  return result;  }&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;     void readPacket(int sock,char *packet,int *size){  *size=recvfrom(sock,packet,*size,0,NULL,NULL);  }&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;int get_packet() //ouverture et r&amp;amp;eacute;cup&amp;amp;eacute;ration du packet dans le fichier choisi {  FILE *in_file = fopen(filename, &amp;amp;quot;r&amp;amp;quot;);  if (!in_file) {  printf(&amp;amp;quot;test&amp;amp;quot;);  perror(&amp;amp;quot;fopen&amp;amp;quot;);  exit(EXIT_FAILURE);  }&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; struct stat sb;  if (stat(filename, &amp;amp;amp;sb) == -1) {  printf(&amp;amp;quot;test&amp;amp;quot;);  perror(&amp;amp;quot;stat&amp;amp;quot;);  exit(EXIT_FAILURE);  }  // Allocation de la taille de la m&amp;amp;eacute;moire en fonction de la taille du texte  char *file_contents = malloc(sb.st_size);    while (fscanf(in_file, &amp;amp;quot;%[^\n ] &amp;amp;quot;, file_contents) != EOF) {    strcat(packetChar,file_contents);  //printf(&amp;amp;quot; %s\n&amp;amp;quot;, file_contents);  //packetChar[indexPacket]=file_contents;  //indexPacket++;   }  printf(&amp;amp;quot;\n&amp;amp;quot;);  //printf(&amp;amp;quot;%s&amp;amp;quot;, packetChar);  indexPacket=0;  fclose(in_file);  }   struct etherFrame getMacAddressType(){  struct etherFrame ether1;  int i;  // nettoyage de la cha&amp;amp;icirc;ne de charact&amp;amp;egrave;re &amp;amp;agrave; cause d'un bug :&amp;amp;quot;G&amp;amp;#65533;&amp;amp;#65533;U48:f1:7f:f0:32:20:&amp;amp;quot; en plus de la mac address des charact&amp;amp;egrave;re sont pr&amp;amp;eacute;sents au d&amp;amp;eacute;but  // Je pense que l'erreur ici est que j'ai allou&amp;amp;eacute; une zone m&amp;amp;eacute;moire &amp;amp;agrave; ma string mais je ne l'ai pas initialis&amp;amp;eacute;  strcpy(ether1.destMac,&amp;amp;quot;&amp;amp;quot;);  strcpy(ether1.sourceMac,&amp;amp;quot;&amp;amp;quot;);  strcpy(ether1.etherType,&amp;amp;quot;&amp;amp;quot;);  strcpy(ether1.nameType,&amp;amp;quot;&amp;amp;quot;);  // Pour r&amp;amp;eacute;soudre &amp;amp;ccedil;a je copie dans ma string un texte vide&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;// R&amp;amp;eacute;cup&amp;amp;eacute;ration de l'addresse mac de destination  for(i=0;i&amp;lt;12;i=i+2){  strcat(ether1.destMac,&amp;amp;quot;:&amp;amp;quot;);  strncat(ether1.destMac,&amp;amp;amp;packetChar[i],1);  strncat(ether1.destMac,&amp;amp;amp;packetChar[i+1],1);    };&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; printf(&amp;amp;quot;\nAddresse mac de destination%s\n&amp;amp;quot;,ether1.destMac); //R&amp;amp;eacute;cup&amp;amp;eacute;ration de l'addresse mac source  for(i=12;i&amp;lt;24;i=i+2){  strcat(ether1.sourceMac,&amp;amp;quot;:&amp;amp;quot;);  strncat(ether1.sourceMac,&amp;amp;amp;packetChar[i],1);  strncat(ether1.sourceMac,&amp;amp;amp;packetChar[i+1],1);    }&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; printf(&amp;amp;quot;Addresse mac source%s\n&amp;amp;quot;,ether1.sourceMac);  ;// bug de m&amp;amp;eacute;moire des caract&amp;amp;egrave;res sont ajout&amp;amp;eacute;s sans raison (solved)     // R&amp;amp;eacute;cup&amp;amp;eacute;ration du type&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; *(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 &amp;amp;quot;r&amp;amp;eacute;cup&amp;amp;eacute;rait&amp;amp;quot; 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&amp;amp;eacute; \0 &amp;amp;agrave; la fin de ma string. etherType et nameType sont coll&amp;amp;eacute;s dans la m&amp;amp;eacute;moire. Alors sans \0 la m&amp;amp;eacute;moire consid&amp;amp;eacute;rait que  // etherType s'arretait &amp;amp;agrave; \0 de nameType  *(ether1.etherType+4)='\0';    // V&amp;amp;eacute;rification du type etherType  if (strcmp(ether1.etherType,&amp;amp;quot;0800&amp;amp;quot;)==0){  strcpy(ether1.nameType,&amp;amp;quot;IPV4&amp;amp;quot;);  ether1.casePacket =1;  }  else if (strcmp(ether1.etherType,&amp;amp;quot;0806&amp;amp;quot;)==0){  strcpy(ether1.nameType,&amp;amp;quot;ARP&amp;amp;quot;);   ether1.casePacket =2;  }  else if (strcmp(ether1.etherType,&amp;amp;quot;86dd&amp;amp;quot;)==0){  strcpy(ether1.nameType,&amp;amp;quot;IPV6&amp;amp;quot;);   ether1.casePacket =3;  }  else {  strcpy(ether1.nameType,&amp;amp;quot;UNKNOWNS&amp;amp;quot;);  }&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; printf(&amp;amp;quot;Type en Hexa: %s/ EtherType:%s\n&amp;amp;quot;,ether1.etherType,ether1.nameType);  return ether1; }&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;struct ipFrame analyseIP4(struct etherFrame ether1){  struct ipFrame ip;  // r&amp;amp;eacute;cup&amp;amp;eacute;ration de la version IP et de la longueur de l'en-t&amp;amp;ecirc;te  //printf(&amp;amp;quot;Test&amp;amp;quot;);  char *ptr;  strcpy(ip.versionIp,&amp;amp;quot;&amp;amp;quot;);  strcpy(ip.lenghtHeaderIp,&amp;amp;quot;&amp;amp;quot;);  strcpy(ip.DSCP_ECN,&amp;amp;quot;&amp;amp;quot;);  strcpy(ip.lenghtIP,&amp;amp;quot;&amp;amp;quot;);  strcpy(ip.identIp,&amp;amp;quot;&amp;amp;quot;);  ip.versionIp[0]=*(packetChar+28);  ip.lenghtHeaderIp[0]=*(packetChar+29);&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; int tailleHeader = atoi(ip.lenghtHeaderIp)*4;  printf(&amp;amp;quot;\nTaille Header %d byte&amp;amp;quot;,tailleHeader);    ip.DSCP_ECN[0]=*(packetChar+30);  ip.DSCP_ECN[1]=*(packetChar+31);    ip.lenghtIP[0]=*(packetChar+32);  ip.lenghtIP[1]=*(packetChar+33);  ip.lenghtIP[2]=*(packetChar+34);  ip.lenghtIP[3]=*(packetChar+35);    //printf(&amp;amp;quot;%s&amp;amp;quot;,ip.lenghtIP);  long taillePaquetIp=strtol(ip.lenghtIP,NULL,16);  printf(&amp;amp;quot;\nTaille du paquet IP: %ld&amp;amp;quot;,taillePaquetIp);    ip.identIp[0]=*(packetChar+36);  ip.identIp[1]=*(packetChar+37);  ip.identIp[2]=*(packetChar+38);  ip.identIp[3]=*(packetChar+39);  ip.identIp[4]='\0';  printf(&amp;amp;quot;\nIdentification %s&amp;amp;quot;,ip.identIp);    ip.flagIp[0]=*(packetChar+40);  ip.flagIp[1]=*(packetChar+41);  ip.flagIp[2]='\0';  printf(&amp;amp;quot;\nFlag IP: %s&amp;amp;quot;, ip.flagIp);    ip.TTL[0]=*(packetChar+42);  ip.TTL[1]=*(packetChar+43);  ip.TTL[2]=*(packetChar+44);  ip.TTL[3]=*(packetChar+45);  ip.TTL[4]='\0';  printf(&amp;amp;quot;\nTTL: %s&amp;amp;quot;, ip.TTL);    ip.protocolIP[0]=*(packetChar+46);  ip.protocolIP[1]=*(packetChar+47);  ip.protocolIP[2]='\0';  printf(&amp;amp;quot;\nProtocole:%s&amp;amp;quot;, ip.protocolIP);  ;  ip.CsIP[0]=*(packetChar+48);  ip.CsIP[1]=*(packetChar+49);  ip.CsIP[2]=*(packetChar+50);  ip.CsIP[3]=*(packetChar+51);  ip.CsIP[4]='\0';  printf(&amp;amp;quot;\nCS= %s&amp;amp;quot;,ip.CsIP);  &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; // R&amp;amp;eacute;cup&amp;amp;eacute;ration de l'ip source  char tempChar[2];   tempChar[2]='\0';  tempChar[0]=*(packetChar+52);  tempChar[1]=*(packetChar+53);&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; ip.sourceIP[0]= strtol(tempChar,NULL,16);    tempChar[0]=*(packetChar+54);  tempChar[1]=*(packetChar+55);  ip.sourceIP[1]=strtol(tempChar,NULL,16);    tempChar[0]=*(packetChar+56);  tempChar[1]=*(packetChar+57);  ip.sourceIP[2]= strtol(tempChar,NULL,16);    tempChar[0]=*(packetChar+58);  tempChar[1]=*(packetChar+59);  ip.sourceIP[3]= strtol(tempChar,NULL,16);    //R&amp;amp;eacute;cup&amp;amp;eacute;ration de l'ip dest  tempChar[0]=*(packetChar+60);  tempChar[1]=*(packetChar+61);  ip.destIP[0]= strtol(tempChar,NULL,16);    tempChar[0]=*(packetChar+62);  tempChar[1]=*(packetChar+63);  ip.destIP[1]= strtol(tempChar,NULL,16);    tempChar[0]=*(packetChar+64);  tempChar[1]=*(packetChar+65);  ip.destIP[2]= strtol(tempChar,NULL,16);    tempChar[0]=*(packetChar+66);    tempChar[1]=*(packetChar+67);  ip.destIP[3]= strtol(tempChar,NULL,16);    printf(&amp;amp;quot;\nIp source %d.%d.%d.%d&amp;amp;quot;,ip.sourceIP[0],ip.sourceIP[1],ip.sourceIP[2],ip.sourceIP[3]);  printf(&amp;amp;quot;\nIp de destination %d.%d.%d.%d&amp;amp;quot;,ip.destIP[0],ip.destIP[1],ip.destIP[2],ip.destIP[3]);   // printf(&amp;amp;quot;tes 1 %d\n&amp;amp;quot;,strlen(ip.fullHeader)); // printf(&amp;amp;quot;test 2 %d\n&amp;amp;quot;,sizeof(ip.fullHeader)); //   printf(&amp;amp;quot;\n%d &amp;amp;quot;, tailleHeader); // ip.fullHeader = malloc(tailleHeader); // printf(&amp;amp;quot;test 3 %d\n&amp;amp;quot;,strlen(ip.fullHeader)); // printf(&amp;amp;quot;test 4 %d\n&amp;amp;quot;,sizeof(ip.fullHeader));    int index=0;  int i;    for(i=28;i&amp;lt;28+(tailleHeader*2);i=i+1){ // printf(&amp;amp;quot;%d\n&amp;amp;quot;,strlen(ip.fullHeader)); // printf(&amp;amp;quot;%s&amp;amp;quot;,ip.fullHeader);&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; ip.fullHeader[index]=packetChar[i];  index++;  }  ip.fullHeader[tailleHeader*2]='\0';  printf(&amp;amp;quot;\n%s&amp;amp;quot;,ip.fullHeader);  return ip; }  void displayPacket(FILE *stream,char *packet,int size){ FILE *fileOpen = fopen(filename,&amp;amp;quot;w&amp;amp;quot;); chmod(filename, 777);  int i,count=MAX_COLUMNS;  for(i=0;i&amp;lt;size;i++){  fprintf(stream,&amp;amp;quot;%2.2x&amp;amp;quot;,(unsigned char)packet[i]);  fprintf(fileOpen,&amp;amp;quot;%2.2x&amp;amp;quot;,(unsigned char)packet[i]);  }  fclose(fileOpen);  }   void main(){&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;int sock;  int size;  char buffer[BUFFER_SIZE];  sock=openRawEthernetSocket(ifname);  readPacket(sock,buffer,&amp;amp;amp;size);  displayPacket(stdout,buffer,size); get_packet();  struct etherFrame ether2;  ether2=getMacAddressType();    printf(&amp;amp;quot;\n%c&amp;amp;quot;,buffer[20]);  printf(&amp;amp;quot;\n%1.1x&amp;amp;quot;,buffer[20]);  printf(&amp;amp;quot;\n%d\n&amp;amp;quot;,buffer[20]);      switch(ether2.casePacket){  case 1:  printf(&amp;amp;quot;\nCase IPV4:&amp;amp;quot;);  struct ipFrame resultIP= analyseIP4(ether2); // printf(&amp;amp;quot;%s\n&amp;amp;quot;,resultIP.CsIP); // printf(&amp;amp;quot;%d\n&amp;amp;quot;, sizeof(resultIP.CsIP)); // printf(&amp;amp;quot;%d\n&amp;amp;quot;, strlen(resultIP.CsIP));  int caseIp = atoi(resultIP.protocolIP);  chmod(filename, 777);  switch(caseIp){  case 6:  printf(&amp;amp;quot;TCP\n&amp;amp;quot;);  // Case TCP    ;  break;  case 17:  // UDP  ;  break;  }}&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;  }&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Tblondin</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=IMA4_2021/2022_EC6&amp;diff=58547</id>
		<title>IMA4 2021/2022 EC6</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=IMA4_2021/2022_EC6&amp;diff=58547"/>
				<updated>2022-09-03T22:55:49Z</updated>
		
		<summary type="html">&lt;p&gt;Tblondin : /* Documents Rendus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectif =&lt;br /&gt;
&lt;br /&gt;
Développer un micro utilitaire de type &amp;lt;code&amp;gt;tcpdump&amp;lt;/code&amp;gt; pour analyser les paquets TCP/IP. &lt;br /&gt;
&lt;br /&gt;
En vous basant sur les sources du logiciel d'interception des paquets réseau des travaux dirigés du semestre 7, réalisez&lt;br /&gt;
un analyseur de paquets TCP/IP avec les caractéristiques suivantes :&lt;br /&gt;
* les paquets sont toujours affichés sous leur forme numérique ;&lt;br /&gt;
* les entêtes Ethernet sont affichées en clair (les trois champs que vous connaissez bien) ;&lt;br /&gt;
* 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 ;&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
Vous devez documenter vos avancées sur cette page Wiki. Au vu du retard que vous avez pris dans l'épreuve, merci&lt;br /&gt;
de mettre à jour votre Wiki au moins deux fois par semaine.&lt;br /&gt;
&lt;br /&gt;
= Travail réaliser =&lt;br /&gt;
Pour réaliser ce projet j'ai commencé par récupérer différents paquets ethernet &amp;quot;type&amp;quot; qui me permettront de développer mon programme . Pour cela j'utilise l'utilitaire wireshark&lt;br /&gt;
Cela me permet de récupérer un exemple de trame ipv4 :&lt;br /&gt;
&lt;br /&gt;
 0000   48 f1 7f d0 32 20 78 81 02 31 36 76 86 dd 60 00   H...2 x..16v..`.&lt;br /&gt;
 0010   00 00 00 21 11 3b 2a 00 14 50 40 07 08 0f 00 00   ...!.;*..P@.....&lt;br /&gt;
 0020   00 00 00 00 20 02 2a 01 cb 00 0a a2 68 00 7d 7c   .... .*.....h.}|&lt;br /&gt;
 0030   c5 0a 46 7f fe f6 01 bb d8 4c 00 21 0d c0 40 2e   ..F......L.!..@.&lt;br /&gt;
 0040   40 71 fe 71 19 9e 41 f3 a7 a0 1c 35 5a 25 73 8b   @q.q..A....5Z%s.&lt;br /&gt;
 0050   cf 41 11 bb 80 b3 b4                              .A.....&lt;br /&gt;
&lt;br /&gt;
Ainsi que les informations associées:&lt;br /&gt;
&lt;br /&gt;
 Frame 680: 87 bytes on wire (696 bits), 87 bytes captured (696 bits) on interface \Device\NPF_{4DB062CB-0742-4EDE-86A1-1CFB3480F3BE}, id 0&lt;br /&gt;
 Ethernet II, Src: Sercomm_31:36:76 (78:81:02:31:36:76), Dst: IntelCor_d0:32:20 (48:f1:7f:d0:32:20)&lt;br /&gt;
 Internet Protocol Version 6, Src: 2a00:1450:4007:80f::2002, Dst: 2a01:cb00:aa2:6800:7d7c:c50a:467f:fef6&lt;br /&gt;
 User Datagram Protocol, Src Port: 443, Dst Port: 55372&lt;br /&gt;
 Data (25 bytes)&lt;br /&gt;
&lt;br /&gt;
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&lt;br /&gt;
J'ai décomposé mon programme en plusieurs routine. &lt;br /&gt;
Récupération de la trame-&amp;gt; Récupération des en-têtes ethernet -&amp;gt; Sélection du type de protocole -&amp;gt; si c'est un IPV4 affichage de ses en-têtes et vérification de la checksum&lt;br /&gt;
&lt;br /&gt;
Récupération de la trame:&lt;br /&gt;
Ma première routine me permet de récupérer un paquet complet sous la forme d'un char&lt;br /&gt;
Exemple&lt;br /&gt;
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&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
= Documents Rendus =&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/stat.h&amp;gt;&lt;br /&gt;
#define DEFAUT_SIZE 300&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
struct etherFrame&lt;br /&gt;
{&lt;br /&gt;
    char sourceMac[18];&lt;br /&gt;
    char destMac[18];&lt;br /&gt;
    char etherType[5];&lt;br /&gt;
    char nameType[15];&lt;br /&gt;
    int casePacket;&lt;br /&gt;
   &lt;br /&gt;
    &lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct ipFrame{&lt;br /&gt;
    char versionIp[2];&lt;br /&gt;
    char lenghtHeaderIp[2];&lt;br /&gt;
    char DSCP_ECN[2];&lt;br /&gt;
    char lenghtIP[4];&lt;br /&gt;
    char identIp[5];&lt;br /&gt;
    char flagIp[3];&lt;br /&gt;
    char TTL[5];&lt;br /&gt;
    char protocolIP[3];&lt;br /&gt;
    char CsIP[5];&lt;br /&gt;
    unsigned char sourceIP[4];&lt;br /&gt;
    unsigned char destIP[4];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const char* filename = &amp;quot;ip4.txt&amp;quot;;&lt;br /&gt;
char packetChar[DEFAUT_SIZE];&lt;br /&gt;
int indexPacket=0;&lt;br /&gt;
&lt;br /&gt;
int get_packet()&lt;br /&gt;
//ouverture et récupération du packet dans le fichier choisi&lt;br /&gt;
{&lt;br /&gt;
    FILE *in_file = fopen(filename, &amp;quot;r&amp;quot;);&lt;br /&gt;
    if (!in_file) {&lt;br /&gt;
        perror(&amp;quot;fopen&amp;quot;);&lt;br /&gt;
        exit(EXIT_FAILURE);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    struct stat sb;&lt;br /&gt;
    if (stat(filename, &amp;amp;sb) == -1) {&lt;br /&gt;
        perror(&amp;quot;stat&amp;quot;);&lt;br /&gt;
        exit(EXIT_FAILURE);&lt;br /&gt;
    }&lt;br /&gt;
    // Allocation de la taille de la mémoire en fonction de la taille du texte &lt;br /&gt;
    char *file_contents = malloc(sb.st_size);&lt;br /&gt;
    &lt;br /&gt;
    while (fscanf(in_file, &amp;quot;%[^\n ] &amp;quot;, file_contents) != EOF) {&lt;br /&gt;
       &lt;br /&gt;
        strcat(packetChar,file_contents);&lt;br /&gt;
        //printf(&amp;quot; %s\n&amp;quot;, file_contents); &lt;br /&gt;
        //packetChar[indexPacket]=file_contents;&lt;br /&gt;
        //indexPacket++;        &lt;br /&gt;
    }&lt;br /&gt;
    printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
    //printf(&amp;quot;%s&amp;quot;, packetChar);&lt;br /&gt;
    indexPacket=0;&lt;br /&gt;
    fclose(in_file);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
struct etherFrame getMacAddressType(){&lt;br /&gt;
    struct etherFrame ether1;&lt;br /&gt;
    int i;&lt;br /&gt;
    // nettoyage de la chaîne de charactère à cause d'un bug :&amp;quot;G��U48:f1:7f:f0:32:20:&amp;quot; en plus de la mac address des charactère sont présents au début &lt;br /&gt;
    // Je pense que l'erreur ici est que j'ai alloué une zone mémoire à ma string mais je ne l'ai pas initialisé &lt;br /&gt;
    strcpy(ether1.destMac,&amp;quot;&amp;quot;);&lt;br /&gt;
    strcpy(ether1.sourceMac,&amp;quot;&amp;quot;);&lt;br /&gt;
    strcpy(ether1.etherType,&amp;quot;&amp;quot;);&lt;br /&gt;
    strcpy(ether1.nameType,&amp;quot;&amp;quot;);&lt;br /&gt;
    // Pour résoudre ça je copie dans ma string un texte vide &lt;br /&gt;
&lt;br /&gt;
// Récupération de l'addresse mac de destination&lt;br /&gt;
    for(i=0;i&amp;lt;12;i=i+2){&lt;br /&gt;
        strcat(ether1.destMac,&amp;quot;:&amp;quot;); &lt;br /&gt;
        strncat(ether1.destMac,&amp;amp;packetChar[i],1);&lt;br /&gt;
        strncat(ether1.destMac,&amp;amp;packetChar[i+1],1);&lt;br /&gt;
               &lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Addresse mac de destination%s\n&amp;quot;,ether1.destMac);&lt;br /&gt;
//Récupération de l'addresse mac source &lt;br /&gt;
    for(i=12;i&amp;lt;24;i=i+2){&lt;br /&gt;
        strcat(ether1.sourceMac,&amp;quot;:&amp;quot;);&lt;br /&gt;
        strncat(ether1.sourceMac,&amp;amp;packetChar[i],1);&lt;br /&gt;
        strncat(ether1.sourceMac,&amp;amp;packetChar[i+1],1);&lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Addresse mac source%s\n&amp;quot;,ether1.sourceMac);&lt;br /&gt;
    ;// bug de mémoire des caractères sont ajoutés sans raison (solved)&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
// Récupération du type &lt;br /&gt;
&lt;br /&gt;
    *(ether1.etherType)=*(packetChar+24);&lt;br /&gt;
    *(ether1.etherType+1)=*(packetChar+25);&lt;br /&gt;
    *(ether1.etherType+2)=*(packetChar+26);&lt;br /&gt;
    *(ether1.etherType+3)=*(packetChar+27);&lt;br /&gt;
    &lt;br /&gt;
    // J'avais ici une erreur dans ma string. Lorsque je rajoutais le nameType la char etherType &amp;quot;récupérait&amp;quot; aussi la valeur IPV4 ce qui me rendait printf(etherType) 0800IPV4&lt;br /&gt;
    // La lenght de etherType changeait aussi sans raison&lt;br /&gt;
    // 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&lt;br /&gt;
    // etherType s'arretait à \0 de nameType&lt;br /&gt;
    *(ether1.etherType+4)='\0';&lt;br /&gt;
    &lt;br /&gt;
    // Vérification du type etherType&lt;br /&gt;
    if (strcmp(ether1.etherType,&amp;quot;0800&amp;quot;)==0){&lt;br /&gt;
        strcpy(ether1.nameType,&amp;quot;IPV4&amp;quot;);&lt;br /&gt;
        ether1.casePacket =1;&lt;br /&gt;
            }&lt;br /&gt;
    else if (strcmp(ether1.etherType,&amp;quot;0806&amp;quot;)==0){&lt;br /&gt;
        strcpy(ether1.nameType,&amp;quot;ARP&amp;quot;);  &lt;br /&gt;
        ether1.casePacket =2;&lt;br /&gt;
    }&lt;br /&gt;
    else if (strcmp(ether1.etherType,&amp;quot;86dd&amp;quot;)==0){&lt;br /&gt;
        strcpy(ether1.nameType,&amp;quot;IPV6&amp;quot;);        &lt;br /&gt;
        ether1.casePacket =3;&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        strcpy(ether1.nameType,&amp;quot;UNKNOWNS&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Type en Hexa: %s/ EtherType:%s\n&amp;quot;,ether1.etherType,ether1.nameType);&lt;br /&gt;
    return ether1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
struct ipFrame analyseIP4(struct etherFrame ether1){&lt;br /&gt;
    struct ipFrame ip;&lt;br /&gt;
    // récupération de la version IP et de la longueur de l'en-tête&lt;br /&gt;
    //printf(&amp;quot;Test&amp;quot;);&lt;br /&gt;
    char *ptr;&lt;br /&gt;
    strcpy(ip.versionIp,&amp;quot;&amp;quot;);&lt;br /&gt;
    strcpy(ip.lenghtHeaderIp,&amp;quot;&amp;quot;);&lt;br /&gt;
    strcpy(ip.DSCP_ECN,&amp;quot;&amp;quot;);&lt;br /&gt;
    strcpy(ip.lenghtIP,&amp;quot;&amp;quot;);&lt;br /&gt;
    strcpy(ip.identIp,&amp;quot;&amp;quot;);&lt;br /&gt;
    ip.versionIp[0]=*(packetChar+28);&lt;br /&gt;
    ip.lenghtHeaderIp[0]=*(packetChar+29);&lt;br /&gt;
&lt;br /&gt;
    int tailleHeader = atoi(ip.lenghtHeaderIp)*4;&lt;br /&gt;
    printf(&amp;quot;\nTaille Header %d byte&amp;quot;,tailleHeader);&lt;br /&gt;
    &lt;br /&gt;
    ip.DSCP_ECN[0]=*(packetChar+30);&lt;br /&gt;
    ip.DSCP_ECN[1]=*(packetChar+31);&lt;br /&gt;
    &lt;br /&gt;
    ip.lenghtIP[0]=*(packetChar+32);&lt;br /&gt;
    ip.lenghtIP[1]=*(packetChar+33);&lt;br /&gt;
    ip.lenghtIP[2]=*(packetChar+34);&lt;br /&gt;
    ip.lenghtIP[3]=*(packetChar+35);&lt;br /&gt;
    &lt;br /&gt;
    //printf(&amp;quot;%s&amp;quot;,ip.lenghtIP);&lt;br /&gt;
    long taillePaquetIp=strtol(ip.lenghtIP,NULL,16);&lt;br /&gt;
    printf(&amp;quot;\nTaille du paquet IP: %d&amp;quot;,taillePaquetIp);&lt;br /&gt;
    &lt;br /&gt;
    ip.identIp[0]=*(packetChar+36);&lt;br /&gt;
    ip.identIp[1]=*(packetChar+37);&lt;br /&gt;
    ip.identIp[2]=*(packetChar+38);&lt;br /&gt;
    ip.identIp[3]=*(packetChar+39);&lt;br /&gt;
    ip.identIp[4]='\0';&lt;br /&gt;
    printf(&amp;quot;\nIdentification %s&amp;quot;,ip.identIp);&lt;br /&gt;
    &lt;br /&gt;
    ip.flagIp[0]=*(packetChar+40);&lt;br /&gt;
    ip.flagIp[1]=*(packetChar+41);&lt;br /&gt;
    ip.flagIp[2]='\0';&lt;br /&gt;
    printf(&amp;quot;\nFlag IP: %s&amp;quot;, ip.flagIp);&lt;br /&gt;
    &lt;br /&gt;
    ip.TTL[0]=*(packetChar+42);&lt;br /&gt;
    ip.TTL[1]=*(packetChar+43);&lt;br /&gt;
    ip.TTL[2]=*(packetChar+44);&lt;br /&gt;
    ip.TTL[3]=*(packetChar+45);&lt;br /&gt;
    ip.TTL[4]='\0';&lt;br /&gt;
    printf(&amp;quot;\nTTL: %s&amp;quot;, ip.TTL);&lt;br /&gt;
    &lt;br /&gt;
    ip.protocolIP[0]=*(packetChar+46);&lt;br /&gt;
    ip.protocolIP[1]=*(packetChar+47);&lt;br /&gt;
    ip.protocolIP[2]='\0';&lt;br /&gt;
    printf(&amp;quot;\nProtocole:%s&amp;quot;, ip.protocolIP);&lt;br /&gt;
    ;&lt;br /&gt;
    ip.CsIP[0]=*(packetChar+48);&lt;br /&gt;
    ip.CsIP[1]=*(packetChar+49);&lt;br /&gt;
    ip.CsIP[2]=*(packetChar+50);&lt;br /&gt;
    ip.CsIP[3]=*(packetChar+51);&lt;br /&gt;
    ip.CsIP[4]='\0';&lt;br /&gt;
    printf(&amp;quot;\nCS= %s&amp;quot;,ip.CsIP);&lt;br /&gt;
    &lt;br /&gt;
     printf(&amp;quot;\nProtocole:%s\n&amp;quot;, ip.protocolIP);&lt;br /&gt;
    // Récupération de l'ip source&lt;br /&gt;
    char tempChar[2];    &lt;br /&gt;
    tempChar[2]='\0';&lt;br /&gt;
    tempChar[0]=*(packetChar+52);&lt;br /&gt;
    tempChar[1]=*(packetChar+53);&lt;br /&gt;
&lt;br /&gt;
    ip.sourceIP[0]= strtol(tempChar,NULL,16);&lt;br /&gt;
    &lt;br /&gt;
    tempChar[0]=*(packetChar+54);&lt;br /&gt;
    tempChar[1]=*(packetChar+55);&lt;br /&gt;
    ip.sourceIP[1]=strtol(tempChar,NULL,16);&lt;br /&gt;
    &lt;br /&gt;
    tempChar[0]=*(packetChar+56);&lt;br /&gt;
    tempChar[1]=*(packetChar+57);&lt;br /&gt;
    ip.sourceIP[2]= strtol(tempChar,NULL,16);&lt;br /&gt;
    &lt;br /&gt;
    tempChar[0]=*(packetChar+58);&lt;br /&gt;
    tempChar[1]=*(packetChar+59);&lt;br /&gt;
    ip.sourceIP[3]= strtol(tempChar,NULL,16);&lt;br /&gt;
    &lt;br /&gt;
    //Récupération de l'ip dest&lt;br /&gt;
    tempChar[0]=*(packetChar+60);&lt;br /&gt;
    tempChar[1]=*(packetChar+61);&lt;br /&gt;
    ip.destIP[0]= strtol(tempChar,NULL,16);&lt;br /&gt;
    &lt;br /&gt;
    tempChar[0]=*(packetChar+62);&lt;br /&gt;
    tempChar[1]=*(packetChar+63);&lt;br /&gt;
    ip.destIP[1]= strtol(tempChar,NULL,16);&lt;br /&gt;
    &lt;br /&gt;
    tempChar[0]=*(packetChar+64);&lt;br /&gt;
    tempChar[1]=*(packetChar+65);&lt;br /&gt;
    ip.destIP[2]= strtol(tempChar,NULL,16);&lt;br /&gt;
    &lt;br /&gt;
    tempChar[0]=*(packetChar+66);&lt;br /&gt;
    tempChar[1]=*(packetChar+67);&lt;br /&gt;
    ip.destIP[3]= strtol(tempChar,NULL,16);&lt;br /&gt;
    &lt;br /&gt;
    printf(&amp;quot;Ip source %d.%d.%d.%d\n&amp;quot;,ip.sourceIP[0],ip.sourceIP[1],ip.sourceIP[2],ip.sourceIP[3]);&lt;br /&gt;
    printf(&amp;quot;Ip de destination %d.%d.%d.%d\n&amp;quot;,ip.destIP[0],ip.destIP[1],ip.destIP[2],ip.destIP[3]);&lt;br /&gt;
    &lt;br /&gt;
    for &lt;br /&gt;
    return ip;&lt;br /&gt;
}&lt;br /&gt;
    &lt;br /&gt;
void main(){&lt;br /&gt;
	get_packet();&lt;br /&gt;
    struct etherFrame ether2;&lt;br /&gt;
    //printf(&amp;quot;\n%s\n&amp;quot;,packetChar);&lt;br /&gt;
    ether2=getMacAddressType();&lt;br /&gt;
    &lt;br /&gt;
    switch(ether2.casePacket){&lt;br /&gt;
        case 1:&lt;br /&gt;
            printf(&amp;quot;\nCase IPV4:&amp;quot;);&lt;br /&gt;
            struct ipFrame resultIP= analyseIP4(ether2);&lt;br /&gt;
            printf(&amp;quot;%s\n&amp;quot;,resultIP.CsIP);&lt;br /&gt;
            int caseIp = atoi(resultIP.protocolIP);&lt;br /&gt;
            switch(caseIp){&lt;br /&gt;
                case 6:&lt;br /&gt;
                    printf(&amp;quot;TCP\n&amp;quot;);&lt;br /&gt;
                    // Case TCP &lt;br /&gt;
                    &lt;br /&gt;
                    ;&lt;br /&gt;
                    break;&lt;br /&gt;
                case 17:&lt;br /&gt;
                    // UDP &lt;br /&gt;
            ;&lt;br /&gt;
            break;&lt;br /&gt;
    }}&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Tblondin</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=IMA4_2021/2022_EC6&amp;diff=58518</id>
		<title>IMA4 2021/2022 EC6</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=IMA4_2021/2022_EC6&amp;diff=58518"/>
				<updated>2022-08-31T17:00:37Z</updated>
		
		<summary type="html">&lt;p&gt;Tblondin : /* Documents Rendus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectif =&lt;br /&gt;
&lt;br /&gt;
Développer un micro utilitaire de type &amp;lt;code&amp;gt;tcpdump&amp;lt;/code&amp;gt; pour analyser les paquets TCP/IP. &lt;br /&gt;
&lt;br /&gt;
En vous basant sur les sources du logiciel d'interception des paquets réseau des travaux dirigés du semestre 7, réalisez&lt;br /&gt;
un analyseur de paquets TCP/IP avec les caractéristiques suivantes :&lt;br /&gt;
* les paquets sont toujours affichés sous leur forme numérique ;&lt;br /&gt;
* les entêtes Ethernet sont affichées en clair (les trois champs que vous connaissez bien) ;&lt;br /&gt;
* 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 ;&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
Vous devez documenter vos avancées sur cette page Wiki. Au vu du retard que vous avez pris dans l'épreuve, merci&lt;br /&gt;
de mettre à jour votre Wiki au moins deux fois par semaine.&lt;br /&gt;
&lt;br /&gt;
= Travail réaliser =&lt;br /&gt;
Pour réaliser ce projet j'ai commencé par récupérer différents paquets ethernet &amp;quot;type&amp;quot; qui me permettront de développer mon programme . Pour cela j'utilise l'utilitaire wireshark&lt;br /&gt;
Cela me permet de récupérer un exemple de trame ipv4 :&lt;br /&gt;
&lt;br /&gt;
 0000   48 f1 7f d0 32 20 78 81 02 31 36 76 86 dd 60 00   H...2 x..16v..`.&lt;br /&gt;
 0010   00 00 00 21 11 3b 2a 00 14 50 40 07 08 0f 00 00   ...!.;*..P@.....&lt;br /&gt;
 0020   00 00 00 00 20 02 2a 01 cb 00 0a a2 68 00 7d 7c   .... .*.....h.}|&lt;br /&gt;
 0030   c5 0a 46 7f fe f6 01 bb d8 4c 00 21 0d c0 40 2e   ..F......L.!..@.&lt;br /&gt;
 0040   40 71 fe 71 19 9e 41 f3 a7 a0 1c 35 5a 25 73 8b   @q.q..A....5Z%s.&lt;br /&gt;
 0050   cf 41 11 bb 80 b3 b4                              .A.....&lt;br /&gt;
&lt;br /&gt;
Ainsi que les informations associées:&lt;br /&gt;
&lt;br /&gt;
 Frame 680: 87 bytes on wire (696 bits), 87 bytes captured (696 bits) on interface \Device\NPF_{4DB062CB-0742-4EDE-86A1-1CFB3480F3BE}, id 0&lt;br /&gt;
 Ethernet II, Src: Sercomm_31:36:76 (78:81:02:31:36:76), Dst: IntelCor_d0:32:20 (48:f1:7f:d0:32:20)&lt;br /&gt;
 Internet Protocol Version 6, Src: 2a00:1450:4007:80f::2002, Dst: 2a01:cb00:aa2:6800:7d7c:c50a:467f:fef6&lt;br /&gt;
 User Datagram Protocol, Src Port: 443, Dst Port: 55372&lt;br /&gt;
 Data (25 bytes)&lt;br /&gt;
&lt;br /&gt;
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&lt;br /&gt;
J'ai décomposé mon programme en plusieurs routine. &lt;br /&gt;
Récupération de la trame-&amp;gt; Récupération des en-têtes ethernet -&amp;gt; Sélection du type de protocole -&amp;gt; si c'est un IPV4 affichage de ses en-têtes et vérification de la checksum&lt;br /&gt;
&lt;br /&gt;
Récupération de la trame:&lt;br /&gt;
Ma première routine me permet de récupérer un paquet complet sous la forme d'un char&lt;br /&gt;
Exemple&lt;br /&gt;
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&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
= Documents Rendus =&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/stat.h&amp;gt;&lt;br /&gt;
#define DEFAUT_SIZE 300&lt;br /&gt;
&lt;br /&gt;
struct etherFrame&lt;br /&gt;
{&lt;br /&gt;
    char sourceMac[18];&lt;br /&gt;
    char destMac[18];&lt;br /&gt;
    char etherType[5];&lt;br /&gt;
    char nameType[15];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const char* filename = &amp;quot;ip4.txt&amp;quot;;&lt;br /&gt;
char packetChar[DEFAUT_SIZE];&lt;br /&gt;
int indexPacket=0;&lt;br /&gt;
&lt;br /&gt;
int get_packet()&lt;br /&gt;
//ouverture et récupération du packet dans le fichier choisi&lt;br /&gt;
{&lt;br /&gt;
    FILE *in_file = fopen(filename, &amp;quot;r&amp;quot;);&lt;br /&gt;
    if (!in_file) {&lt;br /&gt;
        perror(&amp;quot;fopen&amp;quot;);&lt;br /&gt;
        exit(EXIT_FAILURE);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    struct stat sb;&lt;br /&gt;
    if (stat(filename, &amp;amp;sb) == -1) {&lt;br /&gt;
        perror(&amp;quot;stat&amp;quot;);&lt;br /&gt;
        exit(EXIT_FAILURE);&lt;br /&gt;
    }&lt;br /&gt;
    // Allocation de la taille de la mémoire en fonction de la taille du texte &lt;br /&gt;
    char *file_contents = malloc(sb.st_size);&lt;br /&gt;
    &lt;br /&gt;
    while (fscanf(in_file, &amp;quot;%[^\n ] &amp;quot;, file_contents) != EOF) {&lt;br /&gt;
       &lt;br /&gt;
        strcat(packetChar,file_contents);&lt;br /&gt;
        //printf(&amp;quot; %s\n&amp;quot;, file_contents); &lt;br /&gt;
        //packetChar[indexPacket]=file_contents;&lt;br /&gt;
        //indexPacket++;        &lt;br /&gt;
    }&lt;br /&gt;
    printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
    //printf(&amp;quot;%s&amp;quot;, packetChar);&lt;br /&gt;
    indexPacket=0;&lt;br /&gt;
    fclose(in_file);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
int getMacAddressType(struct etherFrame ether1){&lt;br /&gt;
    int i;&lt;br /&gt;
    // nettoyage de la chaîne de charactère à cause d'un bug :&amp;quot;G��U48:f1:7f:f0:32:20:&amp;quot; en plus de la mac address des charactère sont présents au début &lt;br /&gt;
    // Je pense que l'erreur ici est que j'ai alloué une zone mémoire à ma string mais je ne l'ai pas initialisé &lt;br /&gt;
    strcpy(ether1.destMac,&amp;quot;&amp;quot;);&lt;br /&gt;
    strcpy(ether1.sourceMac,&amp;quot;&amp;quot;);&lt;br /&gt;
    strcpy(ether1.etherType,&amp;quot;&amp;quot;);&lt;br /&gt;
    strcpy(ether1.nameType,&amp;quot;&amp;quot;);&lt;br /&gt;
    // Pour résoudre ça je copie dans ma string un texte vide &lt;br /&gt;
&lt;br /&gt;
// Récupération de l'addresse mac de destination&lt;br /&gt;
    for(i=0;i&amp;lt;12;i=i+2){&lt;br /&gt;
        strcat(ether1.destMac,&amp;quot;:&amp;quot;); &lt;br /&gt;
        strncat(ether1.destMac,&amp;amp;packetChar[i],1);&lt;br /&gt;
        strncat(ether1.destMac,&amp;amp;packetChar[i+1],1);&lt;br /&gt;
               &lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Addresse mac de destination%s\n&amp;quot;,ether1.destMac);&lt;br /&gt;
//Récupération de l'addresse mac source &lt;br /&gt;
    for(i=12;i&amp;lt;24;i=i+2){&lt;br /&gt;
        strcat(ether1.sourceMac,&amp;quot;:&amp;quot;);&lt;br /&gt;
        strncat(ether1.sourceMac,&amp;amp;packetChar[i],1);&lt;br /&gt;
        strncat(ether1.sourceMac,&amp;amp;packetChar[i+1],1);&lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Addresse mac de destination%s\n&amp;quot;,ether1.sourceMac);&lt;br /&gt;
    ;// bug de mémoire des caractères sont ajoutés sans raison (solved)&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
// Récupération du type &lt;br /&gt;
&lt;br /&gt;
    *(ether1.etherType)=*(packetChar+24);&lt;br /&gt;
    *(ether1.etherType+1)=*(packetChar+25);&lt;br /&gt;
    *(ether1.etherType+2)=*(packetChar+26);&lt;br /&gt;
    *(ether1.etherType+3)=*(packetChar+27);&lt;br /&gt;
    &lt;br /&gt;
    // J'avais ici une erreur dans ma string. Lorsque je rajoutais le nameType la char etherType &amp;quot;récupérait&amp;quot; aussi la valeur IPV4 ce qui me rendait printf(etherType) 0800IPV4&lt;br /&gt;
    // La lenght de etherType changeait aussi sans raison&lt;br /&gt;
    // 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&lt;br /&gt;
    // etherType s'arretait à \0 de nameType&lt;br /&gt;
    *(ether1.etherType+4)='\0';&lt;br /&gt;
    &lt;br /&gt;
    // Vérification du type etherType&lt;br /&gt;
    if (strcmp(ether1.etherType,&amp;quot;0800&amp;quot;)==0){&lt;br /&gt;
        strcpy(ether1.nameType,&amp;quot;IPV4&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
    else if (strcmp(ether1.etherType,&amp;quot;0806&amp;quot;)==0){&lt;br /&gt;
        strcpy(ether1.nameType,&amp;quot;ARP&amp;quot;);        &lt;br /&gt;
    }&lt;br /&gt;
    else if (strcmp(ether1.etherType,&amp;quot;86dd&amp;quot;)==0){&lt;br /&gt;
        strcpy(ether1.nameType,&amp;quot;IPV6&amp;quot;);        &lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        strcpy(ether1.nameType,&amp;quot;UNKNOWNS&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\nType en Hexa: %s etherType:%s\n&amp;quot;,ether1.etherType,ether1.nameType);&lt;br /&gt;
}&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
void main(){&lt;br /&gt;
	get_packet();&lt;br /&gt;
    struct etherFrame ether2;&lt;br /&gt;
    printf(&amp;quot;\n%s\n&amp;quot;,packetChar);&lt;br /&gt;
    printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
    getMacAddressType(ether2);&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Tblondin</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=IMA4_2021/2022_EC6&amp;diff=58517</id>
		<title>IMA4 2021/2022 EC6</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=IMA4_2021/2022_EC6&amp;diff=58517"/>
				<updated>2022-08-31T16:52:54Z</updated>
		
		<summary type="html">&lt;p&gt;Tblondin : /* Documents Rendus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectif =&lt;br /&gt;
&lt;br /&gt;
Développer un micro utilitaire de type &amp;lt;code&amp;gt;tcpdump&amp;lt;/code&amp;gt; pour analyser les paquets TCP/IP. &lt;br /&gt;
&lt;br /&gt;
En vous basant sur les sources du logiciel d'interception des paquets réseau des travaux dirigés du semestre 7, réalisez&lt;br /&gt;
un analyseur de paquets TCP/IP avec les caractéristiques suivantes :&lt;br /&gt;
* les paquets sont toujours affichés sous leur forme numérique ;&lt;br /&gt;
* les entêtes Ethernet sont affichées en clair (les trois champs que vous connaissez bien) ;&lt;br /&gt;
* 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 ;&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
Vous devez documenter vos avancées sur cette page Wiki. Au vu du retard que vous avez pris dans l'épreuve, merci&lt;br /&gt;
de mettre à jour votre Wiki au moins deux fois par semaine.&lt;br /&gt;
&lt;br /&gt;
= Travail réaliser =&lt;br /&gt;
Pour réaliser ce projet j'ai commencé par récupérer différents paquets ethernet &amp;quot;type&amp;quot; qui me permettront de développer mon programme . Pour cela j'utilise l'utilitaire wireshark&lt;br /&gt;
Cela me permet de récupérer un exemple de trame ipv4 :&lt;br /&gt;
&lt;br /&gt;
 0000   48 f1 7f d0 32 20 78 81 02 31 36 76 86 dd 60 00   H...2 x..16v..`.&lt;br /&gt;
 0010   00 00 00 21 11 3b 2a 00 14 50 40 07 08 0f 00 00   ...!.;*..P@.....&lt;br /&gt;
 0020   00 00 00 00 20 02 2a 01 cb 00 0a a2 68 00 7d 7c   .... .*.....h.}|&lt;br /&gt;
 0030   c5 0a 46 7f fe f6 01 bb d8 4c 00 21 0d c0 40 2e   ..F......L.!..@.&lt;br /&gt;
 0040   40 71 fe 71 19 9e 41 f3 a7 a0 1c 35 5a 25 73 8b   @q.q..A....5Z%s.&lt;br /&gt;
 0050   cf 41 11 bb 80 b3 b4                              .A.....&lt;br /&gt;
&lt;br /&gt;
Ainsi que les informations associées:&lt;br /&gt;
&lt;br /&gt;
 Frame 680: 87 bytes on wire (696 bits), 87 bytes captured (696 bits) on interface \Device\NPF_{4DB062CB-0742-4EDE-86A1-1CFB3480F3BE}, id 0&lt;br /&gt;
 Ethernet II, Src: Sercomm_31:36:76 (78:81:02:31:36:76), Dst: IntelCor_d0:32:20 (48:f1:7f:d0:32:20)&lt;br /&gt;
 Internet Protocol Version 6, Src: 2a00:1450:4007:80f::2002, Dst: 2a01:cb00:aa2:6800:7d7c:c50a:467f:fef6&lt;br /&gt;
 User Datagram Protocol, Src Port: 443, Dst Port: 55372&lt;br /&gt;
 Data (25 bytes)&lt;br /&gt;
&lt;br /&gt;
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&lt;br /&gt;
J'ai décomposé mon programme en plusieurs routine. &lt;br /&gt;
Récupération de la trame-&amp;gt; Récupération des en-têtes ethernet -&amp;gt; Sélection du type de protocole -&amp;gt; si c'est un IPV4 affichage de ses en-têtes et vérification de la checksum&lt;br /&gt;
&lt;br /&gt;
Récupération de la trame:&lt;br /&gt;
Ma première routine me permet de récupérer un paquet complet sous la forme d'un char&lt;br /&gt;
Exemple&lt;br /&gt;
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&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
= Documents Rendus =&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/stat.h&amp;gt;&lt;br /&gt;
#define DEFAUT_SIZE 300&lt;br /&gt;
&lt;br /&gt;
struct etherFrame&lt;br /&gt;
{&lt;br /&gt;
    char sourceMac[18];&lt;br /&gt;
    char destMac[18];&lt;br /&gt;
    char etherType[5];&lt;br /&gt;
    char nameType[15];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const char* filename = &amp;quot;ip4.txt&amp;quot;;&lt;br /&gt;
char packetChar[DEFAUT_SIZE];&lt;br /&gt;
int indexPacket=0;&lt;br /&gt;
&lt;br /&gt;
int get_packet()&lt;br /&gt;
//ouverture et récupération du packet dans le fichier choisi&lt;br /&gt;
{&lt;br /&gt;
    FILE *in_file = fopen(filename, &amp;quot;r&amp;quot;);&lt;br /&gt;
    if (!in_file) {&lt;br /&gt;
        perror(&amp;quot;fopen&amp;quot;);&lt;br /&gt;
        exit(EXIT_FAILURE);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    struct stat sb;&lt;br /&gt;
    if (stat(filename, &amp;amp;sb) == -1) {&lt;br /&gt;
        perror(&amp;quot;stat&amp;quot;);&lt;br /&gt;
        exit(EXIT_FAILURE);&lt;br /&gt;
    }&lt;br /&gt;
    // Allocation de la taille de la mémoire en fonction de la taille du texte &lt;br /&gt;
    char *file_contents = malloc(sb.st_size);&lt;br /&gt;
    &lt;br /&gt;
    while (fscanf(in_file, &amp;quot;%[^\n ] &amp;quot;, file_contents) != EOF) {&lt;br /&gt;
       &lt;br /&gt;
        strcat(packetChar,file_contents);&lt;br /&gt;
        //printf(&amp;quot; %s\n&amp;quot;, file_contents); &lt;br /&gt;
        //packetChar[indexPacket]=file_contents;&lt;br /&gt;
        //indexPacket++;        &lt;br /&gt;
    }&lt;br /&gt;
    printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
    //printf(&amp;quot;%s&amp;quot;, packetChar);&lt;br /&gt;
    indexPacket=0;&lt;br /&gt;
    fclose(in_file);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
int getMacAddressType(struct etherFrame ether1){&lt;br /&gt;
    int i;&lt;br /&gt;
    // nettoyage de la chaîne de charactère à cause d'un bug :&amp;quot;G��U48:f1:7f:f0:32:20:&amp;quot; en plus de la mac address des charactère sont présents au début &lt;br /&gt;
    // Je pense que l'erreur ici est que j'ai alloué une zone mémoire à ma string mais je ne l'ai pas initialisé &lt;br /&gt;
    strcpy(ether1.destMac,&amp;quot;&amp;quot;);&lt;br /&gt;
    strcpy(ether1.sourceMac,&amp;quot;&amp;quot;);&lt;br /&gt;
    strcpy(ether1.etherType,&amp;quot;&amp;quot;);&lt;br /&gt;
    strcpy(ether1.nameType,&amp;quot;&amp;quot;);&lt;br /&gt;
    // Pour résoudre ça je copie dans ma string un texte vide &lt;br /&gt;
&lt;br /&gt;
// Récupération de l'addresse mac de destination&lt;br /&gt;
    for(i=0;i&amp;lt;12;i=i+2){&lt;br /&gt;
        strcat(ether1.destMac,&amp;quot;:&amp;quot;); &lt;br /&gt;
        strncat(ether1.destMac,&amp;amp;packetChar[i],1);&lt;br /&gt;
        strncat(ether1.destMac,&amp;amp;packetChar[i+1],1);&lt;br /&gt;
               &lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Addresse mac de destination%s\n&amp;quot;,ether1.destMac);&lt;br /&gt;
//Récupération de l'addresse mac source &lt;br /&gt;
    for(i=12;i&amp;lt;24;i=i+2){&lt;br /&gt;
        strcat(ether1.sourceMac,&amp;quot;:&amp;quot;);&lt;br /&gt;
        strncat(ether1.sourceMac,&amp;amp;packetChar[i],1);&lt;br /&gt;
        strncat(ether1.sourceMac,&amp;amp;packetChar[i+1],1);&lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Addresse mac de destination%s\n&amp;quot;,ether1.sourceMac);&lt;br /&gt;
    ;// bug de mémoire des caractères sont ajoutés sans raison (solved)&lt;br /&gt;
// Récupération du type &lt;br /&gt;
printf(&amp;quot;%d&amp;quot;,strlen(ether1.etherType));&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;test%s&amp;quot;,ether1.etherType);&lt;br /&gt;
    printf(&amp;quot;\n%d&amp;quot;,strlen(ether1.etherType));&lt;br /&gt;
    *(ether1.etherType)=*(packetChar+24);&lt;br /&gt;
    *(ether1.etherType+1)=*(packetChar+25);&lt;br /&gt;
    *(ether1.etherType+2)=*(packetChar+26);&lt;br /&gt;
    *(ether1.etherType+3)=*(packetChar+27);&lt;br /&gt;
    *(ether1.etherType+4)='\0';&lt;br /&gt;
    // Vérification du type etherType&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\n%d\n&amp;quot;,strlen(ether1.etherType));&lt;br /&gt;
    if (strcmp(ether1.etherType,&amp;quot;0800&amp;quot;)==0){&lt;br /&gt;
        printf(&amp;quot;\nLenght %d\n&amp;quot;,strlen(ether1.etherType));&lt;br /&gt;
        strcpy(ether1.nameType,&amp;quot;IPV4&amp;quot;);&lt;br /&gt;
        printf(&amp;quot;\nrlenght %d\n&amp;quot;,strlen(ether1.etherType));&lt;br /&gt;
    }&lt;br /&gt;
    else if (strcmp(ether1.etherType,&amp;quot;0806&amp;quot;)==0){&lt;br /&gt;
        strcpy(ether1.nameType,&amp;quot;ARP&amp;quot;);        &lt;br /&gt;
    }&lt;br /&gt;
    else if (strcmp(ether1.etherType,&amp;quot;86dd&amp;quot;)==0){&lt;br /&gt;
        strcpy(ether1.nameType,&amp;quot;IPV6&amp;quot;);        &lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        strcpy(ether1.nameType,&amp;quot;UNKNOWNS&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\n%s etherType:%s\n&amp;quot;,ether1.etherType,ether1.nameType);&lt;br /&gt;
}&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
void main(){&lt;br /&gt;
	get_packet();&lt;br /&gt;
    struct etherFrame ether2;&lt;br /&gt;
    printf(&amp;quot;\n%s\n&amp;quot;,packetChar);&lt;br /&gt;
    printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
    getMacAddressType(ether2);&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Tblondin</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=IMA4_2021/2022_EC6&amp;diff=58478</id>
		<title>IMA4 2021/2022 EC6</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=IMA4_2021/2022_EC6&amp;diff=58478"/>
				<updated>2022-08-29T23:27:05Z</updated>
		
		<summary type="html">&lt;p&gt;Tblondin : /* Documents Rendus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectif =&lt;br /&gt;
&lt;br /&gt;
Développer un micro utilitaire de type &amp;lt;code&amp;gt;tcpdump&amp;lt;/code&amp;gt; pour analyser les paquets TCP/IP. &lt;br /&gt;
&lt;br /&gt;
En vous basant sur les sources du logiciel d'interception des paquets réseau des travaux dirigés du semestre 7, réalisez&lt;br /&gt;
un analyseur de paquets TCP/IP avec les caractéristiques suivantes :&lt;br /&gt;
* les paquets sont toujours affichés sous leur forme numérique ;&lt;br /&gt;
* les entêtes Ethernet sont affichées en clair (les trois champs que vous connaissez bien) ;&lt;br /&gt;
* 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 ;&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
Vous devez documenter vos avancées sur cette page Wiki. Au vu du retard que vous avez pris dans l'épreuve, merci&lt;br /&gt;
de mettre à jour votre Wiki au moins deux fois par semaine.&lt;br /&gt;
&lt;br /&gt;
= Travail réaliser =&lt;br /&gt;
Pour réaliser ce projet j'ai commencé par récupérer différents paquets ethernet &amp;quot;type&amp;quot; qui me permettront de développer mon programme . Pour cela j'utilise l'utilitaire wireshark&lt;br /&gt;
Cela me permet de récupérer un exemple de trame ipv4 :&lt;br /&gt;
0000   48 f1 7f d0 32 20 78 81 02 31 36 76 86 dd 60 00   H...2 x..16v..`.&lt;br /&gt;
0010   00 00 00 21 11 3b 2a 00 14 50 40 07 08 0f 00 00   ...!.;*..P@.....&lt;br /&gt;
0020   00 00 00 00 20 02 2a 01 cb 00 0a a2 68 00 7d 7c   .... .*.....h.}|&lt;br /&gt;
0030   c5 0a 46 7f fe f6 01 bb d8 4c 00 21 0d c0 40 2e   ..F......L.!..@.&lt;br /&gt;
0040   40 71 fe 71 19 9e 41 f3 a7 a0 1c 35 5a 25 73 8b   @q.q..A....5Z%s.&lt;br /&gt;
0050   cf 41 11 bb 80 b3 b4                              .A.....&lt;br /&gt;
&lt;br /&gt;
Ainsi que les informations associées:&lt;br /&gt;
Frame 680: 87 bytes on wire (696 bits), 87 bytes captured (696 bits) on interface \Device\NPF_{4DB062CB-0742-4EDE-86A1-1CFB3480F3BE}, id 0&lt;br /&gt;
Ethernet II, Src: Sercomm_31:36:76 (78:81:02:31:36:76), Dst: IntelCor_d0:32:20 (48:f1:7f:d0:32:20)&lt;br /&gt;
Internet Protocol Version 6, Src: 2a00:1450:4007:80f::2002, Dst: 2a01:cb00:aa2:6800:7d7c:c50a:467f:fef6&lt;br /&gt;
User Datagram Protocol, Src Port: 443, Dst Port: 55372&lt;br /&gt;
Data (25 bytes)&lt;br /&gt;
&lt;br /&gt;
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&lt;br /&gt;
J'ai décomposé mon programme en plusieurs routine. &lt;br /&gt;
Récupération de la trame-&amp;gt; Récupération des en-têtes ethernet -&amp;gt; Sélection du type de protocole -&amp;gt; si c'est un IPV4 affichage de ses en-têtes et vérification de la checksum&lt;br /&gt;
&lt;br /&gt;
Récupération de la trame:&lt;br /&gt;
Ma première routine me permet de récupérer un paquet complet sous la forme d'un char&lt;br /&gt;
Exemple&lt;br /&gt;
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&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
= Documents Rendus =&lt;br /&gt;
// Programme temporaire&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/stat.h&amp;gt;&lt;br /&gt;
#define DEFAUT_SIZE 300&lt;br /&gt;
&lt;br /&gt;
struct etherFrame&lt;br /&gt;
{&lt;br /&gt;
    char sourceMac[17];&lt;br /&gt;
    char destMac[17];&lt;br /&gt;
    char etherType[4];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const char* filename = &amp;quot;ip4.txt&amp;quot;;&lt;br /&gt;
char packetChar[DEFAUT_SIZE];&lt;br /&gt;
int indexPacket=0;&lt;br /&gt;
&lt;br /&gt;
int get_packet()&lt;br /&gt;
//ouverture et récupération du packet dans le fichier choisi&lt;br /&gt;
{&lt;br /&gt;
    FILE *in_file = fopen(filename, &amp;quot;r&amp;quot;);&lt;br /&gt;
    if (!in_file) {&lt;br /&gt;
        perror(&amp;quot;fopen&amp;quot;);&lt;br /&gt;
        exit(EXIT_FAILURE);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    struct stat sb;&lt;br /&gt;
    if (stat(filename, &amp;amp;sb) == -1) {&lt;br /&gt;
        perror(&amp;quot;stat&amp;quot;);&lt;br /&gt;
        exit(EXIT_FAILURE);&lt;br /&gt;
    }&lt;br /&gt;
    // Allocation de la taille de la mémoire en fonction de la taille du texte &lt;br /&gt;
    char *file_contents = malloc(sb.st_size);&lt;br /&gt;
    &lt;br /&gt;
    while (fscanf(in_file, &amp;quot;%[^\n ] &amp;quot;, file_contents) != EOF) {&lt;br /&gt;
       &lt;br /&gt;
        strcat(packetChar,file_contents);&lt;br /&gt;
        //printf(&amp;quot; %s\n&amp;quot;, file_contents); &lt;br /&gt;
        //packetChar[indexPacket]=file_contents;&lt;br /&gt;
        //indexPacket++;        &lt;br /&gt;
    }&lt;br /&gt;
    printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
    //printf(&amp;quot;%s&amp;quot;, packetChar);&lt;br /&gt;
    indexPacket=0;&lt;br /&gt;
    fclose(in_file);&lt;br /&gt;
    }&lt;br /&gt;
int getMacAddressType(struct etherFrame ether1){&lt;br /&gt;
    int i;&lt;br /&gt;
&lt;br /&gt;
// Récupération de l'addresse mac de destination&lt;br /&gt;
    for(i=0;i&amp;lt;12;i=i+2){&lt;br /&gt;
        strncat(ether1.destMac,&amp;amp;packetChar[i],1);&lt;br /&gt;
        strncat(ether1.destMac,&amp;amp;packetChar[i+1],1);&lt;br /&gt;
        strncat(ether1.destMac,&amp;quot;:&amp;quot;,1);        &lt;br /&gt;
    };&lt;br /&gt;
    printf(&amp;quot;%d&amp;quot;,strlen(ether1.destMac));&lt;br /&gt;
    printf(&amp;quot;Addresse mac de destination: %s\n&amp;quot;,ether1.destMac);&lt;br /&gt;
//Récupération de l'addresse mac source &lt;br /&gt;
    for(i=12;i&amp;lt;24;i=i+2){&lt;br /&gt;
        strncat(ether1.sourceMac,&amp;amp;packetChar[i],1);&lt;br /&gt;
        strncat(ether1.sourceMac,&amp;amp;packetChar[i+1],1);&lt;br /&gt;
        strncat(ether1.sourceMac,&amp;quot;:&amp;quot;,1);&lt;br /&gt;
    }&lt;br /&gt;
     printf(&amp;quot;%d&amp;quot;,strlen(ether1.sourceMac));&lt;br /&gt;
    printf(&amp;quot;Addresse mac de destination: %s\n&amp;quot;,ether1.sourceMac);&lt;br /&gt;
    ;// bug de mémoire des caractères sont ajoutés sans raison &lt;br /&gt;
}&lt;br /&gt;
    &lt;br /&gt;
void main(){&lt;br /&gt;
	get_packet();&lt;br /&gt;
    struct etherFrame ether2;&lt;br /&gt;
    printf(&amp;quot;\n%s\n&amp;quot;,packetChar);&lt;br /&gt;
    printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
    getMacAddressType(ether2);&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Tblondin</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=IMA4_2021/2022_EC6&amp;diff=58477</id>
		<title>IMA4 2021/2022 EC6</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=IMA4_2021/2022_EC6&amp;diff=58477"/>
				<updated>2022-08-29T23:17:54Z</updated>
		
		<summary type="html">&lt;p&gt;Tblondin : /* Objectif */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectif =&lt;br /&gt;
&lt;br /&gt;
Développer un micro utilitaire de type &amp;lt;code&amp;gt;tcpdump&amp;lt;/code&amp;gt; pour analyser les paquets TCP/IP. &lt;br /&gt;
&lt;br /&gt;
En vous basant sur les sources du logiciel d'interception des paquets réseau des travaux dirigés du semestre 7, réalisez&lt;br /&gt;
un analyseur de paquets TCP/IP avec les caractéristiques suivantes :&lt;br /&gt;
* les paquets sont toujours affichés sous leur forme numérique ;&lt;br /&gt;
* les entêtes Ethernet sont affichées en clair (les trois champs que vous connaissez bien) ;&lt;br /&gt;
* 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 ;&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
Vous devez documenter vos avancées sur cette page Wiki. Au vu du retard que vous avez pris dans l'épreuve, merci&lt;br /&gt;
de mettre à jour votre Wiki au moins deux fois par semaine.&lt;br /&gt;
&lt;br /&gt;
= Travail réaliser =&lt;br /&gt;
Pour réaliser ce projet j'ai commencé par récupérer différents paquets ethernet &amp;quot;type&amp;quot; qui me permettront de développer mon programme . Pour cela j'utilise l'utilitaire wireshark&lt;br /&gt;
Cela me permet de récupérer un exemple de trame ipv4 :&lt;br /&gt;
0000   48 f1 7f d0 32 20 78 81 02 31 36 76 86 dd 60 00   H...2 x..16v..`.&lt;br /&gt;
0010   00 00 00 21 11 3b 2a 00 14 50 40 07 08 0f 00 00   ...!.;*..P@.....&lt;br /&gt;
0020   00 00 00 00 20 02 2a 01 cb 00 0a a2 68 00 7d 7c   .... .*.....h.}|&lt;br /&gt;
0030   c5 0a 46 7f fe f6 01 bb d8 4c 00 21 0d c0 40 2e   ..F......L.!..@.&lt;br /&gt;
0040   40 71 fe 71 19 9e 41 f3 a7 a0 1c 35 5a 25 73 8b   @q.q..A....5Z%s.&lt;br /&gt;
0050   cf 41 11 bb 80 b3 b4                              .A.....&lt;br /&gt;
&lt;br /&gt;
Ainsi que les informations associées:&lt;br /&gt;
Frame 680: 87 bytes on wire (696 bits), 87 bytes captured (696 bits) on interface \Device\NPF_{4DB062CB-0742-4EDE-86A1-1CFB3480F3BE}, id 0&lt;br /&gt;
Ethernet II, Src: Sercomm_31:36:76 (78:81:02:31:36:76), Dst: IntelCor_d0:32:20 (48:f1:7f:d0:32:20)&lt;br /&gt;
Internet Protocol Version 6, Src: 2a00:1450:4007:80f::2002, Dst: 2a01:cb00:aa2:6800:7d7c:c50a:467f:fef6&lt;br /&gt;
User Datagram Protocol, Src Port: 443, Dst Port: 55372&lt;br /&gt;
Data (25 bytes)&lt;br /&gt;
&lt;br /&gt;
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&lt;br /&gt;
J'ai décomposé mon programme en plusieurs routine. &lt;br /&gt;
Récupération de la trame-&amp;gt; Récupération des en-têtes ethernet -&amp;gt; Sélection du type de protocole -&amp;gt; si c'est un IPV4 affichage de ses en-têtes et vérification de la checksum&lt;br /&gt;
&lt;br /&gt;
Récupération de la trame:&lt;br /&gt;
Ma première routine me permet de récupérer un paquet complet sous la forme d'un char&lt;br /&gt;
Exemple&lt;br /&gt;
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&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
= Documents Rendus =&lt;/div&gt;</summary>
		<author><name>Tblondin</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=IMA4_2021/2022_EC6&amp;diff=58476</id>
		<title>IMA4 2021/2022 EC6</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=IMA4_2021/2022_EC6&amp;diff=58476"/>
				<updated>2022-08-29T23:17:29Z</updated>
		
		<summary type="html">&lt;p&gt;Tblondin : /* Objectif */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectif =&lt;br /&gt;
&lt;br /&gt;
Développer un micro utilitaire de type &amp;lt;code&amp;gt;tcpdump&amp;lt;/code&amp;gt; pour analyser les paquets TCP/IP. &lt;br /&gt;
&lt;br /&gt;
En vous basant sur les sources du logiciel d'interception des paquets réseau des travaux dirigés du semestre 7, réalisez&lt;br /&gt;
un analyseur de paquets TCP/IP avec les caractéristiques suivantes :&lt;br /&gt;
* les paquets sont toujours affichés sous leur forme numérique ;&lt;br /&gt;
* les entêtes Ethernet sont affichées en clair (les trois champs que vous connaissez bien) ;&lt;br /&gt;
* 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 ;&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
Vous devez documenter vos avancées sur cette page Wiki. Au vu du retard que vous avez pris dans l'épreuve, merci&lt;br /&gt;
de mettre à jour votre Wiki au moins deux fois par semaine.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour réaliser ce projet j'ai commencé par récupérer différents paquets ethernet &amp;quot;type&amp;quot; qui me permettront de développer mon programme . Pour cela j'utilise l'utilitaire wireshark&lt;br /&gt;
Cela me permet de récupérer un exemple de trame ipv4 :&lt;br /&gt;
0000   48 f1 7f d0 32 20 78 81 02 31 36 76 86 dd 60 00   H...2 x..16v..`.&lt;br /&gt;
0010   00 00 00 21 11 3b 2a 00 14 50 40 07 08 0f 00 00   ...!.;*..P@.....&lt;br /&gt;
0020   00 00 00 00 20 02 2a 01 cb 00 0a a2 68 00 7d 7c   .... .*.....h.}|&lt;br /&gt;
0030   c5 0a 46 7f fe f6 01 bb d8 4c 00 21 0d c0 40 2e   ..F......L.!..@.&lt;br /&gt;
0040   40 71 fe 71 19 9e 41 f3 a7 a0 1c 35 5a 25 73 8b   @q.q..A....5Z%s.&lt;br /&gt;
0050   cf 41 11 bb 80 b3 b4                              .A.....&lt;br /&gt;
&lt;br /&gt;
Ainsi que les informations associées:&lt;br /&gt;
Frame 680: 87 bytes on wire (696 bits), 87 bytes captured (696 bits) on interface \Device\NPF_{4DB062CB-0742-4EDE-86A1-1CFB3480F3BE}, id 0&lt;br /&gt;
Ethernet II, Src: Sercomm_31:36:76 (78:81:02:31:36:76), Dst: IntelCor_d0:32:20 (48:f1:7f:d0:32:20)&lt;br /&gt;
Internet Protocol Version 6, Src: 2a00:1450:4007:80f::2002, Dst: 2a01:cb00:aa2:6800:7d7c:c50a:467f:fef6&lt;br /&gt;
User Datagram Protocol, Src Port: 443, Dst Port: 55372&lt;br /&gt;
Data (25 bytes)&lt;br /&gt;
&lt;br /&gt;
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&lt;br /&gt;
J'ai décomposé mon programme en plusieurs routine. &lt;br /&gt;
Récupération de la trame-&amp;gt; Récupération des en-têtes ethernet -&amp;gt; Sélection du type de protocole -&amp;gt; si c'est un IPV4 affichage de ses en-têtes et vérification de la checksum&lt;br /&gt;
&lt;br /&gt;
Récupération de la trame:&lt;br /&gt;
Ma première routine me permet de récupérer un paquet complet sous la forme d'un char&lt;br /&gt;
Exemple&lt;br /&gt;
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&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
= Documents Rendus =&lt;/div&gt;</summary>
		<author><name>Tblondin</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=IMA4_2021/2022_EC6&amp;diff=58475</id>
		<title>IMA4 2021/2022 EC6</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=IMA4_2021/2022_EC6&amp;diff=58475"/>
				<updated>2022-08-29T23:14:15Z</updated>
		
		<summary type="html">&lt;p&gt;Tblondin : /* Travail réalisé */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectif =&lt;br /&gt;
&lt;br /&gt;
Développer un micro utilitaire de type &amp;lt;code&amp;gt;tcpdump&amp;lt;/code&amp;gt; pour analyser les paquets TCP/IP. &lt;br /&gt;
&lt;br /&gt;
En vous basant sur les sources du logiciel d'interception des paquets réseau des travaux dirigés du semestre 7, réalisez&lt;br /&gt;
un analyseur de paquets TCP/IP avec les caractéristiques suivantes :&lt;br /&gt;
* les paquets sont toujours affichés sous leur forme numérique ;&lt;br /&gt;
* les entêtes Ethernet sont affichées en clair (les trois champs que vous connaissez bien) ;&lt;br /&gt;
* 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 ;&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
Vous devez documenter vos avancées sur cette page Wiki. Au vu du retard que vous avez pris dans l'épreuve, merci&lt;br /&gt;
de mettre à jour votre Wiki au moins deux fois par semaine.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour réaliser ce projet j'ai commencé par récupérer différents paquets ethernet &amp;quot;type&amp;quot; qui me permettront de développer mon programme . Pour cela j'utilise l'utilitaire wireshark&lt;br /&gt;
Cela me permet de récupérer un exemple de trame ipv4 :&lt;br /&gt;
0000   48 f1 7f d0 32 20 78 81 02 31 36 76 86 dd 60 00   H...2 x..16v..`.&lt;br /&gt;
0010   00 00 00 21 11 3b 2a 00 14 50 40 07 08 0f 00 00   ...!.;*..P@.....&lt;br /&gt;
0020   00 00 00 00 20 02 2a 01 cb 00 0a a2 68 00 7d 7c   .... .*.....h.}|&lt;br /&gt;
0030   c5 0a 46 7f fe f6 01 bb d8 4c 00 21 0d c0 40 2e   ..F......L.!..@.&lt;br /&gt;
0040   40 71 fe 71 19 9e 41 f3 a7 a0 1c 35 5a 25 73 8b   @q.q..A....5Z%s.&lt;br /&gt;
0050   cf 41 11 bb 80 b3 b4                              .A.....&lt;br /&gt;
&lt;br /&gt;
Ainsi que les informations associées:&lt;br /&gt;
Frame 680: 87 bytes on wire (696 bits), 87 bytes captured (696 bits) on interface \Device\NPF_{4DB062CB-0742-4EDE-86A1-1CFB3480F3BE}, id 0&lt;br /&gt;
Ethernet II, Src: Sercomm_31:36:76 (78:81:02:31:36:76), Dst: IntelCor_d0:32:20 (48:f1:7f:d0:32:20)&lt;br /&gt;
Internet Protocol Version 6, Src: 2a00:1450:4007:80f::2002, Dst: 2a01:cb00:aa2:6800:7d7c:c50a:467f:fef6&lt;br /&gt;
User Datagram Protocol, Src Port: 443, Dst Port: 55372&lt;br /&gt;
Data (25 bytes)&lt;br /&gt;
&lt;br /&gt;
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&lt;br /&gt;
J'ai décomposé mon programme en plusieurs routine. &lt;br /&gt;
Récupération de la trame-&amp;gt; Récupération des en-têtes ethernet -&amp;gt; Sélection du type de protocole -&amp;gt; si c'est un IPV4 affichage de ses en-têtes et vérification de la checksum&lt;br /&gt;
&lt;br /&gt;
Récupération de la trame:&lt;br /&gt;
Ma première routine me permet de récupérer un paquet complet sous la forme d'un char&lt;br /&gt;
Exemple&lt;br /&gt;
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&lt;br /&gt;
&lt;br /&gt;
= Documents Rendus =&lt;/div&gt;</summary>
		<author><name>Tblondin</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=IMA4_2021/2022_EC6&amp;diff=58474</id>
		<title>IMA4 2021/2022 EC6</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=IMA4_2021/2022_EC6&amp;diff=58474"/>
				<updated>2022-08-29T23:04:01Z</updated>
		
		<summary type="html">&lt;p&gt;Tblondin : /* Travail réalisé */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectif =&lt;br /&gt;
&lt;br /&gt;
Développer un micro utilitaire de type &amp;lt;code&amp;gt;tcpdump&amp;lt;/code&amp;gt; pour analyser les paquets TCP/IP. &lt;br /&gt;
&lt;br /&gt;
En vous basant sur les sources du logiciel d'interception des paquets réseau des travaux dirigés du semestre 7, réalisez&lt;br /&gt;
un analyseur de paquets TCP/IP avec les caractéristiques suivantes :&lt;br /&gt;
* les paquets sont toujours affichés sous leur forme numérique ;&lt;br /&gt;
* les entêtes Ethernet sont affichées en clair (les trois champs que vous connaissez bien) ;&lt;br /&gt;
* 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 ;&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
Vous devez documenter vos avancées sur cette page Wiki. Au vu du retard que vous avez pris dans l'épreuve, merci&lt;br /&gt;
de mettre à jour votre Wiki au moins deux fois par semaine.&lt;br /&gt;
&lt;br /&gt;
= Travail réalisé =&lt;br /&gt;
Pour réaliser ce projet j'ai commencé par récupérer différents paquets ethernet &amp;quot;type&amp;quot; qui me permettront de développer mon programme . Pour cela j'utilise l'utilitaire wireshark&lt;br /&gt;
Cela me permet de récupérer un exemple de trame ipv4 :&lt;br /&gt;
0000   48 f1 7f d0 32 20 78 81 02 31 36 76 86 dd 60 00   H...2 x..16v..`.&lt;br /&gt;
0010   00 00 00 21 11 3b 2a 00 14 50 40 07 08 0f 00 00   ...!.;*..P@.....&lt;br /&gt;
0020   00 00 00 00 20 02 2a 01 cb 00 0a a2 68 00 7d 7c   .... .*.....h.}|&lt;br /&gt;
0030   c5 0a 46 7f fe f6 01 bb d8 4c 00 21 0d c0 40 2e   ..F......L.!..@.&lt;br /&gt;
0040   40 71 fe 71 19 9e 41 f3 a7 a0 1c 35 5a 25 73 8b   @q.q..A....5Z%s.&lt;br /&gt;
0050   cf 41 11 bb 80 b3 b4                              .A.....&lt;br /&gt;
&lt;br /&gt;
Ainsi que les informations associées:&lt;br /&gt;
Frame 680: 87 bytes on wire (696 bits), 87 bytes captured (696 bits) on interface \Device\NPF_{4DB062CB-0742-4EDE-86A1-1CFB3480F3BE}, id 0&lt;br /&gt;
Ethernet II, Src: Sercomm_31:36:76 (78:81:02:31:36:76), Dst: IntelCor_d0:32:20 (48:f1:7f:d0:32:20)&lt;br /&gt;
Internet Protocol Version 6, Src: 2a00:1450:4007:80f::2002, Dst: 2a01:cb00:aa2:6800:7d7c:c50a:467f:fef6&lt;br /&gt;
User Datagram Protocol, Src Port: 443, Dst Port: 55372&lt;br /&gt;
Data (25 bytes)&lt;br /&gt;
&lt;br /&gt;
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&lt;br /&gt;
&lt;br /&gt;
= Documents Rendus =&lt;/div&gt;</summary>
		<author><name>Tblondin</name></author>	</entry>

	</feed>