2010-01-26 13 views
8

Gibt es eine schnelle Möglichkeit, eine DLL in C++ zu haken? Ich weiß, es gibt Microsofts Detours Sache, aber gibt es nicht einen schnellen einfachen Weg, nur ein paar DLL-Funktionen zu haken?C++ eine DLL einhängen?

Zum Beispiel möchte ich die Funktion void mytestfunction() in der DLL mytestdll.dll zu hook_mytestfunction() haken.

danke im voraus!

+0

Versuchen Sie, eine DLL in Ihrem eigenen Prozess oder eine DLL, die in einen anderen Prozess geladen wurde, anzuhängen? –

+0

Die verfügbaren Strategien zum Anhängen aller Funktionen, die in einer DLL verwendet werden, unterscheiden sich von den Strategien zum Anhängen nur einer der verwendeten Funktionen. Out-of-Process-Strategien unterscheiden sich von Prozessstrategien. Könnten Sie etwas mehr Details geben? –

+0

Ja, versuchen, eine DLL von einem anderen Prozess zu haken. wie etwas ähnliches wäre zum Beispiel wie das Anhängen der opengl32.dll-Datei und Abfangen von glBegin..glEnd und etc ... – enuree

Antwort

3

Umwege ist der schnelle und einfache Weg!

+2

Außer wenn Sie in 64 bit arbeiten wollen, wo Sie eine 10k $ Lizenzgebühr bezahlen müssen :( – CharlesB

3

Ich nehme an, wenn Sie eine DLL einhängen, die Sie die Exporte dieser DLL haken?

In diesem Fall können Sie eine einfache IAT (und möglicherweise EAT wenn nötig) Hook durchfü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, so dass es keine Chance auf ein Rennen gibt Bedingung, und es ist leicht, auch die nativen x64-Prozesse zu haken (was Microsofts Detours-Bibliothek nicht tun kann, wenn Sie nicht 10 grand für die Prof-Edition herausgeben).

Ja, es gibt 3rd Party Umleitungsbibliotheken, die X64-Unterstützung haben und kümmern sich um die meisten der Race-Bedingungen und was nicht, aber einige von ihnen sind wirklich teuer, und andere sind nur ein Schmerz zu arbeiten.

IAT/EAT-Hooks sind schnell und einfach, und es gibt Beispielcode für die Durchführung von ihnen im Buch "Windows via C/C++" (zusammen mit einer Vielzahl von Stellen auf den Interwebs).

Dies ist eine ziemlich generische Antwort, die ich kenne, aber es ist schwer, mehr ins Detail zu gehen, ohne weitere Informationen darüber, was Sie genau machen wollen.

4

Wahrscheinlich ist der einfachste Weg, Ihre eigene Wrapper-DLL mit dem gleichen Namen in das Verzeichnis der EXE zu setzen, und eine Kopie der süchtig DLL in das gleiche Verzeichnis mit einem neuen Namen. Führen Sie anschließend in der IAT der Wrapper-DLL alle nicht abgefangenen Aufrufe an die umschlossene DLL um (Exportforwarding), und implementieren Sie die anderen selbst.

Um Funktionen umzuleiten, legen Sie die folgende Zeile in Ihre .DEF-Datei: Foo=wrapped_mytestdll.Foo wo Foo ist der (Mangled) Funktionsname 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 nicht abgefangen werden Anrufe von der Wrapped DLL an sich selbst, da diese nicht durch Ihre IAT gehen.

(Ich habe seit a link to a tool gefunden, um eine grundlegende ". DEF" -Datei zu generieren, aber habe es nicht selbst getestet. Verwenden Sie auf eigene Verantwortung.)

2

Rufen Sie einfach GetProcAddress (hDll, "mytestfunction"), und schreiben Sie jmp hook_mytestfunction dort, dann platzieren Sie 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.