Comment procéder pour appeler une fonction non exportée dans Win32 C++?Appel de fonctions non exportées dans Win32 C++
Répondre
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.
Je n'ai pas écrit cette DLL et j'essaye d'appeler une fonction non exportée que j'ai trouvée. – user37875
Vous n'avez pas écrit cette DLL, la fonction n'est pas exportée et pourtant vous l'avez trouvée; COMMENT ? – Malkocoglu
@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
En plus de la réponse de bk1e, il y a encore une autre méthode (pas aussi recommandée).
- 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.
- 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).
- 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.
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.
- 1. Exécuter des fonctions .dll non exportées avec python
- 2. Appel de fonctions dans la bibliothèque C externe à partir d'une application Qt (win32)
- 3. Récupère les signatures des fonctions exportées dans une DLL
- 4. Win32 impression C++ PRINTDLGEX non déclaré?
- 5. Appel des fonctions Win32 renvoyant des chaînes avec alien dans Lua
- 6. Appel des fonctions DLL à partir de VB6
- 7. Obtention de fonctions C++ non gérées à partir de C#
- 8. win32: libs référence non définie
- 9. Comment utiliser les classes C++ exportées par une DLL dans Delphi
- 10. Fonctions non déterministes dans les fonctions de partitionnement sql
- 11. Win32 appel API via un serivce
- 12. Comment utiliser Marshal.ReleaseComObject avec Win32 fonctions natives
- 13. Appel de fonctions de fenêtres dans ASM (question push/pop)
- 14. Fonctions dans C
- 15. Événements de clavier C++ Win32
- 16. Je veux savoir quelles fonctions sont disponibles à partir d'un Win32.DLL
- 17. Appel de C# dll dans vbscript
- 18. stockage fonctions python non liées dans un objet de classe
- 19. appel à mysql_connect fonction non définie()
- 20. Console C/C++ Windows WIN32
- 21. C# fonctions de fil
- 22. Appel fonction C++ de C#
- 23. Extern C fonctions dans Objective-c
- 24. Rendre les fonctions non prioritaire
- 25. Comment éviter le blocage (C++, Win32)
- 26. Fonctions C Registre dans Windows API
- 27. Appel de fonctions de comptabilisation temporelle à partir d'un constructeur
- 28. Appel de fonctions Flash à partir de C# et vice versa
- 29. Appel Py_Finalize() de C
- 30. appel de routine d'assemblage dans l'objectif C
Vous voulez dire d'une bibliothèque DLL? – Havenard
oui, à partir d'un DLL. – user37875
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. –