Code relogeable (pouvant etre executé à n'importe quelle addresse): Bon il est assez rare qu'on doive faire appel a un tel style de code pour une application normale... Car meme si votre fichier .exe ,.dll ... se fait loader a une addresse differente de celle specifiee par son image_base, le loader s'occupera de remettre les bonnes valeurs dans toutes vos instructions... Bon je m'explique avec un peu de code MessageBoxA_non_relogeable proc szTitle db 'Titre',0 szMessage db 'Messagebox non relogeable',0 push 0 push offset szTitle push offset szMessage push 0 call [MessageBoxA] ret MessageBoxA_non_relogeable endp Si jamais on deplace se code vers une addresse quelconque en memoire il plantera a tout les coups... pourkoi? C'est simple les "offset szTitle" et "offset sZMessage" ont une valeur qui leur est attribuee lors de la compilation (je sais pas si ce mot existe:)... Donc si jamais vous deplacez ce code en memoire les offset de szTitle et szMessage vont changer mais ceux que vous pusheraient ne bougeront pas car ils ont ete fixés... Une solution connue par tout les auteurs de virus pour remedier a ce probleme est la suivante: MessageBoxA_relogeable proc szTitle db 'Titre',0 szMessage db 'Messagebox non relogeable',0 ;=============================================== ; L'astuce ;=============================================== call Delta Delta: pop eax sub eax,offset Delta push 0 ;=============================================== ; On recupere les nouvelles addresse ;=============================================== lea ebx,[eax+offset szTitle] push ebx lea ecx,[eax+offset szMessage] push ecx ;============================================================================== ; On suppose que l'addresse de la fonction MessageBoxA n'as pas changee ;============================================================================== push 0 call [MessageBoxA] ret MessageBoxA_relogeable endp Bon je vous explique un peu maintenant :) 1/ call Delta ;le trick marche car lors d'un call on ne fait pas appel a l'addresse ; absolue (celle qui a ete compilee) Delta: ;mais a l'addresse relative (la difference entre l'addresse ou on est ;et celle de la fonction qu'on pop eax ;doit appeler!! sub eax,offset Delta Comme vous savez (sinon je vous l'apprend) lors d'un call l'addresse de retour (en locurence Delta) est pushee sur la pile puis et mise dans l'EIP lors du prochain ret... Donc en faisant pop eax on recupere l'addresse memoire de l'emplacement Delta puis on fait sub eax,offset Delta... Ici offset Delta a ete fixe lors du compilage donc si on se trouve a l'offset d'origine on se retrouve avec eax=0 ce qui ne changera rien mais si jamais on a change l'addresse de notre code on a eax qui contient maintenant la difference entre l'addresse du code compile et celle qu'on a maintenant!!! Donc ensuite au lieu de faire un push offset szMessage on fera lea ecx,[eax+offset szMessage] soit on met l'addresse memoire de l'operande situe a droite ici eax+offset szMessage on obtient donc dans ecx la somme de l'addresse memoire compilee avec la difference entre les addresses compilee et les nouvelles addresses... Soit exactement la nouvelle addresse... Le code marchera donc parfaitement!!! Le call [MessageBoxA] marche car on considere qu'on appele ici directement la fonction dans le Kernel32.... En autre terme MessageBoxA n'est pas l'addresse de MessageBoxA dans l'Import Table mais celle dans le Kernel.... Ce chtit texte vous montre les base pour pouvoir coder des fonctions qui pourront etre utilisee a n'importe quel offset.... Ceci peut se reveler utile lorsque vous preparez un ptit patch assez perfectionne pour ne pas avoir a tout tapper sous l'editeur hexa...Vous pouvez coder qqchose de relogeable puis copier simplement la fonction et la coller a n'importe quel offset de votre fichier exe....Et le tour sera joue :) Pulsar Février 2000