IDA Hex-Rays suggère un décalage incorrect


0

Lors de l'exécution Hex-Rays décompilateur contre une application, Hex-Rays a donné le résultat suivant:

__int64 v29; // r10 ... v29 = 0i64; if(!v28) v19 = 0; 

do 
    { 
    v30 = *(_BYTE *)(v29 + 5394926180i64); 
    v31 = *(_BYTE *)(v29 + 5394926172i64); 
    v32 = *(_BYTE *)(v29 + 5394926184i64); 
    v33 = *(_BYTE *)(v29 + 5394926176i64); 
    v34 = *(_BYTE *)(v29++ + 5394926224i64); 
    v75.m128i_i8[v29 + 15] = v30^v34; 
    *((_BYTE *)&v76 + v29 + 3) = v31^*(_BYTE *)(v29 + 5394926227i64); 
    *((_BYTE *)&v76 + v29 + 7) = v32^*(_BYTE *)(v29 + 5394926231i64); 
    *((_BYTE *)&v76 + v29 + 11) = v33^*(_BYTE *)(v29 + 5394926235i64); 
    *((_BYTE *)&v74 + v29 + 15) = v30^*(_BYTE *)(v29 + 5394926239i64); 
    v75.m128i_i8[v29 + 3] = v31^*(_BYTE *)(v29 + 5394926243i64); 
    v75.m128i_i8[v29 + 7] = v32^*(_BYTE *)(v29 + 5394926247i64); 
    v75.m128i_i8[v29 + 11] = v33^*(_BYTE *)(v29 + 5394926251i64); 
    } 
    while (v29 < 4); 

Je suis confus au sujet des références:

*((_BYTE *)&v76 + v29 + 3) = v31^*(_BYTE *)(v29 + 5394926227i64); 
*((_BYTE *)&v76 + v29 + 7) = v32^*(_BYTE *)(v29 + 5394926231i64); 
*((_BYTE *)&v76 + v29 + 11) = v33^*(_BYTE *)(v29 + 5394926235i64); 
*((_BYTE *)&v74 + v29 + 15) = v30^*(_BYTE *)(v29 + 5394926239i64); 

Ceux-ci semblent être bien en dehors du domaine de tout tableau possible? Est-ce que je manque quelque chose?

  0

Pouvez-vous publier un code d'assemblage lié à l'un de ces décalages? 20 nov.. 172017-11-20 07:23:17

1

Il semble que vous ayez affaire à une adresse constante autour de 5394926180i64 (0x141900a64) et v29 ressemble à un index dans la matrice de structures. Je dirais que cela ressemble à un genre de travail avec des registres mappés en mémoire - j'avais déjà vu de telles choses avec diverses ROM de périphériques IOT. Je suggère de faire ce qui suit:

  • Vérifiez que vous avez un segment qui inclut l'adresse. Si ce n'est pas le cas, créez un segment de données supplémentaire incluant toutes les adresses mentionnées.
  • Marquez le nombre suspect comme des décalages (appuyez simplement sur O sur eux).

Ceci devrait causer à l'IDA de menacer toutes ces choses comme des décalages dans la mémoire.

S'il s'agit d'un code de bas niveau traitant directement du matériel, vous trouverez probablement toutes les adresses de segment dans le SDK ou dans la feuille de données correspondante.

  0

Dans ce cas, ce n'est pas un code de bas niveau, mais seulement une application Windows. 20 nov.. 172017-11-20 18:25:13


0

Apparemment, je l'ai peut-être compris. Dans ce cas, il s'agit simplement de déréférencer les offsets de 0 qui pointent finalement vers des données dans .rdata. Je ne l'avais pas réalisé jusqu'à ce que j'ai modifié la représentation de nombre en hex.