17 Stimmen

Funktion in C++ dll ohne Header aufrufen

Ich möchte eine Methode aus einer DLL aufrufen, aber ich habe weder die Quelle noch die Header-Datei. Ich habe versucht, die dumpbin /exports verwenden, um den Namen der Methode zu sehen, aber ich kann die Methoden Signatur gefunden?

Gibt es eine Möglichkeit, diese Methode aufzurufen?

Danke,

10voto

zdan Punkte 27066

Wenn es sich um eine C++-Funktion handelt, können Sie die Funktionssignatur möglicherweise aus dem umgewandelten Namen ableiten. Abhängigkeits-Walker ist ein Werkzeug, das diese Aufgabe für Sie übernimmt. Wenn die DLL jedoch mit C-Verknüpfung erstellt wurde (Dependency Walker sagt Ihnen das), dann haben Sie Pech.

9voto

dirkgently Punkte 104289

Die Sprache C++ weiß nichts über DLLs.

Läuft das unter Windows? Eine Möglichkeit wäre es,:

  • öffnen Sie die dll in depends.exe ausgeliefert mit (Visual Studio)
  • die Signatur der aufzurufenden Funktion zu überprüfen
  • utiliser LoadLibrary() um diese DLL zu laden (achten Sie auf den Pfad)
  • utiliser GetProcAddress() um einen Zeiger auf die Funktion zu erhalten, die Sie aufrufen möchten
  • diesen Zeiger auf eine Funktion verwenden, um einen Aufruf mit gültigen Argumenten durchzuführen
  • utiliser FreeLibrary() zum Lösen des Griffs

Übrigens: Diese Methode wird allgemein auch als dynamisches Linking zur Laufzeit bezeichnet, im Gegensatz zum dynamischen Linking zur Kompilierzeit, bei dem Sie Ihre Quellen mit den zugehörigen lib archivo.

Es gibt einen ähnlichen Mechanismus für *nixes mit dlopen aber danach lässt mein Gedächtnis nach. Etwas namens objdump ou nm sollten Sie mit der Untersuchung der Funktion(en) beginnen.

5voto

Peter Neubauer Punkte 837

Wie Sie festgestellt haben, speichert die Exportliste in einer DLL nur Namen, keine Signaturen. Wenn Ihre DLL C-Funktionen exportiert, müssen Sie wahrscheinlich die Funktionen disassemblieren und zurückentwickeln, um die Methodensignaturen zu ermitteln. In C++ wird die Signatur der Methode jedoch im Exportnamen kodiert. Dieser Prozess der Kombination von Methodenname und Signatur wird als "Namensmanipulation" . Diese Stackoverflow-Frage verfügt über einen Verweis zur Ermittlung der Methodensignatur aus dem verfälschten Exportnamen.

Probieren Sie die kostenlose "Dependency Walker" (auch bekannt als "depends") Nutzen. Die Option "Undecorate C++ Functions" sollte die Signatur einer C++-Methode bestimmen.

4voto

Es ist möglich, die Signatur einer C-Funktion herauszufinden, indem man den Anfang ihrer Disassemblierung analysiert. Die Funktionsargumente befinden sich auf dem Stack und die Funktion führt einige "Pops" aus, um sie in umgekehrter Reihenfolge zu lesen. Sie werden die Namen der Argumente nicht finden, aber Sie sollten in der Lage sein, ihre Anzahl und die Typen herauszufinden. Schwieriger wird es mit dem Rückgabewert - er kann über das Register 'eax' oder über einen speziellen Zeiger, der der Funktion als letztes Pseudo-Argument (oben auf dem Stack) übergeben wird, erfolgen.

1voto

Matt Punkte 10189

Wenn Sie tatsächlich wissen oder stark vermuten, dass die Funktion vorhanden ist, können Sie die DLL mit loadLibrary dynamisch laden und mit getProcAddress einen Zeiger auf die Funktion erhalten. Siehe MSDN

Beachten Sie, dass dies ein manueller, dynamischer Weg ist, um die Bibliothek zu laden; Sie müssen immer noch die korrekte Funktionssignatur kennen, um sie dem Funktionszeiger zuzuordnen, damit Sie sie verwenden können. AFAIK gibt es keine Möglichkeit, die Dll in einer Ladezeit-Fähigkeit zu verwenden und die Funktionen ohne eine Header-Datei zu verwenden.

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