Bonjour à tous ,


Je vais faire trés simple pour permettre aux membres de cérner le probléme de XOR de checksum .



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 :





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 :




Checksum actuel : BF 96 AF 63 79 B3 D4 52 ( 9 Data Bits)
Checksum calculé : 85 CA 8F 67 41 44 3F B7


3 éme Calcul :
Checksum actuel : 85 CA 8F 67 41 44 3F B7 ( 9 Data Bits)
Checksum calculé : F4 1B 16 36 2A 67 37 E6



3 éme Calcul :

Checksum Actuel dans le fichier : E2 0F DF 10 4B 01 51 A2
Nouveau Checksum : 45 43 21 66 76 1F F5 FF



Mon Code :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
 
 
#include <string>
 
static unsigned __intchksum CRCXX_TABLE[256];
 
//---------------------------------------------------------------------------------------------------------------------
unsigned __intchksum  crcXX( const void *buffer, const size_t size, unsigned __intXX crc )
{
    if( size == 0 || !buffer )
    {
        return 0;
    }
    try
    {
        unsigned __int8 *data = (unsigned __int8 *)buffer;
        static bool init = false;
        if( !init )
        {
            init = true;
            for(int i = 0; i <= 255; i++) 
            {
              unsigned __intXX wrd = i;
              for( int j = 0; j < 8; j++) 
              {
                if( wrd & 1 )
                {
                  wrd = (wrd >> 1) ^ crc;
                }else
                {
                  wrd >>= 1;
                }
              }
              CRCXX_TABLE[i] = wrd;
            }
        }
        for(size_t i = 0; i < size; i++, data++ ) 
        {
            unsigned __intXX t1 = crc >> 8;
            unsigned __int8 index = (unsigned __int8)((crc ^ (unsigned __intXX) *data) & 0xff);
            unsigned __intXX t2 = CRCXX_TABLE[ index ];
            crc = t1 ^ t2;
        }
    }catch(...){}
    return crc;
}



Et ce code aussi :



Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
 
void CCRCXXHash::Init(RH_DATA_INFO *pInfo)
{
	m_crcXX = CONSTXX(0xFFFFFFFFFFFFFFFF);
}
 
void CCRCXXHash::Update(const UWORD8 *pBuf, UINTPREF uLen)
{
	UINTPREF i;
 
	for(i = 0; i < uLen; i++)
		m_crcXX = g_pCRCXXTable[(UWORD8)(m_crcXX >> 56) ^ *pBuf++] ^ (m_crcXX << 8);
}
 
void CCRCXXHash::Final()
{
	m_crcXX = ~m_crcXX;
}

Jai utilisé Rehash , Verifier , VisualHash qui ont donnés 3 résultats différents de méme type de checksum et ce avec le méme fichier binaire , vraiement étonnant , méme fichier binaire , méme type de CRC avec 3 résultats differents .


XX = c'est le type de CRC utilisé .



Le checksum est toujours a l'offset 0x0000FED0 , le logiciel lis le checksum a partir de cet offset du fichier binaire .



Merci pour tout conseil ou toute suggéstion venant a comprendre l'algorythm de XOR de bits dans le fichier binaire .



Cordialement ,
Fred .