2012-03-13 2 views
3

je veux obtenir l'adresse de retour d'une fonction dans l'assemblage, puis de comparer cette valeur d'adresse de retour avec une autre valeur sans altérer la pile ou de changer quoi que ce soit dans la pile,retour Assemblée adresse

comment cela peut se faire dans l'assemblage ?

J'utilise x86

+0

vous ne pouvez pas génériquement. veuillez spécifier l'architecture, le bras, le mips, le x86, etc. C'est un problème très spécifique au compilateur. Je suppose que c'est une fonction asm que vous écrivez, etc? S'il vous plaît mettre plus de détails dans la question. –

+0

en utilisant x86, existe-t-il de bonnes méthodes pour cela? Quelle est la meilleure façon de s'y prendre? – codrgi

+0

en supposant que l'adresse de retour est la dernière chose sur la pile et vous pouvez utiliser le pointeur de la pile pour l'examiner (en supposant que le pointeur de la pile n'a pas été modifié pour une pile) ... alors examinez-le ... besoin d'utiliser l'assemblage en ligne ou écrire la fonction à la main pour éviter un autre appel. Le contenu de la pile et les cadres de pile créés sont tous spécifiques au compilateur pour ce code ce jour-là, vous ne pouvez pas le faire de manière générique, vous devez savoir comment le compilateur a créé cette fonction spécifique. Ou encore mieux, créez vous-même la fonction. –

Répondre

6

usualy sur x86 si vous utilisez l'adresse de retour de convention stdcall est stocké au contenu du registre ebp + 4. Donc cmp ebp, whatever; devrait faire le travail. En fait, cela ne dépend pas de la convention d'appel, car cela dépend si votre compilateur place push ebp comme première instruction de votre fonction, ce qui est habituellement le cas. Généralement, la fonction ressemble à ceci:

push ebp 
mov ebp,esp 
sub esp,size_of_local_variables 
... 
somehting something something 
... 
mov esp, ebp 
pop ebp 
ret 
1

Vous pouvez créer une fonction wrapper.

int the_real_function (unsigned int a, unsigned int b) 
{ 
//stuff 
return(something); 
} 

Créer quelques lignes assembleur:

function_name: 
    save registers if needed 
    grab the return address here 
    if passed on stack copy parameters 
    call the_real_function 
    if return is stack based place it where needed 
    restore registers if needed 
    return 

Pas vrai code asm évidemment. La fonction que vous souhaitez inspecter serait renommée, alors l'asm aurait le nom de la fonction, compiler et lier et tous les appels à la fonction passent par le wrapper. Pour écrire ce qui précède, vous devez connaître la convention d'appel pour cette cible, le compilateur, les options du compilateur, etc.

1

En général, vous devez désassembler la fonction en question manuellement ou avec un de vos codes et analyser le désassemblage (encore une fois, manuellement ou avec une sorte d'algorithme heuristique dans le code) pour voir le comportement du pointeur de la pile et des registres associés (eg ebp) ou des variables dans cette fonction jusqu'au point où commence votre code qui a besoin de l'adresse de retour. Si vous faites tout à la main, il sera facile de trouver l'emplacement de l'adresse de retour et de le coder en dur, mais le code résultant sera très fragile car tout code change et les changements dans la compilation peuvent le casser . OTOH, implémenter une solution dans le code qui fonctionnerait toujours (ou presque toujours) malgré les changements de code et les changements dans la compilation va être très fastidieux et difficile.

Pouvez-vous nous dire pourquoi vous avez besoin de l'adresse de retour? Quel est le problème que vous essayez de résoudre avec cela?