Blame view

Network/sniffer.c 4 KB
1f9d795a   Speedclocker   Sniffer et sender
1
2
3
4
5
6
  #include <pcap.h>
  #include <stdio.h>
  #include <stdlib.h>
  #include <string.h>
  #include <netinet/in.h>
  #include <arpa/inet.h>
5940bf6e   skhinach   Quelques modifs
7
8
9
  #include <time.h>
  #include "libnet.h"
  
1f9d795a   Speedclocker   Sniffer et sender
10
  
a69a94a7   skhinach   Ajout de gestion ...
11
12
  #define SZ_DEV_PCAP 10
  
1f9d795a   Speedclocker   Sniffer et sender
13
  
1f9d795a   Speedclocker   Sniffer et sender
14
  // Fonction lors de la detection d'un paquet
5940bf6e   skhinach   Quelques modifs
15
  void arp_detect()
1f9d795a   Speedclocker   Sniffer et sender
16
17
18
19
20
  {
  	static int num=0, loop=1;
  	num++;
  	printf("Voici le paquet arp numéro : %d\n", num);
  	
a69a94a7   skhinach   Ajout de gestion ...
21
  	if(num==10) { loop++; num=0; printf("10 paquets ARP ont été reçus pour la boucle %d !\n", loop);}
1f9d795a   Speedclocker   Sniffer et sender
22
23
  }
  
5940bf6e   skhinach   Quelques modifs
24
25
26
27
28
29
30
31
32
33
  
  // Issue du dépassement de seuil de paquets, gère en fonction du débit moyen de reception de paquets arp
  void reponseSonde(time_t last_time, time_t seuil_temps)
  {
  	time_t ecart = time(NULL) - last_time;
  	char* msg1="00";
  	char* msg2="01";
  
  	if(ecart > seuil_temps)
  	{
1a2c5f60   skhinach   Quelques modifs f...
34
  		sendUDPUnicast("172.26.145.35", msg1, 2020);
5940bf6e   skhinach   Quelques modifs
35
36
37
38
39
40
41
42
  	}
  	else
  	{
  		sendUDPBroadcast(msg2,2020);
  	}
  }
  
  // La fonction va initialiser la sonde réseau
a69a94a7   skhinach   Ajout de gestion ...
43
44
  int initialize_sniffer(pcap_t** dev_handle, char dev[])
  {
1f9d795a   Speedclocker   Sniffer et sender
45
46
47
48
49
  	bpf_u_int32 mask; // Masque de l'adresse réseau de l'interface à sniffer
  	bpf_u_int32 net; // Adresse réseau de l'interface à sniffer
  
  	char ip[18]="null";
  
1f9d795a   Speedclocker   Sniffer et sender
50
51
  	struct bpf_program filter; // Filtre défini par une structure
  	char buf_err[PCAP_ERRBUF_SIZE]; // Buffer qui stockera les erreurs rencontrées le cas échéant
1f9d795a   Speedclocker   Sniffer et sender
52
53
  	int status; 
  
1f9d795a   Speedclocker   Sniffer et sender
54
  
32c9271a   skhinach   modif
55
  	// Permet d'obtenir l'adresse ip de l'interface demandée*/
1f9d795a   Speedclocker   Sniffer et sender
56
57
  	/* pcap permet de lister les interfaces et obtenir les adresses ip de ces dernières
  	 * On utilise la fonction pcap_findalldevs 
a69a94a7   skhinach   Ajout de gestion ...
58
59
  	 */
  
1f9d795a   Speedclocker   Sniffer et sender
60
  	pcap_if_t* interfaces;
a69a94a7   skhinach   Ajout de gestion ...
61
  
1f9d795a   Speedclocker   Sniffer et sender
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
  	if(pcap_findalldevs(&interfaces, buf_err)!=0) { printf("%s\n", buf_err); return(EXIT_FAILURE); }
  	
  	for(pcap_if_t* i=interfaces; i!=NULL; i=i->next) 
  	{
          	if(strcmp(i->name, dev)==0)
  		{
  			for(pcap_addr_t* a=i->addresses; a!=NULL; a=a->next) 
  			{
  				if(a->addr->sa_family == AF_INET) 
  				{
  					strcpy( ip , inet_ntoa(((struct sockaddr_in*)a->addr)->sin_addr) ); 
  					printf("IP: %s\n", ip);
  				}
  			}		
  		}
      	}
  
  
  
  		
  	// Création du handle du device
a69a94a7   skhinach   Ajout de gestion ...
83
  	if ((*dev_handle=pcap_create(dev, buf_err))==NULL)
1f9d795a   Speedclocker   Sniffer et sender
84
85
86
87
88
89
90
91
  	{
  		//printf("%s\n", buf_err);
  		fprintf(stderr, "Le handle n'a pas pu être créé sur le device %s. Vérifiez s'il est bien existant.\n", dev);
  		return(EXIT_FAILURE);
  	}
  	
  	
  	// Activation du device
a69a94a7   skhinach   Ajout de gestion ...
92
  	if ((status=pcap_activate(*dev_handle))!=0)
1f9d795a   Speedclocker   Sniffer et sender
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
  	{
  		fprintf(stderr, "Le sniffer ne peut être activé sur le device %s\n Code d'erreur : %d \n", dev, status);
  
  		return(EXIT_FAILURE);
  	}	
  	
  
  	// Vérification de l'adresse réseau
  	if (pcap_lookupnet(dev, &net, &mask, buf_err) == -1)
  	{
  		fprintf(stderr, "L'adresse ip n'a pas pu être obtenue %s\n", dev);
  		net=0;
  		mask=0;
  	}
  
  	printf("Adresse du réseau : %d.%d.%d.%d \n", net & 0xff, (net >> 8) & 0xff, (net >> 16) & 0xff, (net >> 24) & 0xff);
  	printf("Masque : %d.%d.%d.%d \n", mask & 0xff, (mask >> 8) & 0xff, (mask >> 16) & 0xff, (mask >> 24) & 0xff);
  
  
a69a94a7   skhinach   Ajout de gestion ...
112
  	// Conception du filtre (on vérifie si on a la bonne ip)
1f9d795a   Speedclocker   Sniffer et sender
113
114
115
116
117
118
119
120
121
  	char filter_str[50]="arp";
  	if( strcmp(ip,"null")!=0 )
  	{
  		strcat(filter_str," and dst host ");
  		strcat(filter_str, ip);
  	}
  
  
  	// "Analyse" du filtre de paquets de type arp 
a69a94a7   skhinach   Ajout de gestion ...
122
  	if(pcap_compile(*dev_handle, &filter, filter_str, 0, net)==-1)
1f9d795a   Speedclocker   Sniffer et sender
123
  	{
a69a94a7   skhinach   Ajout de gestion ...
124
  		fprintf(stderr, "Le filtre n'a pas pu être analysé : %s\n", pcap_geterr(*dev_handle));
1f9d795a   Speedclocker   Sniffer et sender
125
126
127
128
129
  		return(EXIT_FAILURE);
  	}
  
  
  	// Installation du filtre de paquets
a69a94a7   skhinach   Ajout de gestion ...
130
  	if(pcap_setfilter(*dev_handle, &filter) == -1)
1f9d795a   Speedclocker   Sniffer et sender
131
  	{
a69a94a7   skhinach   Ajout de gestion ...
132
  		fprintf(stderr, "Impossible d'installer le filtre : %s\n", pcap_geterr(*dev_handle));
1f9d795a   Speedclocker   Sniffer et sender
133
134
135
  		return(EXIT_FAILURE);
  	}
  
a69a94a7   skhinach   Ajout de gestion ...
136
137
138
139
140
  	return 0;
  
  
  }
  
a69a94a7   skhinach   Ajout de gestion ...
141
  
5940bf6e   skhinach   Quelques modifs
142
143
  int ecouteReseau(char* dev)
  {
0f1eb4c5   skhinach   test
144
  	int cnt=2; // Correspond au seuil de paquets arp à compter
a69a94a7   skhinach   Ajout de gestion ...
145
  
5940bf6e   skhinach   Quelques modifs
146
  	time_t last_time_reponse; // Correspond au moment du démarrage du cycle de la sonde
a69a94a7   skhinach   Ajout de gestion ...
147
  
5940bf6e   skhinach   Quelques modifs
148
  	pcap_t *dev_handle; // Handle vers le device (correspondant à l'interface à sniffer)
a69a94a7   skhinach   Ajout de gestion ...
149
150
  
  	printf("Device: %s\n", dev);
a69a94a7   skhinach   Ajout de gestion ...
151
  	
5940bf6e   skhinach   Quelques modifs
152
  	if(initialize_sniffer(&dev_handle, dev)!=0) return(-1); // Initialisation du sniffer
a69a94a7   skhinach   Ajout de gestion ...
153
  
5940bf6e   skhinach   Quelques modifs
154
155
156
157
  	while(1)
  	{
  		last_time_reponse = time(NULL);
  		pcap_loop(dev_handle, cnt, arp_detect, NULL); // Boucle jusque [cnt] paquets arp reçus
0f1eb4c5   skhinach   test
158
  		reponseSonde(last_time_reponse, 10); // Une fois que le seuil de temps est passé
5940bf6e   skhinach   Quelques modifs
159
  	}
a69a94a7   skhinach   Ajout de gestion ...
160
161
162
  	
  	return 0;
  }
32c9271a   skhinach   modif