Frage

Ich mag eine Methode aus einer DLL rufen, aber ich habe nicht die Quelle weder die Header-Datei. Ich versuchte, den dumpbin / export zu verwenden, um den Namen der Methode, um zu sehen, aber ich kann die Methoden Signatur gefunden?

Gibt es eine Möglichkeit, diese Methode zu nennen?

Danke,

War es hilfreich?

Lösung

Es ist möglich, eine C-Funktion Signatur, um herauszufinden, durch beginnig seine Demontage zu analysieren. Die Funktionsargumente werden auf dem Stapel sein und die Funktion wird einige „Pops“ tun, um sie in umgekehrter Reihenfolge zu lesen. Sie werden die Argumentnamen nicht finden, aber Sie sollten ihre Zahl herauszufinden und die Typen der Lage sein. Dinge kann schwieriger mit Rückgabewert bekommen -. Es über ‚eax‘ sein können sich registrieren oder über einen speziellen Zeiger auf die Funktion als letzte pseudo-Argument übergeben (an der Spitze des Stapels)

Andere Tipps

Wenn die Funktion ist ein C ++ ein, können Sie in der Lage sein, die Funktion Signatur aus dem verstümmelten Namen abzuleiten. Dependency Walker ist ein Werkzeug, das dies für Sie tun. Wenn jedoch die DLL mit C-Verknüpfung erstellt wurde (Dependency Walker wird Ihnen sagen), dann sind Sie kein Glück.

Die Sprache C ++ wissen nichts über dlls.

Ist das unter Windows? Eine Möglichkeit wäre, zu:

  • Öffnen Sie die DLL-up in depends.exe ausgeliefert mit (Visual Studio)
  • Überprüfen Sie die Signatur der Funktion, die Sie aufrufen möchten
  • Verwendung LoadLibrary() zu bekommen diese DLL laden (Vorsicht über den Pfad)
  • Verwendung GetProcAddress() einen Zeiger auf die Funktion bekommen Sie anrufen möchten
  • verwenden Sie diese Zeiger-to-Funktion einen Anruf mit gültigen Argumenten machen
  • Verwendung FreeLibrary() den Griff lösen
  

BTW: Diese Methode wird auch bezeichnet wird allgemein als Laufzeit eines dynamische Verbindung im Gegensatz zu Kompilierung-dynamische Verknüpfung, wo Sie Ihre Quellen mit der zugehörigen lib Datei kompilieren

.

Es gibt einen ähnlichen Mechanismus für * nixes mit dlopen, aber mein Gedächtnis beginnt danach zum Scheitern verurteilt. Etwas genannt objdump oder nm sollten Sie mit Prüfung der Funktion zu beginnen (s).

Wie Sie gefunden haben, speichert die Exporte Liste in einer DLL nur Namen, keine Unterschriften. Wenn Ihre DLL Exporte C-Funktionen, werden Sie wahrscheinlich zerlegen und Reverse-Funktionen Engineering Methode Signaturen zu bestimmen. Allerdings codiert C ++ die Methodensignatur in den Exportnamen. Dieser Prozess des Methodennamens Kombinieren und Unterschrift heißt „name Mangeln“ . Diese Frage Stackoverflow hat eine Referenz für die Methodensignatur aus dem verstümmelten Exportnamen zu bestimmen.

Nutzen Sie den kostenlosen "Dependency Walker" (auch bekannt als "hängt") Dienstprogramm. Die "undecorate C ++ Funktionen" Option sollte die Unterzeichnung einer C ++ Methode bestimmen.

Wenn Sie in der Tat wissen oder vermuten stark die Funktion es ist, können Sie die DLL dynamisch mit loadlibrary laden und einen Zeiger auf die Funktion mit GetProcAddress bekommen. Siehe MSDN

Beachten Sie, dass dies ein Handbuch, dynamische Art und Weise, die Bibliothek zu laden; Sie werden immer noch die korrekte Funktion Unterschrift zur Karte auf die Funktionszeiger, um es zu benutzen wissen. AFAIK gibt es keine Möglichkeit, die DLL in einer Last-Zeitfähigkeit zu nutzen und die Funktionen ohne Header-Datei verwendet werden.

Beim nicht-externen Funktionen ist eine gute Möglichkeit, Ihr Programm Pause haben, wenn der 3rd-Party-DLL aktualisiert wird.

Das heißt, die undname Dienstprogramm kann auch hilfreich sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top