Partage
  • Partager sur Facebook
  • Partager sur Twitter

Type de CheckSum CRC 32, CRC8 , CRC 64 dans un fichier binaire

    2 octobre 2007 à 0:12:39

    Bonsoir a tous ,


    Je vais faire trés simple pour permettre aux membres de cérner le probléme sur mon projet .


    Je dois calculer le Checksum d'un fichier binaire aprés l'avoir modifié , le checksum du fichier se trouve a la fin du fichier binaire :



    [IMG]http://www.espace4you.net/allimages/0883112217chkSum1.JPG[/IMG]

    Le prgramme que j'utilise lis le checksum sur l'offset 0x0000FED8
    J'utilise un programme pour calculer ce CheckSum dont voici les derniers CheckSum Calculer par ce programme pour mieux comprendre le type de CheckSum genérer :


    Ancien Checksum : BF 96 AF 63 79 B3 D4 52
    Aprés Calcul : 85 CA 8F 67 41 44 3F B7



    Ancien Checksum : BF 96 AF 63 79 B3 D4 52
    Aprés Calcul : F4 [COLOR="Red"]1B[/COLOR] 16 36 2A 67 37 E6



    Ancien Checksum : BF 96 AF 63 79 B3 D4 52
    Aprés Calcul : D0 [COLOR="Red"]80[/COLOR] 16 36 A9 66 37 E6



    On remarquera que sauf les 2 BYTES ont été changés a partir de la gauche
    Et les 2 BYTES de la droite : D0 80 et 66 le réste n'a pas changé !
    J'arrive pas a comprendre cet algorythm , j'utilise plusieurs sources d'algo CRC
    CRC32 , CRC 8, CRC 64 mais je souhaite comprendre l'algo utilisé pour commencer a créer un projet pour calculer un checksum de mon fichier binaire




    Merci pour vos conseils et suggéstions .



    Cordialement ,
    Fred .
    • Partager sur Facebook
    • Partager sur Twitter
      2 octobre 2007 à 0:21:07

      En fait, si je comprends bien, tu t'attendais a un changement des octets de droite, au lieu de ceux de gauche.

      Ce probleme n'a rien a voir avec le checksum, il a à voir avec un codage intra-processeur, appelé little endian ou big endian.

      la "logique" veut qu'on raisonne en big endian, c'est a dire que quand tu fais un int (4 octets) et que tu le mets a 1, son codage est :
      00 00 00 01

      Et bien cela n'est pas valable sur les processeurs intel : pour des raisons d'optimisation de calcul, les octets sont inversés. Ainsi : un int de 1 est codé ainsi :

      01 00 00 00
      (en fait tu lis les octets de droite a gauche)
      le nombre 0x2CA sera : CA 02 00 00
      le nombre 0x6ABC7B40 sera : 40 7B BC 6A

      Cela expliquerait peut etre ton probleme de checksum.
      Dans ton exemple, tu lis :
      BF 96 AF 63

      --> le nombre est donc 63AF96BF

      J'espere avoir pu te débloquer si ton probleme venait bien de la :)
      • Partager sur Facebook
      • Partager sur Twitter

      Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

        2 octobre 2007 à 0:37:01

        Bonsoir Fvirtman ,

        Merci pour ta réponse et l'intéret que tu portes a mon probléme , c'est trés sympa , ce que tu as éxpliqué c'est exactement ce que j'ai analyser quand le checksum est generér , actuellement je souhaite créer un programme qui lira a a partir de l'offSet 0x0000FED0 c'est la ou se trouve le checksum du fichier binaire , donc le programme lis le checksum sur cette offset ,ensuite si y'as modification le programme calculera et trouvera le bon checksum au fichier binaire .Avant de commencer a faire quoique ce soit je souhaite savoir si c'est un checksum 32 ou 64 avant de commencer mon projet .


        Merci a toi Fvirtman

        Cordialement,
        Fred .
        • Partager sur Facebook
        • Partager sur Twitter
          2 octobre 2007 à 1:15:20

          j'ai regardé un peu ton screenshot, disons que ça ne creve pas les yeux. Il est clair que la derniere ligne de données n'est pas un float, ni un double (j'ai vérifié)

          Je vois que dedans ça parle de "fcall.dbg" :)

          Tu essaies de modifier un fichier debug ?
          • Partager sur Facebook
          • Partager sur Twitter

          Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

            2 octobre 2007 à 1:25:11

            Salut Fvirtman ,

            Non , analyser un fichier binaire compilé ,le programme que je suhaite créer devra lire le Checksum a partir de l'offset 0x0000FED0 !

            Si je modifie le fichier binaire il faut que le programme que je créer arrive a corrigé le checksum , mais d'abord il faut comprendre le type de checksum genérer
            Fvirtman .

            Le checksum de mes fichiers binaires sont a la fin du fichier a l'offset 0x0000FED0 , lr programme que doit faire dois LIRE a aprtir de cet Offset et afficher a l'écran le checksum actuel exemple !

            Checksum du fichier binaire avant modification.
            D2 E0 3F 11 03 11 81 05
            Checksum calculé par le programme que je souhaite créer .
            AD 95 30 1E 09 14 F4 75

            Il faut que le programme commence a lire le checksum de cet offset et corrige le checksum si y'a eu modification .



            • Partager sur Facebook
            • Partager sur Twitter
              2 octobre 2007 à 9:59:33

              oui, je comprends bien le soucis :)
              Au boulot, je fais beaucoup de lecture/ecriture de fichiers binaires,
              et j'avais modifié chez moi récemment un fichier de sauvegarde de "secret of mana" sur l'ému Snes, il y avait un checksum a corriger [...]

              Pour trouver les regles du checksum, j'avais sauvé ma partie une fois, puis ensuite, j'avais fait une modif mineure dans le jeu, puis resauvé, puis encore une modif mineure et resauvé, etc :

              J'avais ainsi des fichiers très voisins, et je voyais comment le checksum bougeait, j'avais fini par trouver la regle, qui était juste un checksum simple, mais avec une constante de départ.

              Dans ton cas, tu modifies le fichier binaire d'un programme comme tu dis (c'est vague : c'est un EXE ? (dans ce cas, il y a de la doc sur le net) ou alors un fichier de données de format propriétaire ?) : essaie de voir si, d'une maniere ou d'une autre, tu peux faire des versions tres voisines, ce qui t'aiderait, pour voir comment le checksum réagit.

              Sinon, si tu ne peux pas, ce sera en effet plus complexe.
              Bon courage.
              • Partager sur Facebook
              • Partager sur Twitter

              Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

                2 octobre 2007 à 23:52:21

                Bonsoir FVirtualMan ,

                Au fait c'est assez simple que tu le penses , je créer une fenétre le fichier binaire sera chargé mais il faut que le programme commence a lire a partir de l'offset 0x0000FFED0 ,le CRC comme t'as pu le constater c'est un 9 Bytes
                avec 18 (Charachters) en anglais 0x123456789101112131415161718
                9Bytes c'est pas du CRC32 fvirtMan
                On va faire simple on va créer une fenétre et se chargera de lire a partir de l'offset 0x0000FFED0 .
                Ensuite elle affihera a l'écran le CRC actuel .
                Je sais aps si tu me suit ?




                • Partager sur Facebook
                • Partager sur Twitter
                  3 octobre 2007 à 0:33:32

                  Citation : Frederic77

                  Bonsoir FVirtualMan ,
                  On va faire simple on va créer une fenétre et se chargera de lire a partir de l'offset 0x0000FFED0 .
                  Ensuite elle affihera a l'écran le CRC actuel .



                  Pour faire ça, c'est tres simple : un coup de fopen en mode "rb", un fseek et un fread, et un printf avec %x
                  si tu preferes le C++ : un ifstream en ios::binary, un seek, un read et un cout ....

                  C'est au niveau codage en C/C++ que ça te pose probleme ? (car ce n'est pas probleme ça !)
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

                    3 octobre 2007 à 1:30:44


                    Salut VirtualMan ,

                    J'utilise un programme qui génere un checksum pour mon fichier binaire et le calcul est bon , mais le programme que j'ai créer ne génere pas le méme checksum
                    avec le programme que j'essaye de créer j'ai ce checksum aprés calcul
                    62 06 A2 EB FC CB 39 A1 (pas bon )
                    avec le logiciel officiel de caclul de checksum j'ai ce checksum
                    03 18 00 30 31 94 0D 1E

                    Le probléme est au niveau du HASH aprés le calcul du CRC
                    C'est le méme type de CRC mais le HASH genérer est différent , il faut chnager le une ou deux lignes dans mon code pour que le programme officiel et le miens genére le méme résultat de checksum .



                    • Partager sur Facebook
                    • Partager sur Twitter
                      4 octobre 2007 à 23:23:53

                      Salut ,

                      Dommage fvirtMan je pensais qu'on pouvaient faire évoluer els choses avec VOUS mais apperement vous réponder plus , dommage .



                      • Partager sur Facebook
                      • Partager sur Twitter
                        4 octobre 2007 à 23:36:07

                        Désolé de ne pas avoir répondu, les idées me manquent pour ton soucis, je voulais répondre, mais j'ai laissé passer en me disant que j'aurais une idée plus tard, idée que je n'ai pas eu...
                        J'attendais de voir si quelqu'un avait d'autres idées de façon a relancer le topic.
                        Désolé.
                        • Partager sur Facebook
                        • Partager sur Twitter

                        Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

                          5 octobre 2007 à 0:12:20

                          Salut fvirtMan ,

                          Utilises tu MSN messenger ?
                          • Partager sur Facebook
                          • Partager sur Twitter
                            5 octobre 2007 à 0:24:29

                            Oui, ajoute moi si tu veux : fvirtman@hotmail.com
                            • Partager sur Facebook
                            • Partager sur Twitter

                            Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

                              5 octobre 2007 à 3:16:24

                              Salut fvirtMan,

                              Oui bien sur !
                              Merci et bonne journée !

                              • Partager sur Facebook
                              • Partager sur Twitter

                              Type de CheckSum CRC 32, CRC8 , CRC 64 dans un fichier binaire

                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                              • Editeur
                              • Markdown