CRC trame UDP ( Prise de tête ... :( )

cs_Booster Messages postés 235 Date d'inscription mercredi 30 octobre 2002 Statut Membre Dernière intervention 6 octobre 2009 - 1 août 2007 à 20:36
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 - 7 août 2007 à 01:43
Bonjour à tous,

Alors voilà je fais de la redirection de trame. Le problème est que lorsque je change l'ip de destination du cou le CRC doit aussi changer cependant je n'arrive pas à le recalculer il me manque quelque chose donc voici les étapes que je réalise :

1) Capture de la trame :

  FF  FF  FF  FF  FF  FF  00  16    E6  5A  5F  94  08  00 45  00
  00  5C  60  E7  00  00  80  11    00  00  C0  A8  00  E9  C0  A8
  00  65  22  B9  22  B9  00  48    00  00  FF  FF  00  01  00  40
  EC  C3  00  00  00  00  0C  FF    00  00  00  00  00  34  0D  24
  34  7C  40  B8  18  FA  66  00    00  00  E4  6C  1D  DA  DD  00
  35  7C  00  00  00  00  01  00    00  00  FF  FF  FF  FF  FF  FF
  FF  FF  00  00  00  00  01  00    00  00

En rouge est le header IP (d'aprés ethereal)
En orange le CRC du header IP(d'aprés ethereal)
En bleu est le header UDP (Toujours d'aprés ethereal)
En vert le CRC du header UDP (Toujours d'aprés ethereal)

2) Fonction utilisé pour calculer le CRC:

unsigned short CRC(unsigned short *data, int taille)
{
    unsigned long checksum=0;
    while(taille>1)
        {
        checksum=checksum+*data++;
        taille=taille-sizeof(unsigned short);
        }

    if(taille)
        checksum=checksum+*(unsigned char*)data;

    checksum=(checksum>>16)+(checksum&0xffff);
    checksum=checksum+(checksum>>16);

    return (unsigned short)(~checksum);
}

Cette fonction est donné sur de nombreux site donc je ne doute pas de sont résultat ! (J'ai fait un simple copié collé)

3) Comment je calcul (C'est là ou doit être l'erreur :) )

Dans un premier temps je met les CRC à 0 comme indiqué par la RFC (Dans la trame données je les est mis à 0)
Puis ensuite j'appelle ma fonction comme ceci :
CRC(Trame + 14, 20)    //Trame + 14 pour avoir le header ip
                                        // 20 Parce que mon header est de 20
Et là la fonction me retourne un résultat qui n'est pas celui de ethereal :( ...

Ou est mon erreur ?

Merci d'avance et horriblement désolé pour les fautes d'orthographe ...

4 réponses

cs_Booster Messages postés 235 Date d'inscription mercredi 30 octobre 2002 Statut Membre Dernière intervention 6 octobre 2009
2 août 2007 à 18:37
Personne ne pourait me dire qu'est ce qu'il faut calculer et dans quel ordre ?

j'attend juste ça comme réponse aprés je me débrouille :( ?

Merci d'avance
0
cs_Booster Messages postés 235 Date d'inscription mercredi 30 octobre 2002 Statut Membre Dernière intervention 6 octobre 2009
6 août 2007 à 22:16
S'il vous plait à l'aide !!!

Je ne trouve pas :( ça fait plus de 4jours que je cherche sur google comment faire et j'ai beau trouver des milliards de site aucun n'explique réellement comment calculer le crc du header IP, beaucoup montre comment créer une trame puis utilise une fonction de winsock2.h pour calculer le checksum moi c'est à la main que je veux le faire ! personne n'a le détail de comment faire cela ? :(

Je remerci d'avance le courageux qui pourra me répondre !
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
7 août 2007 à 01:40
Salut,

y'a aucune fonction dans winsock qui permet de calculer une checksum,
donc les milliards de code que tu as trouvé utilisent forcement une
fonction du même genre que celle que tu utilises. apres pour savoir sur
quoi on calcule le checksum, suffit de regarder dans les rfc ip &
udp, non ?
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
7 août 2007 à 01:43
Salut,

au passage, la facon dont tu appeles CRC me parait bizarre (aucun
cast..), poste aussi le code ou tu déclares & rempli la variable
Trame.
0
Rejoignez-nous