2010-11-29 7 views
2

J'utilise pcap pour capturer des paquets TCP pour lesquels je voudrais analyser la charge utile. Ma stratégie est la suivante:Comment analyser la charge utile de paquet TCP

  1. Obtenez l'en-tête Ethernet et vérifier si elle est de type ETHERTYPE_IP (paquet IP)
  2. Vérifiez si le paquet IP a protocole IPPROTO_TCP (paquet TCP)
  3. Vérifiez la taille de la charge utile > 0 (size = ntohs(ip_header->total_length - ip->header_length*4 - sizeof(struct tcp_header)).

  4. Parse charge utile (saisir l'URL hôte)

Je n'ai pas commencé l'analyse de la charge utile encore parce que je reçois des divergences. Ci-dessous est une impression de la charge utile de 10 paquets TCP capturés, en utilisant le filtre "host = www.google.com".

Numéro paquet: 3: TCP Packet: Source Port: 80 Dest Port: 58723 Aucune donnée dans le paquet

numéro de paquet: 4: TCP Packet: Source Port: 58723 Dest Port: 80 Aucune donnée dans paquet

numéro de paquet: 5: TCP Packet: Source Port: 58723 Dest Port: 80 Payload: GET/HTTP/1.1 Host: www.goo gle.com User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; fr-fr) AppleWebKit/533.19.4 (KHTML, comme Gecko) Version/5.0.3 Safari/533.19.4 Accepter: application/xml, application/xhtml + xml, texte/html; q = 0.9, text/plain; q = 0.8, image/png, /; q = 0.5 Accepter-Encoding: gzip, dégonfler Cookie: THICNT = 25; SID = DQAAAKIAAAB2ktMrEftADifGm05WkZmlHQsiy1Z2v- Connection: keep-alive

numéro de paquet: 6: TCP Packet: Source Port: 80 Dest Port: 58723 Aucune donnée dans le paquet

numéro de paquet: 7: TCP Packet : Source Port: 80 Dest Port: 58723 Charge utile: \ 272 \ 243 \ 255 \ 375 \ 375} \ 336H \ 221 \ 227 \ 206 \ 312 ~ \ 322 \ 317N \ 236 \ 255A \ 343 # \ 226 \ 370 ֤ \ 245 [\ 327` \ 306 ը nE \ 263 \ 204 \ 313 \ 356 \ 3268) p \ 344 \ 301_Y \ 255 \ 267 \ 240 \ 222x \ 364

numéro de paquet: 8: TCP Packet: Source Port: 58723 Port dest: 80 Aucune donnée dans le paquet

numéro de paquet: 9: paquet TCP: Source Port: 80 Dest Port: 58723 Payload: HTTP/1.1 200 OK Date: Lun, 29 Nov 2010 10:11:36 GMT Expire: -1 Cache-Control: privé, max-age = 0 Type de contenu: text/html; charset = UTF-8 Content-Encoding: gzip Serveur: gws Longueur du contenu: 8806 Protection X-XSS: 1; mode = block \ 213

Pourquoi y a-t-il une différence entre les charges utiles et les ports? Idéalement, je voudrais seulement analyser les paquets comme le paquet 5. Comment ignorer les paquets comme 7 et 9?

+0

La partie du paquet sur laquelle vous voulez filtrer n'est pas claire. J'assomme son port source ou destination. – sashang

+0

Je voudrais saisir l'URL de l'hôte. J'ai trouvé qu'en filtrant les paquets avec le port de destination 80, je réussis à "éliminer" les indésirables, mais que se passe-t-il quand quelqu'un accède à une URL sur un port non standard? – David

+0

Par exemple, les données de chiffrement ssh et ssl. Ces paquets ressembleraient à ceux que vous ne voulez pas. FWIW une quantité importante de trafic peut être comme ça. Utilisez une expression régulière (regex.h) pour sélectionner les paquets - regcomp, regexec, etc. Recherchez les paquets avec des blocs de caractères lisibles. –

Répondre

6

Seulement en analysant le contenu. Rien dans l'en-tête IP ou TCP ce qui peut marquer les paquets "HTTP Request". Même "premier paquet de données en connexion" ne fonctionnerait pas car il y a des connexions persistantes. En outre, pour être complètement sûr de capturer tous les URI, vous devez réassembler le flux TCP et analyser la requête HTTP: l'URI peut être divisée en deux paquets ou plus.

2

Comme l'en-tête IP, l'en-tête TCP est également de longueur variable. Vous ne prenez pas cela en compte. Plutôt que de soustraire aveuglément sizeof(struct tcp_header)) de la taille totale des paquets, vous devez localiser l'en-tête TCP dans les données IP, puis utiliser son champ de longueur (qui doit être multiplié par 4, tout comme le champ Longueur d'en-tête IP) pour savoir où la charge utile de données réelles est localisée.

2

Votre calcul de la taille est incorrecte - vous ne pouvez pas faire la soustraction dans le réseau hôte-commande, vous devez convertir chaque champ pour accueillir un octet d'ordre premier:

size = ntohs(ip_header->total_length) - ntohs(ip->header_length) * 4 - sizeof(struct tcp_header)) 

Cependant, comme Remy Lebeau des points out, vous devez examiner le champ offset dans l'en-tête TCP pour savoir où commence la charge utile.

La différence entre 5 paquet et le paquet 7 est que le premier va de le client, - le serveur, celui-ci est une réponse du serveur au client. C'est pourquoi les ports sont inversés - les adresses source et destination seront également commutées.

Si vous voulez uniquement regarder les paquets provenant du client, vérifiez que l'adresse source est égale à l'adresse du client.

+0

merci, j'ai changé cela dans mon code. – David

Questions connexes