2009-08-28 5 views
2

Comment procéder pour appeler une fonction non exportée dans Win32 C++?Appel de fonctions non exportées dans Win32 C++

+0

Vous voulez dire d'une bibliothèque DLL? – Havenard

+0

oui, à partir d'un DLL. – user37875

+0

Comment avez-vous trouvé la fonction "non exporté"? N'est-il pas déclaré dans un fichier .h d'accompagnement? Si vous l'avez trouvé avec un outil tel que Dependency Walker, il est * exporté *, c'est-à-dire listé dans la table des exports. –

Répondre

6

L'appel de fonctions non exportées définies dans le même module (DLL/EXE) que votre code est facile: il suffit de les appeler comme n'importe quelle autre fonction C++. Évidemment, ce n'est pas ce que vous demandez. Si vous souhaitez appeler des fonctions non exportées dans un module différent, vous devez trouver leur adresse en quelque sorte.

Une façon de procéder consiste à faire en sorte que le premier module appelle une fonction exportée dans le second module qui renvoie un pointeur de fonction. (Ou: une structure contenant des pointeurs de fonction, un pointeur vers une instance d'une classe, etc.).

Une autre manière est d'exporter une fonction d'enregistrement du premier module et d'appeler le code d'initialisation du second module, lui passant des pointeurs vers des fonctions non exportées avec une sorte d'information d'identification. (Il vaut mieux également avoir une fonction d'annulation d'enregistrement correspondante qui est appelée avant le déchargement du second module.)

Encore une autre façon de parcourir les symboles de débogage en utilisant dbghelp.dll. Cela ne serait pas recommandé pour une application du monde réel car cela nécessiterait la distribution de symboles de débogage et serait extrêmement lent, sans parler de la complexité excessive.

+0

Je n'ai pas écrit cette DLL et j'essaye d'appeler une fonction non exportée que j'ai trouvée. – user37875

+1

Vous n'avez pas écrit cette DLL, la fonction n'est pas exportée et pourtant vous l'avez trouvée; COMMENT ? – Malkocoglu

+0

@workinprogress: Si vous n'avez pas écrit la DLL, comment savez-vous que la fonction que vous souhaitez appeler existe? Avez-vous le code source de la DLL? – bk1e

3

En plus de la réponse de bk1e, il y a encore une autre méthode (pas aussi recommandée).

  1. Obtenir l'adresse relative de cette fonction dans la DLL (par exemple via le désassemblage). Cela doit être fait manuellement et avant la compilation.
  2. Dans le programme, vous devez maintenant obtenir l'adresse de début de la DLL en mémoire (par exemple en utilisant une fonction exportée et quelques calculs).
  3. Vous pouvez maintenant appeler directement cette fonction en utilisant l'adresse relative de la fonction + l'adresse de début de la fonction exportée.

Je ne le recommande pas cependant. Cela ne fonctionne que sur une version définie de cette DLL. Toute recompilation et l'adresse peuvent changer. Ou cette fonction peut ne plus être nécessaire et est supprimée. Il doit y avoir une raison, pourquoi cette fonction n'est pas exportée. En général, vous essayez d'archiver intentionnellement quelque chose que l'auteur de la bibliothèque ne voulait pas que vous fassiez, et c'est "mal" la plupart du temps.


Vous avez mentionné le nom d'ida. Ce nom inclut l'adresse de départ.

0

Il n'y a pas deux façons de procéder, vous devrez étudier le désassemblage pour déterminer ce qui est poussé sur la pile et comment il est utilisé pour déterminer les types.

Questions connexes