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"
|
a629f0c7
Antoine Moreau
Fin.
|
10
|
#define ADRESSE "172.26.145.205"
|
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
|
{
|
a629f0c7
Antoine Moreau
Fin.
|
17
|
printf("Paquet ARP\n");
|
1f9d795a
Speedclocker
Sniffer et sender
|
18
19
|
}
|
5940bf6e
skhinach
Quelques modifs
|
20
21
22
23
|
// 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)
{
|
8450f712
Antoine Moreau
fin
|
24
25
26
27
28
29
30
|
time_t ecart = time(NULL) - last_time;
char msg0[2] = {0xA0,0x00}; // 0%
char msg1[2] = {0xB0,0x00}; // 50%
char msg2[2] = {0xBF,0xFF}; // 100%
if (ecart > 2*seuil_temps)
{
|
a629f0c7
Antoine Moreau
Fin.
|
31
|
sendUDPUnicast(ADRESSE, msg0, 2020);
|
8450f712
Antoine Moreau
fin
|
32
33
34
|
}
else if(ecart > seuil_temps)
{
|
a629f0c7
Antoine Moreau
Fin.
|
35
|
sendUDPUnicast(ADRESSE, msg1, 2020);
|
8450f712
Antoine Moreau
fin
|
36
37
38
39
40
|
}
else
{
sendUDPBroadcast(msg2,2020);
}
|
5940bf6e
skhinach
Quelques modifs
|
41
42
43
|
}
// La fonction va initialiser la sonde réseau
|
a69a94a7
skhinach
Ajout de gestion ...
|
44
45
|
int initialize_sniffer(pcap_t** dev_handle, char dev[])
{
|
8450f712
Antoine Moreau
fin
|
46
47
|
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
|
1f9d795a
Speedclocker
Sniffer et sender
|
48
|
|
8450f712
Antoine Moreau
fin
|
49
|
char ip[18]="null";
|
1f9d795a
Speedclocker
Sniffer et sender
|
50
|
|
8450f712
Antoine Moreau
fin
|
51
52
53
|
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
int status;
|
1f9d795a
Speedclocker
Sniffer et sender
|
54
|
|
1f9d795a
Speedclocker
Sniffer et sender
|
55
|
|
8450f712
Antoine Moreau
fin
|
56
57
58
59
|
// Permet d'obtenir l'adresse ip de l'interface demandée*/
/* 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 ...
|
60
|
|
8450f712
Antoine Moreau
fin
|
61
|
pcap_if_t* interfaces;
|
a69a94a7
skhinach
Ajout de gestion ...
|
62
|
|
8450f712
Antoine Moreau
fin
|
63
|
if(pcap_findalldevs(&interfaces, buf_err)!=0) { printf("%s\n", buf_err); return(EXIT_FAILURE); }
|
1f9d795a
Speedclocker
Sniffer et sender
|
64
|
|
8450f712
Antoine Moreau
fin
|
65
66
67
|
for(pcap_if_t* i=interfaces; i!=NULL; i=i->next)
{
if(strcmp(i->name, dev)==0)
|
1f9d795a
Speedclocker
Sniffer et sender
|
68
|
{
|
8450f712
Antoine Moreau
fin
|
69
70
71
|
for(pcap_addr_t* a=i->addresses; a!=NULL; a=a->next)
{
if(a->addr->sa_family == AF_INET)
|
1f9d795a
Speedclocker
Sniffer et sender
|
72
|
{
|
8450f712
Antoine Moreau
fin
|
73
74
|
strcpy( ip , inet_ntoa(((struct sockaddr_in*)a->addr)->sin_addr) );
printf("IP: %s\n", ip);
|
1f9d795a
Speedclocker
Sniffer et sender
|
75
|
}
|
8450f712
Antoine Moreau
fin
|
76
77
78
|
}
}
}
|
1f9d795a
Speedclocker
Sniffer et sender
|
79
80
81
82
|
|
8450f712
Antoine Moreau
fin
|
83
84
85
86
87
88
89
|
// Création du handle du device
if ((*dev_handle=pcap_create(dev, buf_err))==NULL)
{
//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);
}
|
1f9d795a
Speedclocker
Sniffer et sender
|
90
91
|
|
8450f712
Antoine Moreau
fin
|
92
93
94
95
|
// Activation du device
if ((status=pcap_activate(*dev_handle))!=0)
{
fprintf(stderr, "Le sniffer ne peut être activé sur le device %s\n Code d'erreur : %d \n", dev, status);
|
1f9d795a
Speedclocker
Sniffer et sender
|
96
|
|
8450f712
Antoine Moreau
fin
|
97
98
|
return(EXIT_FAILURE);
}
|
1f9d795a
Speedclocker
Sniffer et sender
|
99
100
|
|
8450f712
Antoine Moreau
fin
|
101
102
103
104
105
106
107
|
// 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;
}
|
1f9d795a
Speedclocker
Sniffer et sender
|
108
|
|
8450f712
Antoine Moreau
fin
|
109
110
|
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);
|
1f9d795a
Speedclocker
Sniffer et sender
|
111
112
|
|
8450f712
Antoine Moreau
fin
|
113
114
115
116
117
118
119
|
// Conception du filtre (on vérifie si on a la bonne ip)
char filter_str[50]="arp";
if( strcmp(ip,"null")!=0 )
{
strcat(filter_str," and dst host ");
strcat(filter_str, ip);
}
|
1f9d795a
Speedclocker
Sniffer et sender
|
120
121
|
|
8450f712
Antoine Moreau
fin
|
122
123
124
125
126
127
|
// "Analyse" du filtre de paquets de type arp
if(pcap_compile(*dev_handle, &filter, filter_str, 0, net)==-1)
{
fprintf(stderr, "Le filtre n'a pas pu être analysé : %s\n", pcap_geterr(*dev_handle));
return(EXIT_FAILURE);
}
|
1f9d795a
Speedclocker
Sniffer et sender
|
128
129
|
|
8450f712
Antoine Moreau
fin
|
130
131
132
133
134
135
|
// Installation du filtre de paquets
if(pcap_setfilter(*dev_handle, &filter) == -1)
{
fprintf(stderr, "Impossible d'installer le filtre : %s\n", pcap_geterr(*dev_handle));
return(EXIT_FAILURE);
}
|
1f9d795a
Speedclocker
Sniffer et sender
|
136
|
|
8450f712
Antoine Moreau
fin
|
137
|
return 0;
|
a69a94a7
skhinach
Ajout de gestion ...
|
138
139
140
141
|
}
|
a69a94a7
skhinach
Ajout de gestion ...
|
142
|
|
5940bf6e
skhinach
Quelques modifs
|
143
144
|
int ecouteReseau(char* dev)
{
|
8450f712
Antoine Moreau
fin
|
145
|
int cnt=10; // Correspond au seuil de paquets arp à compter
|
a69a94a7
skhinach
Ajout de gestion ...
|
146
|
|
8450f712
Antoine Moreau
fin
|
147
|
int seuil=10; // Seuil de temps
|
a69a94a7
skhinach
Ajout de gestion ...
|
148
|
|
8450f712
Antoine Moreau
fin
|
149
|
time_t last_time_reponse; // Correspond au moment du démarrage du cycle de la sonde
|
a69a94a7
skhinach
Ajout de gestion ...
|
150
|
|
8450f712
Antoine Moreau
fin
|
151
|
pcap_t *dev_handle; // Handle vers le device (correspondant à l'interface à sniffer)
|
a69a94a7
skhinach
Ajout de gestion ...
|
152
|
|
8450f712
Antoine Moreau
fin
|
153
154
155
156
157
158
159
160
161
162
|
printf("Device: %s\n", dev);
if(initialize_sniffer(&dev_handle, dev)!=0) return(-1); // Initialisation du sniffer
while(1)
{
last_time_reponse = time(NULL);
pcap_loop(dev_handle, cnt, arp_detect, NULL); // Boucle jusque [cnt] paquets arp reçus
reponseSonde(last_time_reponse, seuil); // Une fois que le seuil de temps est passé
}
|
a69a94a7
skhinach
Ajout de gestion ...
|
163
|
|
8450f712
Antoine Moreau
fin
|
164
|
return 0;
|
a69a94a7
skhinach
Ajout de gestion ...
|
165
|
}
|
32c9271a
skhinach
modif
|
|
|