2008-12-22 5 views
17

Est-il possible d'obtenir une signature exportée (paramètre C/types, type de retour) d'une DLL? Je peux voir la liste des noms de fonctions, adresses, ordinaux, etc. avec DLL Export Viewer mais je ne peux pas voir les signatures. Je n'ai que le fichier dll et n'ai pas de fichiers .h ou .def.Récupère les signatures des fonctions exportées dans une DLL

MISE À JOUR: En utilisant un outil appelé API Monitor, je peux attacher à un processus qui utilise la DLL mentionnée et voir les appels aux fonctions. Cela me permet de voir le nombre de paramètres, la valeur de retour et leurs valeurs entières (pointeurs?) Mais cela n'aide pas beaucoup. Je devrais probablement trouver un moyen de déterminer quel type de structures pointent ces pointeurs au moment de l'appel.

Répondre

3

En C++, les signatures de fonction sont "mangled" dans le nom d'une manière dépendant du compilateur. Cela ne se produit pas dans C. Ainsi, si vous avez des fonctions C dans votre DLL, vous verrez des noms non mélangés. Si c'est un C++, vous verrez des codes mutilés.

C++ nécessite des noms tronqués pour permettre au lieur de résoudre des fonctions surchargées avec différentes signatures.

Je ne pense pas qu'il y ait un moyen pour vous d'obtenir les fonctions singings à partir d'une DLL "C". Ils ne sont tout simplement pas présents.

3

Pour les fonctions C, ces informations ne sont pas du tout stockées dans la DLL. La seule chose que je peux suggérer est de démonter la fonction et de regarder comment elle interagit avec les variables de la pile, puis essayer de déterminer la signature.

Bonne chance!

17

Les DLL ne stockent pas les signatures des fonctions exportées. D'autres réponses ont mentionné C++, et lorsqu'une fonction C++ est exportée comme C++, alors le nom sera en fait tronqué. Démangez-le avec le schéma de concordance du bon compilateur, et vous aurez la signature. Mais la plupart des DLL n'exportent pas de fonctions C++ en utilisant leurs noms C++. Au lieu de cela, les fonctions qu'une DLL choisit d'exporter sont exportées en utilisant des noms de style C, donc même si la DLL a été écrite en C++, les fonctions exportées n'auront toujours aucune information de signature.

Vous n'avez pas l'en-tête? La plupart des fournisseurs incluent ce genre de chose dans leurs SDK. Si vous n'en avez pas eu, alors se plaindre au vendeur. Si vous n'étiez pas censé en obtenir un, alors peut-être que vous allez à propos de votre tâche dans le mauvais sens; Êtes-vous sûr que vous êtes censé utiliser directement cette DLL? Si vous n'avez pas le fichier d'en-tête, vous pouvez également vous demander si vous êtes légalement autorisé à utiliser la DLL dans votre programme. Si c'est juste une DLL arbitraire que vous avez trouvée sur votre système, même si vous pouvez écrire du code, vous n'êtes probablement pas autorisé à la redistribuer lorsque vous expédiez votre programme.

+0

Vous avez absolument raison à vos points :) – huseyint

Questions connexes