3 votes

Comment trouver l'adresse d'appel virtuel d'une fonction en assembleur ?

J'ai fait des recherches sur Internet mais je ne suis pas sûr de poser la bonne question et je n'ai pas trouvé grand-chose, un lien serait peut-être utile.

J'ai fait un programme c++ qui affiche une boîte de message, puis je l'ai ouvert avec Ollydbg et je suis allé à la partie où il appelle MessageBoxW.

L'adresse d'appel de MessageBoxW change à chaque fois que je lance l'application car Windows met à jour mon tableau des importations pour avoir l'adresse correcte de MessageBoxW. Ma question est donc la suivante : comment puis-je trouver les adresses virtuelles de MessageBoxW dans mon tableau d'importations et comment puis-je les utiliser dans ollydbg ?

En gros, j'essaie de faire un code cave en assembleur pour appeler MessageBoxW à nouveau. J'ai été assez proche une fois en cherchant l'exécutable avec un éditeur hexadécimal et j'ai trouvé la position de l'appel, et je pense avoir trouvé l'adresse virtuelle. Mais lorsque j'ai appelé cette adresse virtuelle dans olly et que je l'ai sauvegardée dans l'exécutable, la prochaine fois que je l'ai ouvert, l'appel a été remplacé par un tas d'adresses virtuelles. DB xyz (qui ressemblait à l'adresse virtuelle mais pourquoi l'adresse call ont été supprimés ?

Désolé si ma terminologie est incorrecte, je suis nouveau dans ce domaine et je ne sais pas comment appeler les choses.

2voto

CyberShadow Points 13244

(réponse au commentaire sur le message original)

Ah, non, l'adresse spécifiée dans l'opcode "call" est relative à l'instruction d'appel. Cependant, pour les fonctions importées, il s'agit très probablement d'un appel indirect (qui lit l'adresse de la fonction à partir d'un emplacement mémoire).

Il n'y a vraiment aucun moyen "officiel"/fiable d'obtenir l'adresse d'une fonction sans avoir aucun accès au segment d'importation. Si vous êtes Parcheando un certain exécutable, regardez simplement les valeurs que Windows place dans son segment d'importation. Si vous injectez du code depuis un autre processus, vous pouvez compter sur le fait que l'adresse d'une fonction dans une DLL système restera la même, par rapport à l'adresse de chargement de la DLL. Il est également possible de localiser et d'analyser manuellement le segment d'importation du programme en mémoire.

0voto

Amir Points 1266

1- trouver l'adresse de la boîte de message dans votre module exécutable. supposons que votre fichier exe soit a1.exe

Modules exécutables > sélectionnez a1.exe > appuyez sur ctrl + N et trouver l'adresse de la boite de message. supposons que l'adresse est 00402008

2- utiliser ff25 08204000 code machine pour appeler la boîte à message mais avant de pousser les paramètres et de pousser votre EIP pour l'adresse de retour.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X