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.
Antworten
Zu viele Anzeigen?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.
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.