PDA

Visualizza la versione completa : [C] Verificare contenuto di pacchetti TCP


danim79
20-01-2006, 19:58
Ciao a tutti ho un disperato bisogno di aiuto...devo modificare alcuni file in C che analizzano file tcpdump (di cattura del traffico), ovvero analizzano tutto il pacchetto IP. La modifica che devo fare io consiste nel vedere se il valore corrente di alcuni campi del pacchetto tipo IP destinazione corrispondono ad un dato valore. Ovviamente si ha a che fare con strutture: come si confronta una struct con una sequenza di bit?ovvero ad esempio confrontare se l'IP dest del pacchetto coincide con un dato indirizzo??

Grazie dell'attenzione!!!

alka
20-01-2006, 21:25
Ciao, usa titoli più significativi per le tue discussioni. :)

Questo l'ho corretto io... :ciauz:

ibykos
20-01-2006, 22:02
Le sequenze di bit si trattano con le funzioni mem***, per esempio potresti usare la memcmp, pucrhè tu sia in grado di rendere compatibile un campo di struct con una sequenza di bit.

la memcmp ha questa sintassi:



#include <string.h>

int * memcmp (const void * ptr1 , const void ptr2 *, size_t n_byte)

unomichisiada
21-01-2006, 02:10
Originariamente inviato da danim79
Ciao a tutti ho un disperato bisogno di aiuto...devo modificare alcuni file in C che analizzano file tcpdump (di cattura del traffico), ovvero analizzano tutto il pacchetto IP. La modifica che devo fare io consiste nel vedere se il valore corrente di alcuni campi del pacchetto tipo IP destinazione corrispondono ad un dato valore. Ovviamente si ha a che fare con strutture: come si confronta una struct con una sequenza di bit?ovvero ad esempio confrontare se l'IP dest del pacchetto coincide con un dato indirizzo??

Grazie dell'attenzione!!!
Cioè tu hai un asequenza di bit in cuio sai che ci sono le informazioni su indirizzi porte eccetera e vuoi accedervi?
Beh allora se sai esattamente quanti byte occupa ognuna di queste info puoi scrivere una scruct e poi fare un cast.Mi speigo con un esempio semplice.

Supponi di avere un buffer di memoria di 80 (32+ 32 + 8 + 8) bit che sai essere così composto: i primi 32 bit indirizzo di destinazione, i successivi 32 indirizzo sorgente, i possimi 8 bit porta destinazione,gli ultimi 8 porta sorgente. Allora definisci una struttura di questo tipo



typedef struct myheader
{
int destAddr;
int sourceAddr;
char destPort;
char sourcePort;
}MyHeader;

Supposto che il buffer di memoria sia puntato dalla variabile puntatore a carattere char* buffer, (un puntatore a caratetre è un puntatore a byte, granularità massima), puoi castare il puntatore così:



MyHeader* myHeaderPtr = (MyHeader*)buffer

ed accedere ai singoli campi della struttura normalmente.In altre parole ora se ti serve il valore di porta della sorgente non hai che da fare : myHeaderPtr->sourcePort per ottenerlo.

Il tutto presuppone che tu sappia con esattezza la dimension in byte di ogni campo nella sequenza di bit e la dimnsione esatta di ogni tipo di dato sulla tua piattaforma, ma per quello c'è la sizeof.
Spero di esserti stato utile,ciao

danim79
21-01-2006, 15:57
Veramente la definizione di struttura del pacchetto e di tutti i suoi campi già ce l'ho:il programma dovrebbe vedere se il pacchetto corrente ha valori dei campi particolari, ad esempio se l'IP destinazione è 192.168.1.1 ed è un pacchetto TCP o IP... si dovrebbe fare una struttura switch-case in cui se la variabile ad es IP dest assume quel valore da un messaggio di uscita op se il campo protocol corrisponde a TCP ecc... Se definissi con define 192.168.1.1 in modo che se la variabile IPdest= a quel valore dà il messaggio??Ma come definisco quel valore in C?

oregon
21-01-2006, 16:08
Ma scusa ... se hai la struttura del pacchetto e dei campi (e hai anche il programma) non capisco quale sia la difficolta' ... Si trattera' di fare qualche if ...

Mostra il codice in cui definisci la struttura e il codice in cui la variabile di quel tipo assume i valori che vuoi controllare ...

danim79
21-01-2006, 16:24
Vi scrivo le definizioni di header IP e pacchetto:

typedef struct _IPHdr
{
u_int8_t ip_verhl; /* version & header length */
u_int8_t ip_tos; /* type of service */
u_int16_t ip_len; /* datagram length */
u_int16_t ip_id; /* identification */
u_int16_t ip_off; /* fragment offset */
u_int8_t ip_ttl; /* time to live field */
u_int8_t ip_proto; /* datagram protocol */
u_int16_t ip_csum; /* checksum */
struct in_addr ip_src; /* source IP */
struct in_addr ip_dst; /* dest IP */
} IPHdr;




typedef struct _Packet
{
struct pcap_pkthdr *pkth; /* BPF data */
u_int8_t *pkt; /* base pointer to the raw packet data */

Fddi_hdr *fddihdr; /* FDDI support headers */
Fddi_llc_saps *fddisaps;
Fddi_llc_sna *fddisna;
Fddi_llc_iparp *fddiiparp;
Fddi_llc_other *fddiother;

Trh_hdr *trh; /* Token Ring support headers */
Trh_llc *trhllc;
Trh_mr *trhmr;

SLLHdr *sllh; /* Linux cooked sockets header */

PflogHdr *pfh; /* OpenBSD pflog interface header */

EtherHdr *eh; /* standard TCP/IP/Ethernet/ARP headers */
VlanTagHdr *vh;
EthLlc *ehllc;
EthLlcOther *ehllcother;

WifiHdr *wifih; /* wireless LAN header */

EtherARP *ah;

EtherEapol *eplh; /* 802.1x EAPOL header */
EAPHdr *eaph;
u_int8_t *eaptype;
EapolKey *eapolk;

IPHdr *iph, *orig_iph; /* and orig. headers for ICMP_*_UNREACH family */
u_int32_t ip_options_len;
u_int8_t *ip_options_data;

TCPHdr *tcph, *orig_tcph;
u_int32_t tcp_options_len;
u_int8_t *tcp_options_data;

UDPHdr *udph, *orig_udph;
ICMPHdr *icmph, *orig_icmph;

echoext *ext; /* ICMP echo extension struct */

u_int8_t *data; /* packet payload pointer */
u_int16_t dsize; /* packet payload size */
u_int16_t alt_dsize; /* the dsize of a packet before munging
(used for log)*/

u_int8_t frag_flag; /* flag to indicate a fragmented packet */
u_int16_t frag_offset; /* fragment offset number */
u_int8_t mf; /* more fragments flag */
u_int8_t df; /* don't fragment flag */
u_int8_t rf; /* IP reserved bit */

u_int16_t sp; /* source port (TCP/UDP) */
u_int16_t dp; /* dest port (TCP/UDP) */
u_int16_t orig_sp; /* source port (TCP/UDP) of original datagram */
u_int16_t orig_dp; /* dest port (TCP/UDP) of original datagram */
u_int32_t caplen;

u_int8_t uri_count; /* number of URIs in this packet */

void *ssnptr; /* for tcp session tracking info... */
void *cloned_ssnptr;
void *ftrptr;
void *flow; /* for flow info */
void *streamptr; /* for tcp pkt dump */

Options ip_options[40]; /* ip options decode structure */
u_int32_t ip_option_count; /* number of options in this packet */
u_char ip_lastopt_bad; /* flag to indicate that option decoding was
halted due to a bad option */
Options tcp_options[TCP_OPTLENMAX]; /* tcp options decode struct */
u_int32_t tcp_option_count;
u_char tcp_lastopt_bad; /* flag to indicate that option decoding was
halted due to a bad option */

u_int8_t csum_flags; /* checksum flags */
u_int32_t packet_flags; /* special flags for the packet */
int preprocessors; /* flags for preprocessors to check */
} Packet;


Quello che devo fare è confrontare il valore corrente nel pacchetto e verificare se il destIP corrisponde ad un dato IP e se è un pacchetto TCP op se ha quel destIP ed è un pck ICMP, lo stesso se è UDP in tal caso ci sarà una variabile "label" che assume valore "attack".

unomichisiada
21-01-2006, 16:53
Originariamente inviato da oregon
Ma scusa ... se hai la struttura del pacchetto e dei campi (e hai anche il programma) non capisco quale sia la difficolta' ... Si trattera' di fare qualche if ...

Mostra il codice in cui definisci la struttura e il codice in cui la variabile di quel tipo assume i valori che vuoi controllare ...
A questo punto mi associo alle preplessità :master:
Posta codice e spiegati meglio perchè se devi solo fare degli if e/o uno switch non mi sembr aquesto gran problema

danim79
21-01-2006, 17:17
come allego il file?qui fa allegare solo immagini...ho provato a cambiare l'estansione ma nn va!

oregon
21-01-2006, 17:25
Perche' allegare tutto il file ?

A parte le strutture (che hai gia' inviato) puoi mostrare e commentare le poche linee vicine a dove ti serve il controllo ...

Dovrebbe essere qualcosa del tipo



if(p.iph->ip_proto == IPPROTO_TCP &&
p.iph->ip_dst.S_un.S_un_b.s_b1 == 192 &&
p.iph->ip_dst.S_un.S_un_b.s_b2 == 168 &&
p.iph->ip_dst.S_un.S_un_b.s_b3 == 1 &&
p.iph->ip_dst.S_un.S_un_b.s_b4 == 2)


ma potrebbe essere altro ...

Loading