2010-02-21 6 views
0

je le code suivantdonnées plus en paquet de charge utile

int ParseData (unsigned char * paquet, int len) { struct ethhdr * ethernet_header; struct iphdr * ip_header; struct tcphdr * tcp_header; unsigned char * data; int data_len;

/* Check if any data is there */ 

    if(len > (sizeof(struct ethhdr) + sizeof(struct iphdr) + sizeof(struct tcphdr))) 
    { 

      ip_header = (struct iphdr*)(packet + sizeof(struct ethhdr)); 


      data = (packet + sizeof(struct ethhdr) + ip_header->ihl*4 + sizeof(struct tcphdr)); 
      data_len = ntohs(ip_header->tot_len) - ip_header->ihl*4 - sizeof(struct tcphdr); 

      if(data_len) 
      { 
        printf("Data Len : %d\n", data_len); 
        PrintData("Data : ", data, data_len); 
        printf("\n\n"); 
        return 1; 
      } 
      else 
      { 
        printf("No Data in packet\n"); 
        return 0; 
      } 
    } 

}

Je suis en train d'imprimer en ASCII la charge utile et avec une fonction simple comme celui-ci

PrintData (char * mesg, unsigned char * p, int len) { printf (mesg);

while(len--) 
    { 
      if(isprint(*p)) 
        printf("%c", *p); 
      else 
        printf("."); 
      p++; 
    } 

}

Le code semble bon, compilez aucun problème/avertissement. Le problème est que le premier caractère de charge utile n'est pas en cours d'impression à la position 0, mais à 12 octets plus tard.

Je pensais que tous les "lens" octets sont les données exactes que j'ai à imprimer.

Mon point de données à data = (paquet + taille de (structure ethhdr) + ip_header-> ihl * 4 + sizeof (struct tcphdr)); Cependant, les données [0] ne sont pas imprimables. Quel est le problème? Est-ce que je manque quelque chose? Dois-je vérifier la partie des options TCP peut-être?

Merci

Répondre

0

C'est vrai, en ajoutant le sizeof (struct tcphdr) ne va que vous avez passé l'en-tête, pas les options. Pour accéder aux données réelles, vous devez utiliser le champ 'offset' de l'en-tête TCP. Le décalage est calculé à partir du début de l'en-tête TCP et se trouve dans des unités de 4 octets, par ex. si le décalage est de 8 alors l'en-tête + longueur des options est 32.

+0

En d'autres termes au lieu de sizeof (struct tcphdr) Je dois mettre le tcp_header-> doff * 4 – cateof

+0

Oui, exactement à droite. –

Questions connexes