2016-05-01 4 views
0

Je fais un petit programme qui fonctionne un peu comme un strace sauf que je le fais attraper tous les appels et aussi les rets. Comme je ne trouve pas un moyen d'obtenir tous les appels et ret en raison des appels indirects, je voudrais trouver un moyen d'obtenir la fonction à partir de laquelle un opcode ret est originaire. Avez-vous des idées sur la façon de faire celaComment connaître l'origine d'un opcode ret en traçant un programme

+0

quel jeu d'instructions est-ce? –

Répondre

1

Vous pouvez simuler ce que fait un ret: Il regarde dans la pile à l'adresse %esp, et définit EIP à cette valeur. L'instruction avant l'adresse de la pile en cours sera la call utilisée pour aller ici.

+0

ok mais comme la taille de l'instruction précédente n'est pas fixe, n'est-il pas difficile de revenir en arrière et d'arriver au début de cette instruction? –

+1

Oui, c'est une limitation générale de toutes les architectures d'opcode de taille variable - vous ne pouvez pas revenir en arrière. Mais vous connaissez la fonction d'appel. Je ne suis pas sûr pourquoi vous voulez obtenir l'appel en premier lieu, mais la façon de le faire est alors de démonter toute la fonction de tout point valide que vous connaissez, en vous arrêtant à l'adresse lue par le 'ret' . – phihag