Appelez la fonction dans c ++ dll sans en-tête
Je voudrais appeler une méthode à partir d'une dll, mais je n'ai pas la source ni le fichier d'en-tête. J'ai essayé d'utiliser le dumpbin exportations de voir le nom de la méthode, mais je peux trouvé les méthodes de signature?
Est-il possible d'appeler cette méthode?
Merci,
source d'informationauteur mileschet
Vous devez vous connecter pour publier un commentaire.
Il est possible de trouver une fonction C de la signature par l'analyse de début de son démontage. Les arguments de la fonction sur la pile et la fonction va faire un peu de "pop" à lire dans l'ordre inverse. Vous ne trouverez pas les noms d'arguments, mais vous devriez être capable de trouver leur nombre et les types. Les choses peuvent devenir plus difficile avec la valeur de retour - il est peut-être par l'intermédiaire du 'eax' enregistrer ou par l'intermédiaire d'un indicateur spécial passée à la fonction comme la dernière pseudo-argument (sur le haut de la pile).
Si la fonction est un C++, vous pouvez être en mesure de tirer la signature de la fonction de la déformation d'un nom. Dependency Walker est un outil qui va le faire pour vous. Toutefois, si la DLL a été créé avec une liaison C (Dependency Walker va vous dire cela), alors vous êtes hors de la chance.
Le langage C++ ne sait rien à propos des dll.
Est-ce que sur Windows? Un autre moyen serait d':
depends.exe
livré avec (Visual Studio)LoadLibrary()
pour obtenir la charge de cette dll (attention, sur le chemin)GetProcAddress()
pour obtenir un pointeur vers la fonction que vous voulez l'appelerFreeLibrary()
pour libérer la poignéeIl existe un mécanisme similaire pour *nixes avec
dlopen
mais ma mémoire commence à échouer par la suite. Quelque chose qui s'appelleobjdump
ounm
devrait vous obtenir a commencé avec l'inspection de la fonction(s).Comme vous l'avez constaté, la liste des exports dans une DLL seuls les noms de magasins, pas de signatures. Si votre DLL exportations de fonctions C, vous aurez probablement à les démonter et à les désosser les fonctions pour déterminer les signatures de méthodes. Cependant, C++ code pour la signature de la méthode dans le nom d'exportation. Ce processus de combinaison de la méthode nom et la signature est appelé "name mangling". Cette question Stackoverflow a une référence pour la détermination de la signature de la méthode de la déformation d'un nom d'exportation.
Essayez le gratuitement "Dependency Walker" (un.k.un. "dépend") utilitaire. Le "Undecorate Fonctions C++" option doit déterminer la signature d'un C++ méthode.
Si vous savez ou soupçonne fortement la fonction est là, vous pouvez charger dynamiquement le fichier DLL avec la fonction loadLibrary et obtenir un pointeur vers la fonction avec getProcAddress. Voir MSDN
Remarque que c'est une manuelle, dynamique de charger la bibliothèque; vous aurez encore à connaître le fonctionnement correct de la signature à la carte pour le pointeur de fonction pour l'utiliser. Autant que je sache, il n'existe aucun moyen d'utiliser la dll dans un temps de charge de la capacité et de l'utilisation des fonctions sans un fichier d'en-tête.
Appel non des fonctions externes est une excellente façon de faire votre programme en pause à chaque fois que la 3ème partie de la DLL est mis à jour.
Cela dit, la undname utilitaire peut également être utile.