Blame view

Network/sniffer.c 4.22 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"
  
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