Gibt es eine schnelle Möglichkeit, eine DLL in C ++ zu haken? Ich weiß, dass es Microsofts Detours -Dinge gibt, aber es gibt keinen schnellen, einfachen Weg, nur um zu haken ein paar DLL-Funktionen?
Ich möchte zum Beispiel die Funktion void mytestfunction()
in der dll mytestdll.dll
auf hook_mytestfunction()
haken.
Danke im Voraus!
Wahrscheinlich ist der einfachste Weg, Ihre eigene Wrapper-DLL mit dem gleichen Namen in das Verzeichnis der EXE zu schreiben und eine Kopie der hooked DLL in dasselbe Verzeichnis unter einem neuen Namen zu schreiben. Dann leiten Sie in der IAT Ihrer Wrapper-DLL alle nicht abgefangenen Aufrufe an die umschlossene DLL weiter (Export-Weiterleitung) und implementieren Sie die anderen selbst.
Um Funktionen umzuleiten, fügen Sie die folgende Zeile in Ihre DEF-Datei ein: Foo=wrapped_mytestdll.Foo
Dabei ist Foo der Name der (gemangelten) Funktion und wrapped_mytestdll
ist der neue Name der kopierten DLL.
Als Ergebnis lädt die betroffene EXE Ihre Wrapper-DLL und wiederum die umschlossene DLL. Funktionen in Ihrer Wrapper-DLL haben Vorrang vor der eingepackten DLL. Die einzigen Aufrufe, die nicht abgefangen werden, sind Aufrufe der Wrapped DLL an sich selbst, da diese nicht durch Ihre IAT gehen.
(Ich habe seither einen Link zu einem Tool um eine einfache ".DEF" -Datei zu erstellen, habe sie aber nicht selbst getestet. Verwenden Sie auf eigene Gefahr.)
Ich nehme an, wenn Sie eine DLL anhängen, die Sie die Exporte dieser DLL haken?
In diesem Fall können Sie einen einfachen IAT-Hook (und möglicherweise EAT, falls erforderlich) ausführen.
Der Vorteil von IAT / EAT-Hooks gegenüber Detours ist, dass die Anwendung und Entfernung der Hooks zu 100% sicher ist (da Sie keinen Code ersetzen, ersetzen Sie einen Pointer, sodass es keine Chance auf eine Race-Bedingung gibt ), und es ist auch einfach, die Haken bei nativen x64-Prozessen zu machen (was Microsofts Detours-Bibliothek nicht tun kann, wenn Sie 10 grand für die Prof-Ausgabe nicht abzweigen).
Ja, es gibt Umweg-Bibliotheken von Drittanbietern, die x64-Unterstützung haben und sich um die meisten Rennbedingungen kümmern und was nicht, aber einige von ihnen sind wirklich teuer und andere sind nur ein Schmerz, mit denen man arbeiten kann.
>IAT / EAT-Hooks sind schnell und einfach, und es gibt Beispielcode zum Ausführen von ihnen in dem Buch "Windows via C / C ++" (zusammen mit einer Vielzahl von Stellen auf den Interwebs).
Das ist eine ziemlich generische Antwort, die ich kenne, aber es ist schwierig, detailliertere Informationen zu geben, ohne weitere Informationen darüber, was Sie genau machen wollen.
Rufen Sie einfach GetProcAddress (hDll, "mytestfunction") auf, und schreiben Sie jmp hook_mytestfunction
dort, dann platzieren Sie die Anweisungen am Anfang von mytestfunction in hook_mytestfunction.
Es ist wirklich schnell und einfach, natürlich, wenn Sie es verstehen. Wenn Sie nicht - verwenden Sie MS Detours oder eine andere Bibliothek. Normalerweise können Sie es tun, ohne zu verstehen, wie es funktioniert.