Bonjour à tous ,
je suis un peu débutant en programmation et surtout sur tout ce qui est réseau : en fait voilà , mon travail consiste après avoir lancé le sniffeur à récuperer et analyser le contenu de la trame : l'adresse ethernet de l'expediteur et celle du destinataire de la trame et le type de la trame ethernet !!
le programme devra donner , en clair , la liste des adresses ethenet des postes connectés au réseau !! vu qu'on a travailé dans une salle spécifique en réseau à la fac , j'ai pu enregistrer les données envoyer par le sniffeur :
Code C/C++ :
Byte rcv:
60
[b]ff ff ff ff ff ff[/b] [i]00 b0 d0 31 f1 46[/i] [u]08 06[/u] 00 01
08 00 06 04 00 01 00 b0 d0 31 f1 46 c0 a8 0a 04
00 00 00 00 00 00 c0 a8 0a fe 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00
Byte rcv:
98
ff ff ff ff ff ff 00 10 4b b2 70 60 08 00 45 00
00 54 13 54 40 00 40 01 91 04 c0 a8 0a 01 c0 a8
0a ff 08 00 cb a6 8e 38 13 54 b4 0b f7 48 e8 74
0c 00 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15
16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25
26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35
36 37
si j'ai bien compris le deroulement : je dois recuperer dans le programme qlq chose de ce genre :
adresse destination : ff ff ff ff ff ff
adresse source : 00 b0 d0 31 f1 46
type : 08 06
le prof nous a dit , qu'il y a certaines bibliothèques nécessaires pour le dévellopement en C : eth_lib.o, eth_lib.h
inet_str.h(les structures c necessaires pour programmer )
les infos sur cette librairie sera ici :
eth_lib.het il y a déjà eth_lib.c
j'ai écrit un bout de code en s'inspirant et en employant les fonctions predefinies mais le resultat ne correspond pas aux attentes ::
Code C/C++ :
#include<stdio.h>
#include<stdlib.h>
#include"eth_lib.h"
#include<string.h>
#include"inet_str.h"
// structure composant la trame
/*
struct eth_frame {
char adr_dest[6];
char adr_send[6];
char type[2];
char data[MAX_PACKET_SIZE - 6 - 6 - 2];
};
* */
typedef struct eth_frame Trame;
/*
// fonction fournie par la bibliothèque pour lire
struct eth_frame * read_eth_frame(int fd, unsigned short int type, int * n);
// fonction fournie par la bibliothèque eth_lib.c pour écrire
int write_eth_frame(int fd, struct eth_frame *frame, int len);
*/
struct eth_frame* lireTrame()
{
char chaine[100];
int nbre = 0;
static Trame donnee;
// lecture de l'entree standard
fscanf(stdin,"%s",chaine);
fscanf(stdin,"%d",&nbre);
// ////////////////////////////////////////////////////////////
// Lecture sur le flot d'entree d'un nombre donne en parametre
// d'octets. Le resultat est retourne par le pointeur buf qui
// doit pointer sur une structure de donnee suffisante pour
// recevoir les octets lus. get_buf est fournie dans eth_lib.h
get_buf((unsigned char*)&donnee,nbre);
// on retourne un poiteur sur les données lues
return &donnee;
}
int main ()
{
char msg[100]; //les données de la trame converties à une chaîne de caractères
char debutmsg[7]; //le premier mot du message
char type[4]; //le type de la trame sous forme d'une chaîne de
caractères
Trame * ptrTrame;
ptrTrame = lireTrame();
// conversion en chaine de caractere
// fonction disponibele dans eth_lib.h
charhexa_to_char(char_to_charhexa(ptrTrame->data,100,msg);
charhexa_to_char(char_to_charhexa(ptrTrame->data,7,debutmsg);
type = char_to_charhexa(ptrTrame->type,2);
// trame = read_frame();
//charhexa_to_char(char_to_charhexa(trame->data, 50), msg);
// première partie TP recuperer Adr dest -source et type
printf("*****Adresse Destination**** :%s\n",char_to_charhexa(ptrTrame->adr_dest,6);
printf("*****Adresse Source**********:%s\n",char_to_charhexa(ptrTrame->adr_send,6);
printf("********Type*****************:%s\n",ptrTrame->type);
// deuxième partie TP
//char * get_eth_addr(int fd); fontion permettant d'avoir l'adresse d'une trame
// et permettant de convertir sous cette forme 00:00:C0:F3:57:6B
// on verifie si la trame est de type 9000
return 0;
}
et après compilation :
j'ai un message de ce genre sur le terminal :
*****Adresse Destination**** :000000000000
*****Adresse Source**********:000000000000
********Type*****************:000000000000