Process Read & Send 1. Legge pacchetti dal pcap dump file (utilizzando libpcap facilities) 2. Utilizza un socket UDP per inviarli ad un indirizzo di rete dump file socket
Process Capture & write 1. Cattura i pacchetti che corrispondono a regole di filtering 2. Scrive i pacchetti in un dump file dump file socket new dump file capture
sockaddr / sockaddr_in / in_addr struct sockaddr { unsigned short sa_family; // e.g. AF_INET char sa_data[14]; // protocol address (14 bytes) }; // = 16 bytes struct sockaddr_in { short int sin_family; // Address family unsigned short int sin_port; // Port number struct in_addr sin_addr; // Internet address unsigned char sin_zero[8]; // Padding bytes };// sizeof(struct in_addr) + 8 = !! struct in_addr {unsigned long s_addr; // 4 bytes};
Strutture /usr/include/net/ethernet.h struct ether_header { u_int8_t ether_dhost[ETH_ALEN]; u_int8_t ether_dhost[ETH_ALEN]; u_int8_t ether_shost[ETH_ALEN]; u_int8_t ether_shost[ETH_ALEN]; u_int16_t ether_type; // packet type ID u_int16_t ether_type; // packet type ID} #define ETHERTYPE_IP0x0800 /*IP*/ #define ETHERTYPE_ARP0x0806 /*ARP*/
Strutture /usr/include/netinet/ip.h struct ipheader { uchar ip_hl:4; // ip_hl: # of 32bit words (4bytes) uchar ip_v:4; uchar ip_tos; ushort ip_len; ushort ip_id; ushort ip_off; uchar ip_ttl; uchar ip_p; ushort ip_sum; uint ip_src; uint ip_dst; }; // total iphdr len 20 bytes
Strutture /usr/include/netinet/udp.h struct udpheader { ushort uh_sport; ushort uh_dport; ushort uh_len; ushort uh_check; }; // udp hdr len 8 bytes
Inizializzare una sessione (1) Scelta dell’interfaccia dev = pcap_lookupdev(errbuf) Ottenimento configurazione di rete result = pcap_lookupnet(dev, &net, &mask, errbuf) Apertura della sessione handle = pcap_open_live(dev, snaplen, promisc, timeout, errbuf)
Inizializzare una sessione (2) Compilazione del filtro… result = pcap_compile(handle, &filter, filter_exp, optimize, net) …e applicazione del filtro stesso result = pcap_setfilter(handle, &filter) Predisposizione del file di cattura dumper = pcap_dump_open(handle, filename)
Cattura result = pcap_loop(pcap_t *p, int cnt, pcap_handler callback, u_char *useru_char *user) u_char *userresult -2: Interrotto da pcap_breakloop() -1: Errore! 0: Interrotto perché “sniffati” cnt pacchetti 0: Interrotto perché “sniffati” cnt pacchetti In alternativa: pcap_next(): “sniffa” un solo pacchetto pcap_dispatch(): “sniffa” un solo ‘burst’ di pacchetti
pcap_handler Callback void packet_handler( u_char *useru_char *user, u_char *user const struct pcap_pkthdr *headerconst struct pcap_pkthdr *header, const struct pcap_pkthdr *header const u_char *packet ) Scrittura pacchetto: void pcap_dump(u_char *user, struct pcap_pkthdr *header, u_char *packet) u_char *packet) Interruzione del loop di cattura: void pcap_breakloop(pcap_t *)
Chiusura sessione Ottenimento statistiche sulla sessione pcap_stats(handle, *stats) *stats Chiusura della sessione di cattura pcap_close(handle) Flushing dei dati e chiusura del file di dump pcap_dump_flush(dumper)pcap_dump_close(dumper)
struct pcap_pkthdr struct pcap_pkthdr { struct timeval ts; // timestamp bpf_u_int32 caplen; // len cattura bpf_u_int32 len; // len effettiva ‘on wire’ bpf_u_int32 len; // len effettiva ‘on wire’};
struct pcap_stat struct pcap_stat { u_int ps_recv; // # pacchetti ricevuti u_int ps_recv; // # pacchetti ricevuti u_int ps_drop; // # pacchetti scartati u_int ps_drop; // # pacchetti scartati u_int ps_ifdrop; // # pacchetti scartati perché non supportati dall’interfaccia u_int ps_ifdrop; // # pacchetti scartati perché non supportati dall’interfaccia};