Salve a tutti, ho iniziato a giocare un po con le socket di sistema e volevo provare a realizzare uno sniffer. Leggendo i vari documenti e copiando alcune funzioni e parti di codice, ho scritto questo:
Codice PHP:
#include <stdio.h>
#include <stdlib.h> //per chiamare la funzione exit()
#include <string.h> //per usare la funzione strncpy()
#include <netinet/in.h> //utilizza la funzione socket()
#include <sys/ioctl.h> //utilizza la funzione ioctl()
#include <net/if.h> //contiene la struttura ifreq
#include <linux/if_ether.h> //contiene la macro ETH_P_IP
struct sockaddr sorgente;
struct ifreq interfaccia;
int apertura_socket = 0;
char buffer[1500]; //massima lunghezza utile
int lunghezza_pacchetto = 0;
unsigned char *contenuto_header;
int main (int argc,char *argv[]) {
//APRO IL SOCKET PER UTILIZZARE IN MODO DA COMUNICARE DIRETTAMENTE CON LA SCHEDA DI RETE
//la funzione restituirà un valore maggiore di 0 che indica il canale di comunicazione
if ( (apertura_socket = socket(PF_PACKET, SOCK_RAW, ETH_P_IP)) < 0)
{
printf ("Errore socket");
exit(1);
}
//ABILITAZIONE DELLA SCHEDA DI RETE IN MODALITA' PROMISCUA
strncpy( interfaccia.ifr_name, argv[1], IFNAMSIZ );
ioctl( apertura_socket, SIOCGIFFLAGS, &interfaccia );
interfaccia.ifr_flags |= IFF_PROMISC;
ioctl( apertura_socket , SIOCSIFFLAGS, &interfaccia );
//________________________________________________________
strncpy(sorgente.sa_data, argv[1], sizeof(sorgente.sa_data));
while (1)
{
recvfrom( apertura_socket, buffer, sizeof(buffer), 1500,
(struct sockaddr *)&sorgente, &lunghezza_pacchetto );
contenuto_header = (unsigned char *)buffer;
printf ("%02x", contenuto_header[0]);
printf ("%s \n %d \n %s \n", buffer, sorgente.sa_family, sorgente.sa_data);
printf ("%s \n", lunghezza_pacchetto);
}
}
I printf alla fine li ho messi per provare a stampare alcuni dati, mentre il while infinito l'ho fatto per stampare sempre i dati in modo da vedere se venivano aggiornati durante la navigazione, ma non è cosi...
Quale può essere il problema? grazie