3. Libreria Pcap

3.1-Packet Capture Library: panomarica

Il Packet capturing nasce con l’avvento di Ethernet. Sun implementò NIT (Network Interface Tap) per catturare pacchetti e etherfind per stampare gli header dei pacchetti. tcpdump è lo sniffer più popolare nella comunità UNIX

ed è basato su un potente meccanismo di filtro: BSD packet filter (BPF Berkley Packet Filter)

Le potenzialità per la cattura e il filtro di tcpdump sono implementate in una libreria separata: pcap.

Nel sistema operativo Linux il Berkeley Packet Filter (BPF) è il sistema di cattura dei pacchetti. Tale libreria fornisce delle "user-level subroutines" che si interfacciano con il BPF per permettere agli utenti l'accesso ai pacchetti per leggere e processare il traffico di rete. Usando Packet Capture Library, gli utenti possono scrivere i propri tool di network-monitoring. Le applicazioni che usano le subroutine pcap devono girare come codice root. BPF consultare UNIX Network Programming, Volume 1: Networking APIs: Sockets and XTI, Second Edition di W. Richard Stevens, 1998.

La libreria pcap (Packet Capture Library) fornisce un'interfaccia di alto livello per i sistemi di cattura dei pacchetti. Tutti i pacchetti sulla rete, anche destinati ad altri host, sono accessibili attraverso questo meccanismo. Pcap è stata sviluppata da Van Jacobson, Craig Leres e Steven McCanne del Lawrence Berkeley National Laboratory, University of California, Berkeley, CA. L'Ultima versione sviluppata è la 0.6.2 ed è disponibile via ftp anonimo:

ftp://ftp.ee.lbl.gov/libpcap.tar.z

Al seguente sito è disponibile il Pcap man page in pdf:

http://cs.uccs.edu/~cs622/pcap/pcap.pdf.

E' disponibile anche un libro sulla libreria Pcap (Steve McCanne, Craig Leres, and Van Jacobson, PCAP library, README, Lawrence Berkeley National Laboratory, Network Research Group, 1996). Per maggiori informazioni consultare il sito dell'LBL all'indirizzo:

 

http://www-nrg.ee.lbl.gov/nrg.html


Anche tcpdump usa la libreria Pcap. Prima di realizzare tcpdump è stato necessario costruire libpcap. tcpdump e libpcap sono stati realizzati e testati sotto SGI Irix 4.x e 5.2, SunOS 4.x, Solaris 2.3, BSD/OS, DEC/OSF v1.3 v2.0, e Ultrix 4.x, e vengono ancora usate sotto SunOS 3.5 e 4.3BSD Reno/Tahoe.
Fu originariamente scritta da Van Jacobson come parte di un progetto di ricerca per migliorare le performance di TCP e Internet. Le parti del programma originariamente prese dagli etherfind Sun furono poi riscritte da Steven McCanne, per fare in modo che in tcpdump non ci fossero tracce di codice proprietario. Egli prese queste parti di programma dalle specifiche del manual entry, senza accesso al sorgente di tcpdump o etherfind. Il sorgente di libpcap è disponibile al sito ftp:

ftp://ftp.ee.lbl.gov/libpcap

oppure

ftp://ftp.sysadmin.com/pub/admin/tools/networking/libpcap.

Il sorgente di tcpdump è disponibile al sito ftp:

ftp://ftp.ee.lbl.gov/tcpdump

oppure

ftp://ftp.sysadmin.com/pub/admin/tools/networking/tcpdump.

Per problemi, bug, domande, suggerimenti possono essere spediti a tcpdump@ee.lbl.gov.

Lista di persone che hanno contribuito allo sviluppo di libpcap:

I correnti maintainer:

Bill Fenner                            fenner@research.att.com
Assar Westerlund                  assar@sics.se
Alexey Kuznetsov                  kuznet@ms2.inr.ac.ru
Jun-ichiro itojun Hagino        itojun@iijlab.net
Guy Harris                             guy@alum.mit.edu
Torsten Landschoff                torsten@debian.org
Michael Richardson               mcr@sandelman.ottawa.on.ca
Sebastian Krahmer                 krahmer@cs.uni-potsdam.de

Persone che hanno contribuito per alcune patch:

Arkadiusz Miskiewicz           misiek@pld.org.pl
Fulvio Risso                          risso@polito.it
Charles M. Hannum               mycroft@netbsd.org
Chris G. Demetriou               cgd@netbsd.org
Darren Reed                          darrenr@reed.wattle.id.au
Greg Troxel                           gdt@ir.bbn.com
Jefferson Ogata                      jogata@nodc.noaa.gov
Juergen Schoenwaelder         schoenw@ibr.cs.tu-bs.de
Lorenzo Cavallaro                 sullivan@sikurezza.org
Love Hörnquist-Åstrand        lha@stacken.kth.se
Monroe Williams                   monroe@pobox.com
Olaf Kirch                              okir@caldera.de
Peter Jeremy                           peter.jeremy@alcatel.com.au>
Rafal Maszkowski                  rzm@icm.edu.pl
Rick Jones                              raj@cup.hp.com
Tony Li                                   tli@jnx.com
Uwe Girlich                           Uwe.Girlich@philosys.de

I creatori originari:

Steve McCanne
Craig Leres
Van Jacobson

 

        

 McCanne         Leres

 

Home page di Leres:

 

http://www-nrg.ee.lbl.gov/leres/

 

Effettuare il Packet Capture

Uno sniffer basato sulla libreria PCAP dovrebbe effettuare le seguenti chiamate:

  1. Chiamare pcap_lookupdev per decidere su quale device ascoltare.
  2. Chiamare pcap_open_live per ottenere un packet capture descriptor.
  3. Scegliere un packet filter. Il filtro identifica i pacchetti a cui sono interessato.
  4. Compilare il packet filter in un programma filtro usando pcap_compile. L'epressione filtro è specificata in caratteri ASCII. Consultare Packet Capture Library: le espressioni filtro per maggiori informazioni.
  5. Dopo che un programma filtro BPF è compilato, notificare la cattura dei pacchetti sulla device con il filtro specificato usando pcap_setfilter. Se i pacchetti catturati sono stati salvati in un file per essere processati in un secondo momento, apri il file (detto savefile) usando pcap_dump_open.
  6. Usare pcap_dispatch o pcap_loop per leggere i pacchetti catturati e chiamare una sub che le gestisce e li processa. Questa sub può essere pcap_dump, se i pacchetti sono stati scritti in savefile, oppure una sub scritta ad hoc.
  7. Chiamare pcap_close per deallocare le risorse usate dal packet capture descriptor.

 

Packet Capture Library Filter Expressions

L'espressione di filtro è passata alla subroutine pcap_compile per specificare i pacchetti che dovrebbero essere catturati. Se nessuna espressione filtro è data, saranno catturati tutti i pacchetti sulla rete. Altrimenti saranno catturati, solamente pacchetti per i quali l'espressione di filtro è Vera . L'espressione filtro è una sequenza di ASCII che consiste di uno o più primitive. Le primitive consistono di solito di un id (nome o numero) preceduto da uno o più qualificatori. Ci sono tre tipi di qualificatori:

type

Specifica a che genere di device l'id nome o numero si riferisce. I possibili tipi sono host, net, e port. Esempi sono host foo, net 128.3, port 20. Se non c'è qualificatore type, allora viene preso host.

dir

Specifica una particolare direzione di trasferimento da o a id. Possibili direzioni sono src, dst, src o dst, e src e dst. Degli esempi con qualificatori dir sono: src foo, dst net 128.3, src o dst port ftp-dati. Se non c'è un qualificatore dir, src o dst è assunto di default.

proto

Restringe la cattura ad un particolare protocollo. Possibili qualificatori proto sono: ether, ip, arp, rarp, tcp, ed udp. Esempi sono: ether src foo, arp net 128.3, tcp port 21. Se non c'è un qualificatore di proto, tutti i protocolli consitenti col tipo sono assunti di default. Per esempio, src foo intende ip o arp, net bar intende ip o arp o rarp net bar, e port 53 vuole dire tcp o udp port 53.

 

Ci sono anche delle parole chiavi primitive e speciali che non seguono il modello: broadcast, multicast, less, greater ed dspressioni aritmetiche. Tutto di queste parole chiavi è descritto nelle informazioni seguenti.

 

Primitive ammesse

Le primitive seguenti sono permesse:

dst host Host

Vero se il valore del campo IP (Internet Protocol) di destinazione del pacchetto è lo stesso della variabile Host che può essere o un indirizzo o un nome.

dst port Port

Vero se il pacchetto è TCP/IP (Trasmission Control Protocol/Internet Protocol) o IP/UDP (Internet Protocol/User Datagram Protocol) e ha un valore di porta di destinazione Port. La porta può essere un numero o un nome usato in /etc/services. Se è usato un nome, il numero di porta e il protocollo vengono controllati. Se è usato un numero o nome ambiguo, solamente il numero di porta viene controllato (dst port 513 stamperanno il traffico TCP/login ed UDP/who, e port dominio stamperà il traffico TCP/domain ed UDP/domain).

DST net Net

Vero se il valore dell'indirizzo di destinazione IP del pacchetto ha un numero di rete Net. Nota che Net deve essere in formato decimale punteggiato.

greater Length

Vero se il pacchetto ha una lunghezza maggiore o uguale della variabile Length. Questo è equivalente a:

len > = Length

host Host

Vero se il valore di IP sorgente o destinazione del pacchetto è lo stesso della variabile Host. Si possono aggiungere le parole chiavi ip, arp, o rarp ad alcune espressioni di host precedenti come segue:

ip host Host

Se la variabile Host è un nome IP con indirizzi multipli, ogni indirizzo sarà controllato per un match.

ip, arp, rarp

Queste parole chiavi sono forme abbreviate delle seguenti: 

proto ip, proto arp, e proto rarp.

ip broadcast

Vero se il pacchetto è un IP broadcast. Controlla per le convenzioni di broadcast tutti-zero e tutti-uno, e si riferisce alla subnet mask locale.

ip multicast

Vero se il pacchetto è un pacchetto di multicast IP.

ip proto Protocol

Vero se il pacchetto è un pacchetto IP del protocollo del tipo Protocol. Protocol può essere un numero o uno dei nomi icmp, udp, o tcp.

less Length

Vero se il pacchetto ha una lunghezza minore o uguale di Length. Questo è equivalente a:

len < = Length

net Net

Vero se il valore dell'indirizzo IP sorgente o destinazione del pacchetto ha un numero di rete Net. Nota che Net deve essere in formato decimale punteggiato.

net Net/Len

Vero se il valore dell'indirizzo IP sorgente o destinazione del pacchetto ha un numero di rete Net ed una netmask di Len bit. Nota che Net deve essere in formato decimale punteggiato.

net Net mask Mask

Vero se il valore dell'indirizzo IP sorgente o destinazione del pacchetto ha un numero di rete Net e una specifica netmask Mask. Nota che Net e Mask devono essere in formato decimale punteggiato.

port Port

Vero se il valore la porta sorgente o destinazione del pacchetto è Port. Si possono aggiungere le parole chiavi tcp o udp ad alcune delle espressioni di port precedenti, come di seguito:

tcp src port port

che è uguale a pacchetti solo TCP.

proto Protocol

Vero se il pacchetto è di tipo Protocol. Protocol può essere un numero o un nome come ip, arp, o rarp.

 

src host Host

Vero se il valore del campo IP sorgente del pacchetto è lo stesso della variabile Host.

 

src net Net

Vero se il valore dell'indirizzo IP sorgente del pacchetto ha un numero di rete Net. Nota che Net deve essere in formato decimale punteggiato.

 

src port Port

Vero se il valore della variabile Port è lo stesso della porta sorgente.

 

tcp, udp, icmp

Queste parole chiavi sono forme abbreviate delle seguenti: 

ip proto tcp, ip proto udp, or ip proto icmp

 

Operatori Relazionali dei Parametri delle Espressioni

La semplice relazione:

expr relop expr

È vera quando relop è uno dei seguenti:

Per accedere ai dati nel pacchetto si usi la sintassi seguente:

proto [ expr : size ]

Proto è una delle parole chiavi ip, arp, rarp, tcp o icmp, ed indica lo strato di protocollo per l'operazione di indice. Il byte di offset relativo allo strato di protocollo indicato è dato da expr. L' indicatore size è opzionale ed indica il numero di byte nel campo di interesse; può essere uno, due, o quattro, e di default è un byte. L'operatore di lunghezza, indicato dalla parola chiave len dà la lunghezza del pacchetto.

Per esempio, l'espressione ip[0] & il 0xf! = 5 prende solamente datagramma non frammentati e frammento 0 di datagramma frammentati. Questo controllo è implicito all'indice di operazioni tcp ed udp. Per esempio, tcp[0] intende sempre il primo byte del'header TCP, e mai il primo byte di un frammento intermedio.

 

Combinare Primitive

Espressioni di filtro più complesse sono create usando le parole e, o, e non combinate. Per esempio, host foo and not port ftp and not port ftp-data. Elenchi di qualificatore identici possono essere omessi per ridurre la digitazione. Per esempio, tcp dst port ftp or ftp-data or domain è la stessa cosa di tcp dst port ftp or tcp dst port ftp-data or tcp dst port domain.

Le primitive possono essere combinate usando un gruppo di primitive ed operatori tra parentesi

La Nngazione ha precedenza più alta. L'alternazione e concatenazionehanno precedenza uguale e associatività da sinistra a destra.

Se un identificatore è dato senza una parola chiave, viene assunta la più recente. Per esempio:

not host gil and devo


Questo filtro cattura pacchetti che non hanno una sorgente o destinazione host gil ed anche pacchetti che hanno una sorgente
o destinazione host devo. È una versione abbreviata del seguente:

not host gil and host devo

Si eviti di confonderlo con il filtro seguente che cattura pacchetti che non hanno una sorgente o destinazione sia gil che devo:

not (host gil or devo)

 

3.2-pcap_close subroutine

Scopo

Chiude i file aperti riferiti al packet capture descriptor e libera la memoria usata dal descrittore.

Sintassi

#include <pcap.h>
void pcap_close(pcap_t *p);

Descrizione

La subroutine pcap_close chiude i file associati al packet capture descriptor e dealloca le risorse. Se la subroutine pcap_open_offline è stata chiamata precedentemente, pcap_close chiude il savefile, un file di dati contenente il salvataggio del traffico catturato precedentemente , oppure pcap_close chiude la routine di cattura dei pacchetti se pcap_open_live è stata chiamata precedentemente.

Parametri

p

Punta ad un packet capture descriptor restituito da pcap_open_live o da pcap_open_offline.

Informazioni correlate

pcap_open_live subroutine, pcap_open_offline subroutine.  

 

3.3-pcap_compile subroutine

Scopo

Compilare un espressione filtro in un programma.

Sintassi

#include <pcap.h>
int pcap_compile(pcap_t *p, struct bpf_program *fp, char *str, int optimize, bpf_u_int32 netmask);

Descrizione

pcap_compile è usata per compilare la stringa str in un programma filtro. Questo programma filtro sarà usato per selezionare o estrarre i pacchetti desiderati.

Parametri

netmask

Specifica la netmask dell’interfaccia di rete. La netmask può essere ottenuta dalla chiamata a pcap_lookupnet.

optimize

Controlla se c’è ottimizzazione sul codice risultante.

p

punta ad un packet capture descriptor restituito da pcap_open_live e da pcap_open_offline.

program

Punta ad una struttura bpf_program che sarà riempita da pcap_compile se la procedura ha successo.

str

Contiene l'espressione filtro

 

Valori di ritorno

In caso di successo pcap_compile restituisce 0. Se pcap_compile non ha successo, -1 è resituito.

Informazioni correlate

pcap_geterr subroutine, pcap_lookupnet subroutine, pcap_open_live subroutine, pcap_open_offline subroutine, pcap_perror subroutine, pcap_setfilter subroutine.  

 

3.4-pcap_datalink subroutine

Scopo

Ottenere il tipo di link layer per la device di cattura dei pacchetti.

Sintassi

#include <pcap.h>
int pcap_datalink(pcap_t *p);

Descrizione

La subroutine pcap_datalink restituisce il tipo di link layer della device di cattura dei pacchetti, per esempio IFT_ETHER. Questo è utile per determinare la taglia dell'header del datalink all'inizio di ogni pacchetto che viene letto.

Parametri

p

Punta al packet capture descriptor restituito da pcap_open_live o da pcap_open_offline.

Valori di ritorno

pcap_datalink restituisce il tipo di link layer.

Nota: questa subroutine può essere invocata solamente dopo una chiamata riuscita a pcap_open_live o a pcap_open_offline. Mai chiamare pcap_datalink dopo una chiamata a pcap_close, si otterranno risultati imprevedibili.

Informazioni correlate

pcap_close subroutine, pcap_open_live subroutine, pcap_open_offline subroutine.  

3.5-pcap_dispatch subroutine

Scopo

Catturare ed elaborare pacchetti.

Sintassi

#include <pcap.h>

int pcap_dispatch(pcap_t *p, int cnt, pcap_handler callback,  u_char *user);

Descrizione

La subroutine pcap_dispatch legge ed elabora pacchetti. Questa subroutine può essere chiamata per leggere ed elaborare pacchetti che sono memorizzati in un file di dati catturati precedentemente, conosciuto come savefile. La subroutine può anche leggere ed elaborare pacchetti che sono catturati al volo.

Da notare che il terzo parametro, callback, è del tipo pcap_handler. Questo è un puntatore ad una subroutine user-provided con tre parametri. Definire questa subroutine come segue:

   void user_routine(u_char *user, struct pcap_pkthdr *phdr, u_char *pdata)

Il parametro, user, è il parametro user passato alla subroutine pcap_dispatch. Il parametro, phdr, è un puntatore alla struttura pcap_pkthdr che precede ciascun pacchetto nel savefile. Il parametro, pdata, punta al pacchetto di dati. Questo permette agli utenti di definire un proprio gestore per i dati catturati.

Parametri

callback

Punta ad una routine user-provided che potrebbe essere chiamata per ogni pacchetto letto. L’utente è responsabile di fornire un puntatore valido, e un risultato imprevedibile può occorrere se viene fornito un puntatore non valido.

 

Nota: La subroutine pcap_dump  può anche essere specificata come il parametro callback. Se viene fatto, la subroutine pcap_dump_open sarà chiamata prima. Il puntatore alla struttura pcap_dumper_t sarà restituito dalla subroutine pcap_dump_open e sarà usato come parametro user nella subroutine pcap_dispatch. Il seguente frammento di programma illustra questo utilizzo:

                    pcap_dumper_t *pd

pcap_t * p;

int rc = 0;
pd = pcap_dump_open(p, "/tmp/savefile");
rc = pcap_dispatch(p, 0 , pcap_dump, (u_char *) pd);

cnt

Specifica il massimo numero di pacchetti da elaborare prima di uscire. Con cnt = -1 elabora tutti i pacchetti ricevuti in un buffer. Con cnt = 0 elabora tutti i pacchetti fino a quando non occorre un errore o legge EOF o legge timeout(quando la lettura avviene al volo e un valore non zero del timeout è specificato).

p

Punta ad un descrittore di pacchetto catturato restituito dalla subroutine pcap_open_offline o pcap_open_live. Questo potrà essere usato per memorizzare i dati del pacchetto letti.

user

Specifica il primo argomento da passare alla routine callback.

 

Valori di ritorno

Se l’operazione viene completata con successo, la subroutine pcap_dispatch restituisce il numero di pacchetti letti. Se viene letto EOF nel savefile, viene restituito zero. Se la subroutine pcap_dispatch non ha successo, viene restituito -1. In questo caso, la subroutine pcap_geterr o pcap_perror può essere usata per visualizzare un messaggio di errore.

Informazioni correlate

pcap_dump subroutine, pcap_dump_close subroutine, pcap_dump_open subroutine, pcap_geterr subroutine, pcap_open_live subroutine, pcap_open_offline subroutine, pcap_perror subroutine.

 

3.6-pcap_dump subroutine

Scopo

Scrivere i dati di un pacchetto catturato in un file binario.

Sintassi

#include <pcap.h>
void pcap_dump(u_char *user, struct pcap_pkthdr *h, u_char *sp);

Descrizione

La subroutine pcap_dump scrive i dati di un pacchetto catturato in un file binario. L’header dei dati del pacchetto, contenuto in h, può essere scritto nel file puntato dal file pointer user, seguito dai dati del pacchetto in sp. Quindi h->caplen byte di sp vengono scritti.

Il file a cui punta user (dove la subroutine pcap_dump scrive) deve essere aperto. Per aprire il file e ottenere il suo puntatore, usa la subroutine pcap_dump_open.

Gli argomenti della subroutine pcap_dump sono adatti per usarli con la subroutine pcap_dispatch e pcap_loop. Per ottenere questi dati, la subroutine pcap_open_offline può essere invocata con il nome del file a cui user punta come suo primo parametro.

Parametri

h

Contiene l’header dei dati del pacchetto che è stato scritto nel file di dati savefile. Questi dati possono essere scritti davanti al resto dei dati.

sp

Punta ai dati scritti in savefile.

user

Specifica il file pointer savefile restituito dalla subroutine pcap_dump_open. Verrà fatto il cast a u_char * quando sarà passato alla funzione.

Informazioni correlate

pcap_dump_close subroutine, pcap_dump_open subroutine, pcap_open_live subroutine, pcap_open_offline subroutine.

 

3.7-pcap_dump_close subroutine

Scopo

Chiude il file di dati savefile.

Sintassi

#include <pcap.h>
void pcap_dump_close(pcap_dumper_t *p);

Descrizione

La subroutine pcap_dump_close chiude il file di dati savefile, aperto dalla subroutine pcap_dump_open.

Parametri

p

Punta ad una struttura pcap_dumper_t, sinonimo di FILE *, che è il file pointer di savefile.

 

Informazioni correlate

pcap_dump_open subroutine.

 

3.8-pcap_dump_open subroutine

Scopo

Apre e crea un file per salvare i dati di pacchetti catturati.

Sintassi

#include <pcap.h>
pcap_dumper_t *pcap_dump_open(pcap_t *p, char *fname);

Descrizione

La subroutine pcap_dump_open apre e crea un file savefile per salvare i dati di pacchetti catturati. Questa azione è specificata attraverso il parametro fname. La subroutine allora scrive l’header del file dei pacchetti catturati nel file.La subroutine pcap_dump può allora essere chiamata per scrivere i dati del pacchetto catturato associato con il descrittore del pacchetto catturato, p, in questo file. La subroutine pcap_dump_open deve essere chiamata prima di chiamare la subroutine pcap_dump.

Parametri

fname

Specifica il nome del file da aprire. Un "-" indica che viene usato lo standard output invece del file.

p

Specifica il descrittore di un pacchetto catturato restituito dalla subroutine pcap_open_offline o pcap_open_live.

Valori di ritorno

Se l’operazione viene completata con successo la subroutine pcap_dump_open restituisce un puntatore al file che è stato creato e aperto. Questo puntatore punta ad una struttura pcap_dumper_t, sinonimo di FILE *. Vedi la subroutine pcap_dump , pcap_dispatch , o pcap_loop per un esempio di come usare pcap_dumper_t. Se la subroutine pcap_dump_open ha un insuccesso, viene restituito Null. Usare la subroutine pcap_geterr per ottenere il testo che specifica l’errore.

Informazioni correlate

pcap_dispatch subroutine, pcap_dump subroutine, pcap_dump_close subroutine, pcap_loop subroutine, pcap_open_live subroutine, pcap_open_offline subroutine.

 

3.9-pcap_file subroutine

Scopo

Ottenere il puntatore al file savefile, un file di dati precedentemente salvato contenente il traffico catturato.

Sintassi

#include <pcap.h>
FILE *pcap_file(pcap_t *p);

Descrizione

La subroutine pcap_file restituisce il puntatore al file savefile. Se non c'è savefile aperto, viene restituito 0. Questa subroutine dovrebbe essere invocata dopo una chiamata riuscita a pcap_open_offline e prima di chiamare pcap_close.

Parametri

p

Punta ad un packet capture descriptor restituito da pcap_open_offline.

Valori di ritorno

pcap_file restituisce il puntatore al file savefile.

Informazioni correlate

pcap_close subroutine, pcap_open_offline subroutine.  

 

3.10-pcap_fileno subroutine

Scopo

Ottiene il descrittore per il pacchetto catturato dal dispositivo.

Sintassi

#include <Pcap.h>

int pcap_fileno(pcap_t  *p)

Descrizione

La funzione pcap_fileno ritorna il descrittore per il dispositivo di cattura dei pacchetti. Essa deve essere chiamata solo dopo che la funzione pcap_open_live è stata chiamata con successo e dopo qualsiasi chiamata a pcap_close.

Parametri

p  Punta al descrittore di cattura dei pacchetti ed è restituito  dalla funzione pcap_open_live.

Valori di ritorno

La funzione  pcap_fileno ritorna il descrittore per il dispositivo di cattura dei pacchetti.

Informazioni correlate

Pcap_close subroutine, pcap_open_live subroutine.

  

3.11-pcap_geterr subroutine

Scopo

Ottiene il più recente messaggio di errore pcap.

Sintassi

#include <pcap.h>

char *pcap_geterr(pcap_t *p)

Descrizione

La funzione pcap_geterr ritorna gli ultimi messaggi di errore avvenuti. Questa funzione è utile per ottenere messaggi di errore dalle funzioni che non ritornano stringhe come errori. Poiché il puntatore restituito punta ad una zona di memoria che può essere riutilizzata dalle funzione della libreria pcap, è importante copiare questo messaggio in un nuovo buffer se il testo di errore necessita di essere salvato.

Parametri

p punta ad un packet capture descriptor restituito da pcap_open_live o da pcap_open_offline

Valori di ritorno

La funzione pcap_geterr ritorna un puntatore al più recente messaggio restituito dalle funzioni di libreria pcap. Se non ci sono precedenti messaggi di errore, viene restituita una stringa che ha come primo byte 0.

Informazioni correlate

pcap_open_live subroutine, pcap_open_offline subroutine, pcap_perror subroutine,  pcap_strerror subroutine.

 

3.12-pcap_is_swapped subroutine

Scopo

Riporta se l’ordine dei byte precedentemente salvati in un file dati per la cattura dei pacchetti, conosciuto come savefile è stato scambiato (ne è stato fatto lo swap)

Sintassi

#include  <pcap.h>

int pcap_is_swapped(pcap_t *p);

Descrizione

La funzione pacp_is_swapped restituisce 1 se il corrente savefile usa un differente ordine dei byte rispetto al corrente sistema. Essa può essere chiamata dopo aver invocato con successo la funzione pcap_open_offline e prima di ogni chiamata alla funzione pcap_close.

Parametri

p punta ad un packet capture descriptor restituito da pcap_open_offline

Valori di ritorno

1 Se l’ordine dei byte del savefile è differente rispetto al sistema corrente.

0 Se l’ordine dei byte del savefile è lo stesso del sistema corrente.

Informazioni correlate

pcap_close subroutine, pcap_open_offline subroutine.

 

3.13-pcap_lookupdev subroutine

Scopo

Ottenere il nome dell’interfaccia di rete presente sul sistema (ad esempio eth0, eth1, ecc.)

Sintassi

#include <pcap.h>

char *pcap_lookupdev(char *errbuf);

Descrizione

pcap_lookupdev resituisce un network device pronto per l'uso con pcap_open_live e pcap_lookupnet. Se nessuna interfaccia è stata trovata oppure nessuna è configurata per essere up, Null è restituito. Nel caso di più network device attaccate al sistema, pcap_lookupdev resituisce la prima scheda di rete che trova up, tranne però il loopback (che è sempre ignorato).

Parametri

errbuf

Testo dell'errore ed è solo settato quando pcap_lookupdev fallisce.

 

Valori di ritorno

In caso di successo pcap_lookupdev restituisce un puntatore al nome della network device attacata al sistema. Se pcap_lookupdev non ha successol, Null è restituito, e il testo indicante l'errore specifico è scritto in errbuf.

Informazioni correlate

pcap_geterr subroutine, pcap_lookupnet subroutine, pcap_open_live subroutine, pcap_perror subroutine.

 

3.14-pcap_lookupnet subroutine

Scopo

Restituisce l'indirizzo di rete e la subnet mask di una device di rete.

Sintassi

#include <pcap.h>
int pcap_lookupnet(char *device, bpf_u_int32 *netp, bpf_u_int32 *maskp, char *errbuf);

Descrizione

Si usi la subroutine pcap_lookupnet per determinare l'indirizzo di rete e la subnet mask per la device di rete, device.

Parametri

device

Specifica il nome della device di rete da usare per il lookup della rete, per esempio en0.

errbuf

Restituisce il messaggio di errore ed è settato solamente quando pcap_lookupnet fallisce.

maskp

Assume il valore della subnet mask associato a device.

netp

Assume il valore dell'indirizzo di rete di device.

Valori di ritorno

Dopo un'esecuzione riuscita, pcap_lookupnet restituisce 0. Se pcap_lookupnet fallisce, viene restituito -1, ed errbuf è riempito con un appropriato messaggio di errore.

Informazioni correlate

pcap_compile subroutine, pcap_geterr subroutine, pcap_lookupdev subroutine, pcap_perror subroutine.

 

3.15-pcap_loop subroutine

Scopo

Collezionare e processare pacchetti.

Sintassi

#include <pcap.h>
int pcap_loop(pcap_t *p, int cnt, pcap_handler callback, u_char *user);

Descrizione

pcap_loop legge e processa pacchetti. Questa subroutine può essere chiamata per leggere e processare pacchetti che erano stati precedentemente memorizzarti in "saved packet capture data file"(file speciali in cui vengono memorizzati i pacchetti catturati offline), conosciuto come savefile. La subroutine può anche leggere e processare pacchetti che sono stati catturati "live".

Questa subroutine è simile a pcap_dispatch. Differiscono per il fatto che pcap_loop continua a leggere pacchetti finchè cnt pacchetti sono stati processati, EOF è raggiunto (nel caso di lettura offline), o si verifica un errore. Non deve terminare quando il read timeout occorre per la lettura live. Specificando, cioè, un non-zero read timeout in pcap_open_live e poi chiamando pcap_loop permette la ricezione e il processamento di ogni pacchetto che arriva quando il timeout scade.

Nota che il terzo parametero, callback, is di tipo pcap_handler. Questo è un puntatore ad una subroutine fornita dall'utente con tre parametri. Definisci questa funzione come segue:

void user_routine(u_char *user, struct pcap_pkthdr *phrd, u_char *pdata)

Il parametro, user, sarà l'argomento utente che è stato passato in pcap_dispatch o pcap_loop. Il parametro phdr, è un puntatore alla struttura pcap_pkthdr, che precede ogni pacchetto in savefile. Il parametro, pdata, punta al pacchetto vero e proprio. Questo permette all'utente di definire il proprio gestore dei pacchetti filtrati.

Parametri

callback

Punta ad una routine definita dall'utente che sarà invocata per ogni pacchetto letto.L'utente è responsabile di fornire un puntatore valido, risultati imprevedibili possono verificarsi se un puntatore non valido è fornito.

 

Nota: pcap_dump può anche essere specificata come parametro callback. Se così è, chiama prima pcap_dump_open per poi usare il puntatore alla struttura pcap_dumper_t restituito da pcap_dump_open come il parametro user di pcap_dispatch:

pcap_dumper_t *pd

pcap_t * p;
int rc = 0;
pd = pcap_dump_open(p, "/tmp/savefile");
rc = pcap_dispatch(p, 0 , pcap_dump, (u_char *) pd);

cnt

Specifica il massimo numero di pacchetti da processare. Un valore negativo causa a pcap_loop di ciclare per sempre, o finchè EOF è raggiunta oppure al verificarsi di un errore. Un cnt 0 processa tutti i pacchetti finchè si verifica un errore o si raggiunge EOF.

p

Punta ad un packet capture descriptor restituito da pcap_open_offline o da pcap_open_live.

user

specifica il primo argomento da passare alla routine callback.

Valori di ritorno

In caso di successo pcap_loop restituisce 0. 0 è anche resituito se EOF è stato raggiunto in un savefile. pcap_loop restituisce -1 in caso di insuccesso. In questo caso pcap_geterr o pcap_perror possono essere usate per avere il testo dell'errore.

Informazioni correlate

pcap_dispatch subroutine, pcap_dump subroutine, pcap_dump_close subroutine, pcap_dump_open subroutine, pcap_geterr subroutine, pcap_open_live subroutine, pcap_open_offline subroutine, pcap_perror subroutine.  

 

3.16-pcap_major_version subroutine

Scopo

Ottiene il numero di versione principale del formato del pacchetto catturato ed è usato per scrivere nel savefile precedentemente salvato.

Sintassi

#include <pcap.h>

int pcap_major_version(pcap_t *p);

Descrizione

La funzione pcap_major_version ritorna il numero della versione principale del formato dei pacchetti catturati ed è usato per scrivere nel savefile. Se non c’è nessun savefile aperto viene restituito 0. Questa funzione deve essere invocata solo dopo aver chiamato con successo pcap_open_offline  e prima di aver chiamato pcap_close.

Parametri

p punta ad un packet capture descriptor restituito da pcap_open_offline.

Valori di ritorno

Il numero di versione principale del formato dei pacchetti catturati usato per scrivere nel savefile.

Informazioni correlate

pcap_close subroutine, pcap_open_offline subroutine.

 

3.17-pcap_minor_version subroutine

Scopo

Ottiene il numero di versione minore del formato del pacchetto catturato ed è usato per scrivere nel savefile precedentemente salvato.

Sintassi

#include <pcap.h>

int pcap_minor_version(pcap_t *p);

Descrizione

La funzione pcap_minor_version ritorna il numero della versione principale del formato dei pacchetti catturati ed è usato per scrivere nel savefile. Se non c’è nessun savefile aperto viene restituito 0. Questa funzione deve essere invocata solo dopo aver chiamato con successo pcap_open_offline  e prima di aver chiamato pcap_close.

Parametri

p punta ad un packet capture descriptor restituito da pcap_open_offline.

Valori di ritorno

Il numero di versione minore del formato dei pacchetti catturati usato per scrivere nel savefile

Informazioni correlate

pcap_close subroutine, pcap_open_offline subroutine.  

 

3.18-pcap_next subroutine

Scopo

Ottenere il prossimo pacchetto dalla device di cattura dei pacchetti.

Sintassi

#include <pcap.h>
u_char *pcap_next(pcap_t *p, struct pcap_pkthdr *h);

Descrizione

La subroutine pcap_next restituisce un puntatore di tipo u_char al prossimo pacchetto dalla device di cattura dei pacchetti. La device di cattura può essere una device di rete o un savefile che contengono dati di pacchetti catturati. I dati hanno lo stesso formato di tcpdump.

Parametri

h

Punta all'header del pacchetto restituito. Viene riempito dopo il ritorno dalla routine.

p

Punta al packet capture descriptor restituito da pcap_open_live o da pcap_open_offline.

Valori di ritorno

Se eseguita con successo, pcap_next restituisce un puntatore ad un buffer che contiene il prossimo pacchetto e avvalora h, che punta all'header del pacchetto restituito. Se pcap_next fallisce, viene restituito Null .

Informazioni correlate

pcap_dispatch subroutine, pcap_dump subroutine, pcap_dump_close subroutine, pcap_dump_open subroutine, pcap_loop subroutine, pcap_open_live subroutine, pcap_open_offline subroutine.

3.19-pcap_open_live subroutine

Scopo

Aprire un’interfaccia di rete per la cattura dei pacchetti.

Sintassi

#include <pcap.h>
pcap_t *pcap_open_live(char *device, int snaplen, int promisc, int to_ms, char *ebuf);

Descrizione

pcap_open_live apre un’interfaccia di rete per la cattura dei pacchetti. Il termine "live" sta ad indicare che l'interfaccia di rete è "aperta" in opposizione ad un file che contiene i pacchetti di dati. Questa funzione deve essere chiamata prima che si verifichi ogni cattura di pacchetti. Infatti, tutte le altre routine che lavorano per la cattura di pacchetti richiedono il packet capture descriptor che è creato ed inizializzato con questa funzione. Vedere pcap_open_offline subroutine per maggiori dettagli sull'apertura di file precedentemente salvati contenenti pacchetti dati.

Parametri

device

Stringa che contiene il nome della device, per esempio eth0.

ebuf

Testo dell’errore nel caso la funzione fallisca.

promisc

Specifica che l’interfaccia è da mettere in modalità promiscua. Il valore 1 (True) setta il promiscuous mode on. Se questo parametro è 0 (False), la periferica resta inalterata.

snaplen

Specifica il massimo numero di byte da catturare per pacchetto.

to_ms

Specifica il read timeout in millisecondi.

Valori di ritorno

Puntatore ad un packet capture descriptor (in caso di successo), Null altrimenti (in questo caso lo specifico errore è scritto nel buffer ebuf).

Informazioni correlate

pcap_close subroutine, pcap_compile subroutine, pcap_datalink subroutine, pcap_dispatch subroutine, pcap_dump subroutine, pcap_dump_open subroutine, pcap_geterr subroutine, pcap_loop subroutine, pcap_open_offline subroutine, pcap_perror subroutine, pcap_setfilter subroutine, pcap_snapshot subroutine, pcap_stats subroutine.

 

3.20-pcap_open_offline subroutine

Scopo

Apre un file salvato precedentemente contenente i dati dei pacchetti catturati.

Sintassi

#include <pcap.h>
pcap_t *pcap_open_offline(char *fname, char *ebuf);

Descrizione

La subroutine pcap_open_offline apre un file, savefile, salvato precedentemente contenente i dati dei pacchetti catturati. Questa subroutine crea e inizializza il descrittore di un pacchetto catturato (pcap) e apre il savefile specificato contenente i dati da leggere.

La subroutine deve essere chiamata prima di ogni altra routine associata che richiede il descrittore del pacchetto catturato da un’elaborazione offline. Vedere la subroutine pcap_open_live per altri dettagli sui pacchetti catturati on live.

Nota: Il formato del savefile deve essere lo stesso di quello usato dal comando tcpdump.

Parametri

ebuf

Restituisce un messaggio di errore ed è settato solo quando la subroutine pcap_open_offline fallisce.

fname

Specifica il nome del file da aprire. Un  “-“ passato come parametro fname indica che viene usato lo standard in al posto del file da aprire.

Valori di ritorno

Se l’operazione viene completata con successo, la subroutine pcap_open_offline restituisce un puntatore al nuovo descrittore del pacchetto catturato creato. Se la subroutine pcap_open_offline ha un insuccesso, viene restituito Null, e un messaggio che indica l’errore viene scritto nel buffer ebuf.

Informazioni correlate

pcap_close subroutine, pcap_dispatch subroutine, pcap_file subroutine, pcap_fileno subroutine, pcap_geterr subroutine, pcap_is_swapped subroutine, pcap_loop subroutine, pcap_major_version subroutine, pcap_minor_version subroutine, pcap_next subroutine, pcap_open_live subroutine.  

 

3.21-pcap_perror subroutine

Scopo

Punta alla stringa prefisso passato in input, seguita dal più recente testo di errore.

Sintassi

#include <pcap.h>

void pcap_perror (pcap_t *p, char *prefix);

Descrizione

La funzione pcap_perror stampa il testo dell’ultimo errore della libreria pcap sullo standard error (stderr), preceduto da prefix, cioè la stringa passatagli in input. Se non ci sono precedenti errori è stampata solo la stringa prefix.

Parametri

p punta ad un packet capture descriptor restituito da pcap_open_live o da pcap_open_offline.

prefix Specifica la stringa da stampare prima del messaggio di errore conservato.

Informazioni correlate

pcap_geterr subroutine, pcap_open_live subroutine, pcap_open_offline subroutine, pcap_strerror subroutine.

3.22-pcap_setfilter subroutine

Scopo  

Carica un programma filtro in un packet capture device.

 

Sintassi

#include <pcap.h>
int pcap_setfilter(pcap_t *p, struct bpf_program *fp);

Descrizione  

pcap_setfilter è usate per caricare un programma filtro in un'interfaccia per la cattura dei pacchetti. Causa l'inizio della cattura dei pacchetti definiti dal filtro.

 

Parametri  

fp

Punta ad un programma filtro restituito da pcap_compile.

p

punta ad un packet capture descriptor restituito da pcap_open_offline o da pcap_open_live

 

Valori di ritorno  

pcap_setfilter restituisce 0 in caso di successo, -1 altrimenti (qui pcap_geterr può essere usato per avere il testo dell'errore e pcap_perror può essere usata per visualizzare il testo).

 

Informazioni correlate

 

pcap_compile subroutine, pcap_geterr subroutine, pcap_open_live subroutine, pcap_open_offline subroutine, pcap_perror subroutine.

 

3.23-pcap_snapshot subroutine

Scopo

Ottiene il numero di byte che dovranno essere salvati per ogni pacchetto catturato.

Sintassi

#include <pcap.h>

int pcap_snapshot( pcap_t *p); 

Descrizione

La funzione pcap_snapshot ritorna la lunghezza “snapshot” che è il numero di byte da salvare per ogni pacchetto catturato.

  

          Nota: Questa funzione potrà essere chiamata solo dopo aver chiamato con successo

                    pcap_open_live o pcap_open_offline e prima di invocare pcap_close

Parametri

p punta ad un packet capture descriptor restituito da pcap_open_live o pcap_open_offline.

Valori di ritorno

La funzione pcapsnap_shot ritorna la lunghezza snapshot

Informazioni Correlate

pcap_close subroutine, pcap_open_live subroutine, pcap open offline subroutine.

 

3.24-pcap_stats subroutine

Scopo  

Ottiene le statistiche dei pacchetti catturati.

 

Sintassi

#include <pcap.h>
int pcap_stats(pcap_t *p, struct pcap_stat *ps);

Descrizione  

La subroutine pcap_stats riempie una struttura pcap_stat. I valori rappresentano le statistiche dei pacchetti dall’inizio dell’esecuzione fino al momento della chiamata. Le statistiche per i pacchetti che sono stati ricevuti del filtro ed i pacchetti che sono stati persi sono memorizzate all’interno della struttura pcap_stat. Questa subroutine è usata quando viene aperto un dispositivo che cattura pacchetti dalla subroutine pcap_open_live.

 

Parametri  

p

Punta al descrittore del pacchetto catturato e viene restituito dalla subroutine pcap_open_live.

ps

Punta ad una struttura pcap_stat riempita con le statistiche dei pacchetti catturati.

 

Valori di ritorno  

Se l’operazione viene completata con successo, la subroutine pcap_stats riempie ps e restituisce 0. Se la subroutine pcap_stats ha un insuccesso, viene restituito -1. In questo caso, l’errore può essere ottenuto dalla subroutine pcap_perror o pcap_geterr.

 

Informazioni correlate  

pcap_open_live subroutine.  

 

3.25-pcap_strerror subroutine

Scopo

Ottenere il messaggio di errore indicizzato da error.

Sintassi

#include <pcap.h>
char *pcap_strerror(int error);

Descrizione

Cerca il messaggio di errore indicizzato da error. I possibili valori di error corrispondono ai valori della variabile globale errno. Questa funzione è equivalente alla subroutine strerror.

Parametri

error

Specifica la chiave da usare per ottenere il messaggio di errore corrispondente. Il messaggio di errore è preso dal sys_errlist del sistema.

Valori di ritorno

pcap_strerror restituisce il messaggio di errore appropriato dalla lista di errori del sistema.

Informazioni correlate

pcap_geterr subroutine, pcap_perror subroutine.