Assemblée de l'adresse de retour
je veux obtenir l'adresse de retour d'une fonction dans l'assemblée, puis de comparer cette adresse de retour de la valeur avec une autre valeur sans pour autant endommager la pile ou de changer quoi que ce soit dans la pile,
comment cela peut être fait dans l'assemblée?
je suis en utilisant x86
tu ne peux pas le générique. veuillez spécifier l'architecture, arm, mips, x86, etc. c'est un très compilateur problème spécifique. Je suppose que c'est un asm fonction que vous écrivez, etc? Veuillez inclure le plus de détails dans la question.
à l'aide de x86, est-il une bonne méthode pour cela? quelle est la meilleure façon d'aller à ce sujet?
en supposant que l'adresse de retour est la dernière chose sur la pile, et vous pouvez utiliser le pointeur de pile pour l'examiner (en supposant que le pointeur de pile n'a pas été modifié pour un stack frame) puis...eh bien l'examiner...il faudrait je suppose besoin d'utiliser inline assemblée ou d'écriture de la fonction par la main pour éviter un autre appel. Le contenu de la pile et la pile d'images créées sont tous spécifiques au compilateur pour que le code de ce jour, vous ne pouvez pas génériquement ce faire, vous devez savoir comment le compilateur a créé cette fonction spécifique. Ou mieux encore, de créer la fonction de vous-même.
à l'aide de x86, est-il une bonne méthode pour cela? quelle est la meilleure façon d'aller à ce sujet?
en supposant que l'adresse de retour est la dernière chose sur la pile, et vous pouvez utiliser le pointeur de pile pour l'examiner (en supposant que le pointeur de pile n'a pas été modifié pour un stack frame) puis...eh bien l'examiner...il faudrait je suppose besoin d'utiliser inline assemblée ou d'écriture de la fonction par la main pour éviter un autre appel. Le contenu de la pile et la pile d'images créées sont tous spécifiques au compilateur pour que le code de ce jour, vous ne pouvez pas génériquement ce faire, vous devez savoir comment le compilateur a créé cette fonction spécifique. Ou mieux encore, de créer la fonction de vous-même.
OriginalL'auteur codrgi | 2012-03-13
Vous devez vous connecter pour publier un commentaire.
Généralement sur x86 si vous utilisez convention stdcall adresse de retour est stockée au contenu du registre ebp +4. Donc
cmp ebp, whatever;
devrait faire le travail. Actuellement, il n'est pas dépendante de convention d'appel plutôt que cela dépend si votre compilateur met push ebp comme la première instruction de votre fonction, qui en général n'. En général la fonction ressemble alors à:OriginalL'auteur Pyjong
Vous pouvez créer une fonction wrapper.
Créer quelques lignes d'assembleur:
Pas réel asm code évidemment. La fonction que vous souhaitez inspecter vous renommer, puis l'asm aurait le nom de la fonction, de compilation et de liaison, et tous les appels à la fonction aller à travers l'emballage. D'écrire ci-dessus, vous devez connaître la convention d'appel pour la cible, un compilateur, des options du compilateur, etc.
OriginalL'auteur old_timer
En général, vous devez démonter la fonction en question, que ce soit manuellement ou avec un peu de code de la vôtre et analyser le démontage (encore une fois, que ce soit manuellement ou avec une sorte d'algorithme heuristique dans le code) pour voir le comportement du pointeur de pile et les registres (par exemple ebp) ou les 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'adresse de retour de l'emplacement et de la coder en dur, mais le code sera très fragile comme tout changement de code et des changements dans la façon dont vous compilez il peut se briser.
Otoh, que, mettant en œuvre une solution à code qui fonctionne toujours (ou presque toujours) malgré les changements de code et des 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 ce problème?
OriginalL'auteur Alexey Frunze