5 Stimmen

Möglich, einen Haken mit SetWindowsHookEx Laufzeit gemacht zu deaktivieren?

Wenn eine Anwendung (z. B. meine oder ein externer Prozess) SetWindowsHookEx aufruft, könnte ich dann den Hook wieder lösen? Denken Sie daran, dass ich den Hook nicht selbst erstellt habe, ich habe also keine Variablen oder Verweise auf die ursprünglichen Hooks.

5voto

Kevin Montrose Punkte 21631

Nein, die gibt es nicht.

Früher (vor der NT-Ära) konnte man einige Spiele mit einem HHOOK spielen, das man erhalten hatte, da die zurückgegebenen HHOOK war ein Glied in der Kette der Haken angerufen werden. Selbst dann bin ich nicht sicher, ob es möglich war.

Heute delegiert Windows den Aufruf des nächsten Hooks in der Kette nicht mehr an Sie (daher der veraltete Parameter für CallNextHookEx ) und HHOOKs lassen Sie nicht mehr an Haken gelangen, die Sie nicht registriert haben.


Genauer gesagt, gibt es keine gut und unterstützt Weg, dies zu tun.
Man könnte ein Rootkit installieren, tief in die Interna von Windows eindringen und auf diese Weise die Hakenkette finden, aber das ist natürlich lächerlich - und gefährlich -.

Hooking (über eine der zahllosen API-Hooking-Lösungen, die es gibt, Umwege scheint beliebt zu sein) SetWindowsHookEx y CallNextHookEx kann Ihnen bei Anwendungen, die den Konventionen der Vor-NT entsprechen, den größten Teil des Weges weisen. Das Wesentliche ist, dass neue Hooks sofort nach dem Aufruf von SetWindowsHookEx ausgehängt werden und alle übergebenen Hooks (die nicht Ihre eigenen sind) an CallNextHookEx ausgehängt werden. Um eine "saubere" Anwendung zu gewährleisten, müssen Sie auch eine Reihe von Ereignissen simulieren, um zu erzwingen, dass bereits aufgerufene Hooks aufgerufen werden, damit sie ausgehakt werden können. Außerdem wird dieses System scheitern, sobald Sie auf eine der in den letzten 8+ Jahren geschriebenen Anwendungen stoßen, die NULL an CallNextHookEx übergeben.

Auch wenn es sich also um technisch (vielleicht) möglich ist, HHOOKs abzuhängen, die Ihre Anwendung nicht registriert hat, sind Sie wahrscheinlich besser dran, wenn Sie versuchen, das, was Sie wollen, auf eine andere, weniger schrecklich brüchige Weise zu erreichen.

1voto

ralphtheninja Punkte 116647

Ich glaube nicht, dass du das kannst. Sie benötigen den Griff zum Haken, der mit SetWindowsHookEx() damit Sie ihn mit UnhookWindowsHookEx()

Hmms btw, wenn Sie irgendwie Ihren eigenen Hook erstellen könnten, bevor ein anderer Hook registriert wird (d.h. während des Starts der Anwendung), könnten Sie in diesem Hook wählen, nicht aufzurufen CallNextHookEx() und verhindern so, dass nachfolgende Hooks aufgerufen werden. Es könnte sich lohnen, das zu überprüfen. Ich vermute, dass dies nicht für alle Arten von Hooks möglich ist.

1voto

Jorge Branco Punkte 2395

Ich glaube, ich habe herausgefunden, dass dies möglich ist. Hooking CallNextHook gibt Ihnen die Hook-ID des Hooks, die Sie verwenden können, um unhook.

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