23 Stimmen

Signaturen von exportierten Funktionen in einer DLL abrufen

Ist es möglich, eine exportierte (C-Stil?) Funktionssignatur (Parameteranzahl/Typen, Rückgabetyp) aus einer DLL zu erhalten? Ich kann die Liste der Funktionsnamen, Adressen, Ordnungszahlen, etc. mit DLL-Export-Betrachter aber ich kann die Signaturen nicht sehen. Ich habe nur die dll-Datei und habe weder .h- noch .def-Dateien.

UPDATE: Mit Hilfe eines Tools namens API-Monitor kann ich mich an einen Prozess anhängen, der die genannte DLL verwendet, und die Aufrufe der Funktionen sehen. Dadurch kann ich die Anzahl der Parameter, den Rückgabewert und ihre Integer-Werte (Zeiger?) sehen, aber das hilft nicht viel. Ich sollte wahrscheinlich einen Weg finden, um festzustellen, auf welche Art von Strukturen diese Zeiger zum Zeitpunkt des Aufrufs zeigen.

23voto

Rob Kennedy Punkte 158781

DLLs speichern die Signaturen der Funktionen, die sie exportieren, nicht. Andere Antworten haben C++ erwähnt, und wenn eine C++-Funktion exportiert wird als C++ dann wird der Name tatsächlich entstellt. Entflechten Sie ihn mit dem richtigen Compiler-Mangling-Schema, und Sie haben die Signatur. Die meisten DLLs exportieren jedoch keine C++-Funktionen unter Verwendung ihrer C++-Namen. Stattdessen werden die Funktionen, die eine DLL exportieren will, mit Namen im C-Stil exportiert, so dass die exportierten Funktionen, selbst wenn die DLL in C++ geschrieben wurde, keine Signaturinformationen enthalten.

Sie haben die Kopfzeile nicht? Die meisten Hersteller liefern so etwas in ihren SDKs mit. Wenn Sie keinen bekommen haben, beschweren Sie sich beim Hersteller. Wenn Sie keinen bekommen sollten, dann gehen Sie Ihre Aufgabe vielleicht falsch an; sind Sie sicher, dass Sie die DLL direkt verwenden sollen?

Wenn Sie die Header-Datei nicht haben, sollten Sie sich auch fragen, ob Sie die DLL überhaupt rechtlich gesehen in Ihrem Programm verwenden dürfen. Wenn es sich nur um eine beliebige DLL handelt, die Sie auf Ihrem System gefunden haben, dann dürfen Sie sie wahrscheinlich nicht weitergeben, wenn Sie Ihr Programm ausliefern, selbst wenn Sie Code dafür schreiben können.

5voto

Daniel Paull Punkte 6667

Bei C-Funktionen wird diese Information nicht in der DLL gespeichert. Das Einzige, was ich vorschlagen kann, ist, die Funktion zu zerlegen und zu sehen, wie sie mit Variablen auf dem Stack interagiert, und dann zu versuchen, die Signatur zu bestimmen.

Viel Glück!

4voto

Roddy Punkte 64661

In C++ lauten die Funktionssignaturen " verstümmelt " in den Namen auf eine vom Compiler abhängige Weise ein. In C geschieht dies nicht. Wenn Sie also C-Funktionen in Ihrer DLL haben, sehen Sie unveränderte Namen. Wenn es sich um eine C++-Funktion handelt, werden Sie verstümmelte Namen sehen.

C++ benötigt gemangelte Namen, damit der Linker überladene Funktionen mit unterschiedlichen Signaturen auflösen kann.

Ich glaube nicht, dass es eine Möglichkeit gibt, die Funktionssignaturen aus einer "C"-DLL zu erhalten. Sie sind einfach nicht vorhanden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X