analyser IP et TCP en-tête (particulièrement fréquent en-tête tcp options)de paquets capturés par libpcap
Je veux utiliser libpcap pour la capture de paquets IP, et la je veux analyser les en-têtes IP et tcp en-tête.
`
il y a des en-têtes IP et TCP en-tête de structures en <netinet/ip.h>
et <netinet/tcp.h>
L'en-tête IP est relativement plus facile à analyser, mais pour l'en-tête TCP,car il y a des options tcp,
les options communes sont MSS, SAC(sélective accusé de réception), l'horodatage, la fenêtre de mise à l'échelle et NOP.
Je veux avoir une fonction parse_pkt():
struct tcphdr tcp_hdr;
struct ip ip_hdr;
parse_pkt(u_char *pcap_packet, struct ip* p_ip, struct tcp* p_tcp);
ainsi, après l'appel de la fonction, si je veux savoir l'adresse ip source, le numéro de séquence, et SMS,
scr_ip = ip_hdr.src_ip
seq = tcp_hdr.seq
mss = tcp_hdr.mss
sont là de toute autre source de codes/extraits de ce qui peut répondre à mes besoins?
merci!
OriginalL'auteur user1944267 | 2013-05-13
Vous devez vous connecter pour publier un commentaire.
(Premier exemple ci-dessous), Voici quelque chose que j'ai dans les œuvres (en C++11). C'est pour les paquets UDP, mais vous pouvez l'adapter pour les paquets TCP en ajoutant liés à la structure et
Net::load()
modèle comme celui ci-dessous.(Deuxième exemple ci-dessous) Vous ne spécifiez pas une langue cible dans la question, mais si vous êtes à la recherche pour le C, alors vous pourriez utiliser
#pragma pack
sur les structures puis coulé le pointeur+offset comme un pointeur vers une struct et ensuite appeler ah/ntohl sur les champs appropriés. Cela est probablement la solution la plus rapide, mais elle repose sur#pragma pack
, qui n'est pas standard.C++11 style
net.h:
net.cpp:
Code Client dans la capture des paquets gestionnaire de:
alternative (type C):
(Désolé pour les éventuelles erreurs. J'ai tapé ce à partir de la mémoire, et ne pas essayer de compiler ou exécuter--mais je pense que vous comprendrez l'idée de base):
net.h:
code client dans le gestionnaire de paquets:
En-Tête TCP Notes
selon
netinet/tcp.h
, l'en-tête TCP est à peu près de:Charge de cette structure en mémoire en utilisant la méthode que vous préférez et n'oubliez pas de fixer l'ordre des octets (ah/ntohl) pour le multi-byte integer types comme ci-dessus.
Les options TCP, ce qui ne peut pas être chargé dans une structure de ce genre. Voir la section sur les options TCP à ce lien. Pour le SMS, vous voulez analyser chaque option jusqu'à ce que vous trouver l'option avec l'aimable == 2. Bâtiment sur le C exemple ci-dessus:
Ce n'est pas aussi bordélique que vous pourriez penser. Découvrez la section en bas de ma réponse.
Je pense que vous avez fait une erreur,
++opt
fera +2 en fait.Pas d'erreur.
opt
est un pointeur.opt++
incrémente le pointeur etcontinue
commence la prochaine itération.si c'est un NOP, l'adresse doit ajouter 1, mais ++opt rendra ajouter 2 parce que
tcp_option_t
est de 2 octetsOriginalL'auteur