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
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 –
@Hans: Je parie que Skimon l'a appris bien, tho. :) –