Wie würde ich vorgehen, um eine nicht exportierte Funktion in Win32 C++ aufzurufen?
Antworten
Zu viele Anzeigen?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.
Zusätzlich zur Antwort von bk1e gibt es noch eine weitere Methode (ebenfalls nicht empfohlen).
- Ermitteln Sie die relative Adresse dieser Funktion in der DLL (z. B. durch Disassemblierung). Dies muss manuell und vor dem Kompilieren geschehen.
- Im Programm müssen Sie nun die Startadresse der DLL im Speicher ermitteln (z. B. mit einer exportierten Funktion und einer Berechnung).
- 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.
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.
0 Stimmen
Ich dachte, Win32 sei eine C-API, nicht C++.
0 Stimmen
Die Verwendung undokumentierter Funktionalität ist schlecht, aber manchmal kann man sich darauf verlassen (ObjRef in VB6?). Sie versuchen jedoch, undokumentierte, versteckte, implementierungsspezifische Funktionen zu verwenden, was die Qualität und Zuverlässigkeit Ihrer Codebasis untergräbt. Ist dies Teil einer bezahlten Arbeit? Wenn ja, würde ich Ihren Vertrag nicht verlängern. Wenn man Sie darum gebeten hat, würde ich den Vertrag Ihres Teamleiters nicht verlängern. Abgesehen von einem Vorwand fällt mir kein triftiger Grund ein, dies zu tun. Bitte klären Sie uns auf, warum Sie das tun wollen?