2010-03-16 6 views
5

Devo fare uno sniffer come compito per il corso di sicurezza. Sto usando C e la libreria pcap. Ho fatto funzionare tutto bene (da quando ho ricevuto un codice da internet e l'ho cambiato). Ma ho alcune domande sul codice.Decomposizione di un'intestazione IP

u_int ip_len = (ih->ver_ihl & 0xf) * 4; 

ih è di tipo ip_header, e la sua punta attualmente l'intestazione a IP nel pacchetto.
ver_ihl fornisce la versione dell'IP.
Io non riesco a capire che cosa è: & 0xf) * 4;

+0

+1 per essere onesto e completo :) –

risposta

3

& è il bit a bit e l'operatore, in questo caso si è ANDing ver_ihl con 0xf, che ha l'effetto di cancellare tutti i bit diversi dal minimo signifcant 4

0xFF & 0x0f = 0x0f

ver_ihl è definito come primi 4 bit = versione + 4 = secondo Internet lunghezza dell'intestazione. L'operazione e rimuove i dati della versione lasciando da soli i dati di lunghezza. La lunghezza è registrata come conteggio di parole a 32 bit in modo che il * 4 giri ip_len nel conteggio di byte nell'intestazione

In risposta al tuo commento:

bit e combina i bit corrispondenti nei operandi. Quando tu e qualsiasi cosa con 0 diventa 0 e qualsiasi cosa con 1 rimane uguale.

0xf = 0x0f = binario 0000 1111

Quindi, quando si e 0x0F con qualsiasi cosa i primi 4 bit sono impostati a 0 (come siete AND loro contro 0) e gli ultimi 4 bit rimangono come in altro operando (come stai andando contro 1). Questa è una tecnica comune chiamata bit masking.

http://en.wikipedia.org/wiki/Bitwise_operation#AND

+0

ho avuto l'idea (ver_ihl contiene la versione (4 bit) + lunghezza intestazione Internet (4 bit)) ma non ho ancora ottenuto come questa operazione sta rimuovendo i dati della versione . quando stai usando 0xf vuol dire che il tuo anding solo i primi 4 bit? – scatman

0

Il campo ver_ihl contiene due interi a 4 bit, confezionati come la bassa e alta nybble. La lunghezza è specificata come un numero di parole a 32 bit. Quindi, se si dispone di un telaio di IP versione 4, con 20 byte di intestazione, devi avere un valore di campo ver_ihl di 69. Poi devi avere questo:

01000101 
& 00001111 
    -------- 
    00000101 

Quindi, sì, il "& 0xf "maschera i 4 bit bassi.

1

Lettura da RFC 791 che definisce IPv4:

Una sintesi del contenuto dell'intestazione internet segue:

0     1     2     3 
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 
|Version| IHL |Type of Service|   Total Length   | 
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 

I primi 8 bit dell'intestazione IP sono una combinazione di versione e il campo IHL.

IHL: 4 bit

Internet Header Length è la lunghezza della testata internet in 32 parole bit, e quindi indica l'inizio dei dati. Si noti che il valore minimo per un'intestazione corretta è 5.

Ciò che il codice che si sta facendo, sta prendendo i primi 8 bit lì e tagliando la porzione IHL, quindi convertendola al numero di byte. L'AND bit a bit per 0xF isolerà il campo IHL e il moltiplicatore per 4 è lì perché ci sono 4 byte in una parola a 32 bit.