2010-10-02 28 views
0

J'essaye de construire la structure de données appropriée en utilisant un en-tête de pseudo-tcp, l'en-tête de tcp, et les données de tcp à envoyer à une fonction de somme de vérification à vérifier. Je n'arrive pas à comprendre ce que je fais de mal dans mon code. Le code suivant est ma fonction qui construit la structure de données et l'envoie ensuite à une autre fonction à vérifier.Comment créer un pseudo-en-tête TCP et des données connexes pour la vérification de la somme de contrôle dans C et libpcap?

void print_inner_ip_header(const u_char* pkt_data, struct ip_header* header) 
{ 
    switch(header->protocol) 
    { 
     case(ICMP): 
     { 
     print_icmp_header((struct icmp_header*)(pkt_data+ETHERNET_HEADER_SIZE+sizeof(struct ip_header))); 
     break; 
     } 
     case(TCP): 
     { 
     struct pseudo_tcp_header ps_tcp_header; 
     ps_tcp_header.source = header->source; 
     ps_tcp_header.protocol = 6; 
     ps_tcp_header.dest = header->dest; 
     ps_tcp_header.reserved = 0; 
     ps_tcp_header.tcp_size = htons(sizeof(struct tcp_header) + header->total_length - (header->length & 0x0F)*4); 

     int len = sizeof(struct pseudo_tcp_header) + ps_tcp_header.tcp_size; 
     u_short ps_tcp[len]; 

     memcpy(ps_tcp, &ps_tcp_header, sizeof(struct pseudo_tcp_header)); 
     memcpy(ps_tcp+sizeof(struct pseudo_tcp_header), (pkt_data+ETHERNET_HEADER_SIZE+sizeof(struct ip_header)), ps_tcp_header.tcp_size); 

     print_tcp_header(pkt_data, (struct tcp_header*)(pkt_data+ETHERNET_HEADER_SIZE+sizeof(struct ip_header)), ps_tcp, len); 
     break; 
     } 
     case(UDP): 
     { 
     print_udp_header((struct udp_header*)(pkt_data+ETHERNET_HEADER_SIZE+sizeof(struct ip_header))); 
     break; 
     } 
     default: 
     { 
     break; 
     } 
    } 
} 


void print_tcp_header(const u_char* pkt_data, const struct tcp_header* header, u_short* ps_tcp, int len) 
{ 
    u_short checksum = header->checksum; 
    int check = in_cksum((unsigned short *)ps_tcp, len); 
    char* checksum_str = "Correct"; 

    printf("CHECK VALUE: %d", check); 
    if(check) 
    { 
     checksum_str = "Incorrect"; 
    } 

    printf("\n\tTCP Header"); 
    printf("\n\t\tSource Port: %d", ntohs(header->source_port)); 
    printf("\n\t\tDestination Port: %d", ntohs(header->dest_port)); 
    printf("\n\t\tSequence Number: %u", ntohl(header->seq_num)); 
    printf("\n\t\tACK Number: %u", ntohl(header->ack_num)); 
    print_tcp_header_flags(header->flags); 
    printf("\n\t\tWindow Size: %d", ntohs(header->win_size)); 
    printf("\n\t\tChecksum: %s (%#x)\n", checksum_str, ntohs(checksum)); 
} 

Toute aide serait appréciée parce que j'ai passé de nombreuses heures à essayer de comprendre ce que je fais mal.

Merci,

modifier: voici mon pseudo en-tête

struct pseudo_tcp_header 
{ 
    struct in_addr source, dest; 
    u_char reserved; 
    u_char protocol; 
    u_short tcp_size; 
}; 
+0

Quel est le problème réel? Comment votre structure pseudo_tcp_header est-elle définie? Vous devrez prendre soin de le définir afin que votre compilateur n'ajoute pas de remplissage, en fonction de la façon dont vous l'utilisez. – nos

+0

J'ai ajouté dans mon pseudo en-tête. Comment puis-je m'assurer que mon compilateur n'ajoute pas de remplissage et à quoi va-t-il ajouter du rembourrage? – 2Real

+0

Vous imprimez sizeof (struct pseudo_tcp_header) et vérifiez que c'est la taille que vous attendez. – nos

Répondre

1

Le problème le plus fondamental, je peux voir est la combinaison de:

 u_short ps_tcp[len]; 

avec

 memcpy(ps_tcp+sizeof(struct pseudo_tcp_header), ...); 

Ajout à ps_tcp ajoutera des unités de sizeof(u_short), pas d'octets.

+0

devrais-je changer ça en u_char alors? – 2Real