1f9d795a
Speedclocker
Sniffer et sender
|
1
2
3
4
5
6
7
|
#include <pcap.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
|
a69a94a7
skhinach
Ajout de gestion ...
|
8
9
|
#define SZ_DEV_PCAP 10
|
1f9d795a
Speedclocker
Sniffer et sender
|
10
|
|
1f9d795a
Speedclocker
Sniffer et sender
|
11
|
// Fonction lors de la detection d'un paquet
|
a69a94a7
skhinach
Ajout de gestion ...
|
12
|
void arp_detect(/*u_char *args, const struct pcap_pkthdr *header, const u_char *packet*/)
|
1f9d795a
Speedclocker
Sniffer et sender
|
13
14
15
16
17
|
{
static int num=0, loop=1;
num++;
printf("Voici le paquet arp numéro : %d\n", num);
|
a69a94a7
skhinach
Ajout de gestion ...
|
18
|
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
|
19
20
|
}
|
a69a94a7
skhinach
Ajout de gestion ...
|
21
22
|
int initialize_sniffer(pcap_t** dev_handle, char dev[])
{
|
1f9d795a
Speedclocker
Sniffer et sender
|
23
24
25
26
27
|
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
|
28
29
|
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
|
30
31
|
int status;
|
1f9d795a
Speedclocker
Sniffer et sender
|
32
33
|
|
1f9d795a
Speedclocker
Sniffer et sender
|
34
|
|
32c9271a
skhinach
modif
|
35
|
// Permet d'obtenir l'adresse ip de l'interface demandée*/
|
1f9d795a
Speedclocker
Sniffer et sender
|
36
37
|
/* 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 ...
|
38
39
40
|
*/
|
1f9d795a
Speedclocker
Sniffer et sender
|
41
42
|
pcap_if_t* interfaces;
|
a69a94a7
skhinach
Ajout de gestion ...
|
43
|
|
1f9d795a
Speedclocker
Sniffer et sender
|
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
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 ...
|
65
|
if ((*dev_handle=pcap_create(dev, buf_err))==NULL)
|
1f9d795a
Speedclocker
Sniffer et sender
|
66
67
68
69
70
71
72
73
|
{
//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 ...
|
74
|
if ((status=pcap_activate(*dev_handle))!=0)
|
1f9d795a
Speedclocker
Sniffer et sender
|
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
|
{
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 ...
|
94
|
// Conception du filtre (on vérifie si on a la bonne ip)
|
1f9d795a
Speedclocker
Sniffer et sender
|
95
96
97
98
99
100
101
102
103
|
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 ...
|
104
|
if(pcap_compile(*dev_handle, &filter, filter_str, 0, net)==-1)
|
1f9d795a
Speedclocker
Sniffer et sender
|
105
|
{
|
a69a94a7
skhinach
Ajout de gestion ...
|
106
|
fprintf(stderr, "Le filtre n'a pas pu être analysé : %s\n", pcap_geterr(*dev_handle));
|
1f9d795a
Speedclocker
Sniffer et sender
|
107
108
109
110
111
|
return(EXIT_FAILURE);
}
// Installation du filtre de paquets
|
a69a94a7
skhinach
Ajout de gestion ...
|
112
|
if(pcap_setfilter(*dev_handle, &filter) == -1)
|
1f9d795a
Speedclocker
Sniffer et sender
|
113
|
{
|
a69a94a7
skhinach
Ajout de gestion ...
|
114
|
fprintf(stderr, "Impossible d'installer le filtre : %s\n", pcap_geterr(*dev_handle));
|
1f9d795a
Speedclocker
Sniffer et sender
|
115
116
117
|
return(EXIT_FAILURE);
}
|
a69a94a7
skhinach
Ajout de gestion ...
|
118
119
120
121
122
123
124
125
|
return 0;
}
int ecouteReseau(int argc, char* argv[])
{
int cnt=10; // Correspond au nombre de paquets arp
|
1f9d795a
Speedclocker
Sniffer et sender
|
126
|
|
a69a94a7
skhinach
Ajout de gestion ...
|
127
128
|
char dev[SZ_DEV_PCAP]; // Nom de l'interface à sniffer
pcap_t *dev_handle; // Handle vers le device (correspondant à l'interface à sniffer)
|
1f9d795a
Speedclocker
Sniffer et sender
|
129
|
|
a69a94a7
skhinach
Ajout de gestion ...
|
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
|
// Vérifie si le device a été donné
// ------------------------
int dev_donne=0;
for(int i=1; i<argc-1; i++)
{
if(strcmp(argv[i], "-dev")==0 || strcmp(argv[i], "-d")==0)
{
strcpy(dev, argv[i+1]);
dev_donne=1;
}
}
if(!dev_donne)
strcpy(dev, "eth0");
printf("Device: %s\n", dev);
// ------------------------
// struct pcap_pkthdr packet_header; // Header du paquet comportant des informations sur la réception du paquet (temps de reception etc...)
// const u_char *packet; // Contenant du paquet
if(initialize_sniffer(&dev_handle, dev)!=0) return(-1);
pcap_loop(dev_handle, cnt, arp_detect, NULL); // Boucle jusque 10 paquets arp reçus
return 0;
}
/*
int main(int argc, char *argv[])
{
ecouteReseau(argc, argv);
|
1f9d795a
Speedclocker
Sniffer et sender
|
172
173
|
return(0);
}
|
32c9271a
skhinach
modif
|
174
175
|
*/
|