Bonjour à tous.
Je suis débutant en programmation C. Le projet que je tente de réaliser actuellement nécessite un sniffer réseau. J'utilise donc libpcap pour récupérer les paquets, mais j'ai un léger probleme lors de la reception d'un paquet TCP/IP.
En fait, je souhaiterai récupérer les données encapsulées dans le paquet. Cependant, je ne comprends pas comment faire car il semblerait que TCP puisse ajouter des options facultatives à la fin de l'entête. Or, sans connaître la taille de cette dernière, comment puis-je accéder aux données qu'elle encapsule ?
Voici un bout de code (naïvement, j'utilise une arithmétique de pointeurs.) :
Ma structure tcp_bsd_hdr :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 void on_tcp_pkt(struct ethhdr* eth, struct iphdr* ip, const struct pcap_pkthdr* pkthdr, const u_char* packet){ /*Routine chargée d'analyser le paquet TCP*/ struct tcp_bsd_hdr* tcp = (struct tcp_bsd_hdr*)(packet + 14 + 4*(ip->ihl)); int siz = pkthdr->len - sizeof(struct ethhdr) - 4*(ip->ihl); if (siz > sizeof(struct tcp_bsd_hdr)){ printf("Le paquet contient une raw de taille : %d : %s \n",siz - sizeof(struct tcp_bsd_hdr), tcp + sizeof(struct tcp_bsd_hdr)); } else printf("Le paquet ne contient pas de raw\n"); return; }
Merci d'avance pour le temps que vous m'accorderez.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 struct tcp_bsd_hdr { u_short tcp_port_src; /* port source */ u_short tcp_port_dst; /* port de destination */ u_long tcp_seqnum; /* numero de sequence */ u_long tcp_aqunum; /* numero d'aquittement */ u_char tcp_res; /* decalage, reserve, hlen, ecn ? */ u_char tcp_flags; /* Flags : URG, ACK, PSH, RST, SYN, FIN */ u_short tcp_win; /* taille fenetre demandee */ u_short tcp_crc; /* Checksum */ u_short tcp_purg; /* pointeur donnees urgentes */ };
Cordialement, Sat.
Partager