2010-10-19 3 views
1

en cours d'exécution sur Windows 7, la maison 32bit proadresse instruction push changer après la modification exe dans l'hexagone

J'ai créé quelques app ligne très simple dans Visual Studio 2008, compilé et lié avec les bibliothèques standard en mode sortie en mode test exécutable .EXE.

Le code c est la suivante:

char* test = "h"; 
int main() 
{ 
    _asm 
    { 
     push 0xFEEDBACC; 
    } 
    MessageBoxA(0,test,test,0); 
} 

qui se traduit par le code machine suivante et l'assemblage correspondant, vu dans VS2008 (adresses rebasées ci-dessous, l'adresse virtuelle normale à partir de 0x4001000)

char* test = "h"; 
int main() 
{ 
    _asm 
    { 
     push 0xFEEDBACC; 
00261000 68 CC BA ED FE push  0FEEDBACCh 
    } 
    MessageBoxA(0,test,test,0); 
00261005 6A 00   push  0  
00261007 68 F4 20 26 00 push  offset string "h" (2620F4h) 
0026100C 68 F4 20 26 00 push  offset string "h" (2620F4h) 
00261011 6A 00   push  0  
00261013 FF 15 A4 20 26 00 call  dword ptr [[email protected] (2620A4h)] 
} 

Maintenant, au lieu d'appeler MessageBox je veux plutôt pousser une autre chaîne "h" juste après le push 0, donc en utilisant hexedit je recherche la section contenant FF15A420 ... et écraser pour devenir

90 68 CC BA ED FE 

Maintenant, si j'ouvre l'exécutable dans l'IDA libre, je vois ce qui suit dans ma section .text:

.text:00401000     push 0FEEDBACCh 
.text:00401005     push 0 
.text:00401007     push offset unk_4020F4 
.text:0040100C     push offset unk_4020F4 
.text:00401011     push 0FFFFFF90h 
.text:00401013     nop 
.text:00401014     push 0FEEDBACCh 
.text:00401019     retn 

cela ressemble bien à ce jour, je vois à 0x401014 ma nouvelle déclaration de poussée.

Maintenant, si je déboguer l'exe dans l'IDA libre tout à coup je vois mes changements de code (voir ci-dessous) la poussée 0FEEDBACC devient pousser 0FFA4BACC et je ne peux pas voir pourquoi les 2 premiers octets sont modifiés. Quelqu'un peut-il expliquer ce qui se passe ici et pourquoi le nombre que je pousse est en train de se modifier? J'ai essayé de changer l'octet de départ physique de cette adresse (soupçonnant une sorte de problème d'alignement) mais cela n'a pas semblé faire une différence.

Merci,

skimon

+1

Eh bien, c'est le moyen difficile de savoir ce que signifie le déplacement. Lien: http://en.wikipedia.org/wiki/Relocation_%28computer_science%29 –

+0

@Hans: Je parie que Skimon l'a appris bien, tho. :) –

Répondre

3

La base de l'image a été modifiée aussi entre les deux derniers écrans.

Je pense qu'il vient de se déplacer (il y avait une adresse): la valeur DWORD à 0x15: A4 20 26 00 points IAT, donc après la réinstallation de son haut mot (octets 0x17 0x18) sera modifié en ajoutant

0x00F7 - 0x0040 = 0x00B7 à lui. Essayez de désactiver la randomisation de base d'image (ou supprimez simplement les relocalisations).

+0

Je vois donc si j'avais écrasé les instructions de poussée avant (puisqu'elles n'incluent pas les fonctions relocalisées) alors mes instructions auraient été correctes. Et je viens de vérifier, ça fonctionne. Je chercherai aussi comment enlever les relocalisations. Merci de votre aide. – skimon

Questions connexes