2 Stimmen

Aufrufen nicht exportierter Funktionen in Win32 C++

Wie würde ich vorgehen, um eine nicht exportierte Funktion in Win32 C++ aufzurufen?

0 Stimmen

Wie haben Sie die "nicht exportierte" Funktion gefunden? Ist sie nicht in einer zugehörigen .h-Datei deklariert? Wenn Sie sie mit einem Werkzeug wie dem Dependency Walker gefunden haben, dann ist es ist exportiert, d.h. in der Exporttabelle aufgeführt.

1 Stimmen

Ich habe es mit IDA pro disassembliert und es ist als sub_6f0017ae aufgelistet, aber es ist mit dem Dependancy Walker nicht sichtbar.

0 Stimmen

Nun, das ist ein ganz anderer Hund.

6voto

bk1e Punkte 23191

Der Aufruf von nicht exportierten Funktionen, die im selben Modul (DLL/EXE) wie Ihr Code definiert sind, ist einfach: Rufen Sie sie einfach wie jede andere C++-Funktion auf. Offensichtlich ist das nicht das, wonach Sie fragen. Wenn Sie nicht exportierte Funktionen in einem anderen Modul aufrufen wollen, müssen Sie deren Adressen irgendwie herausfinden.

Eine Möglichkeit, dies zu tun, besteht darin, dass das erste Modul eine exportierte Funktion im zweiten Modul aufruft, die einen Funktionszeiger zurückgibt. (Oder: eine Struktur mit Funktionszeigern, ein Zeiger auf eine Instanz einer Klasse usw.) Denken Sie an das Fabrikmuster.

Eine andere Möglichkeit besteht darin, eine Registrierungsfunktion aus dem ersten Modul zu exportieren und sie vom Initialisierungscode des zweiten Moduls aufrufen zu lassen, indem man ihr Zeiger auf nicht exportierte Funktionen zusammen mit einer Art Identifizierungsinformation übergibt. (Besser ist es, wenn man auch eine entsprechende Entregistrierungsfunktion hat, die aufgerufen wird, bevor das zweite Modul entladen wird).

Eine andere Möglichkeit ist es, sich durch die Debugsymbole zu wühlen, indem man dbghelp.dll . Dies wäre für eine reale Anwendung nicht zu empfehlen, da es die Verteilung von Debugsymbolen erfordern würde und extrem langsam wäre, ganz zu schweigen von der übermäßigen Komplexität.

3voto

Tobias Langner Punkte 10350

Zusätzlich zur Antwort von bk1e gibt es noch eine weitere Methode (ebenfalls nicht empfohlen).

  1. Ermitteln Sie die relative Adresse dieser Funktion in der DLL (z. B. durch Disassemblierung). Dies muss manuell und vor dem Kompilieren geschehen.
  2. Im Programm müssen Sie nun die Startadresse der DLL im Speicher ermitteln (z. B. mit einer exportierten Funktion und einer Berechnung).
  3. Jetzt können Sie diese Funktion direkt aufrufen, indem Sie die relative Adresse der Funktion + die Startadresse der exportierten Funktion verwenden.

Ich empfehle das aber nicht. Es funktioniert nur mit einer bestimmten Version dieser DLL. Bei einer Neukompilierung kann sich die Adresse ändern. Oder die Funktion wird nicht mehr benötigt und wird gelöscht. Es muss einen Grund geben, warum diese Funktion NICHT exportiert wird. Im Allgemeinen versucht man, etwas zu archivieren, was der Autor der Bibliothek absichtlich nicht wollte, und das ist meistens "böse".


Sie haben den ida-Namen erwähnt. Dieser Name beinhaltet die Startadresse.

0voto

Rob K Punkte 8547

Um herauszufinden, was auf den Stack geschoben wird und wie die Typen bestimmt werden, müssen Sie die Disassemblierung studieren.

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