5

アプリケーション (たとえば、私のもの、または外部プロセス内) が SetWindowsHookEx を呼び出した場合、フックを解除することは可能でしょうか? フックを最初に作成したのは私ではないので、元のフックへの変数やポインターは一切ありません。

4

3 に答える 3

5

いいえ、ありません。

当時 (NT 以前の時代)、返されたHHOOK は呼び出されるフックのチェーン内のリンクであったため、取得した HHOOK を使用していくつかのゲームをプレイすることで問題を回避できた可能性があります。それでも、それが可能だったかどうかはわかりません。

現在、Windows はチェーン内の次のフックの呼び出しをユーザーに委譲しません (したがって、 CallNextHookEx の廃止されたパラメーター)、 HHOOKでは、ユーザーが登録していないフックにアクセスすることはできません。


より適切には、これを行うための適切でサポートされている方法はありません。
ルートキットをインストールし、Windows の内部を深く掘り下げて、その方法でフック チェーンを見つけることができます。しかし、それは明らかにばかげた、そして危険な長さになります。

フック (無数の API フック ソリューションの 1 つを介して、Detoursが人気があるようです) SetWindowsHookExCallNextHookExは、NT 以前の規則に準拠するアプリケーションのほとんどの方法を取得できます。要点は、SetWindowsHookEx を呼び出した後、すぐに新しいフックをフック解除し、渡されたフック (自分のものではない) を CallNextHookEx にフック解除することです。「クリーンな」アプリケーションを保証するには、いくつかのイベントをシミュレートして、既に呼び出されているフックを強制的に呼び出してフックを解除できるようにする必要もあります。また、この体制は、CallNextHookEx に NULL を渡す過去 8 年以上に作成されたアプリケーションに遭遇するとすぐに失敗します。

したがって、アプリが登録していない HHOOK をアンフックすることは (おそらく)技術的に可能ですが、別の、それほど脆弱ではない方法で目的を達成しようとする方がよいでしょう。

于 2009-06-16T09:55:00.677 に答える
1

実は、そうだと思いました。CallNextHookをフックすると、フックのフックIDが表示され、フックを解除するために使用できます。

于 2009-06-16T12:38:36.117 に答える
1

私はあなたができるとは思わない。UnhookWindowsHookEx()でフックを解除できるように、 SetWindowsHookEx()で登録されたフックへのハンドルが必要です。

うーん、他のフックが登録される前に (つまり、アプリケーションの起動中に) どうにかして独自のフックを作成できた場合、そのフックでCallNextHookEx()を呼び出さないことを選択して、後続のフックが呼び出されるのを防ぐことができます。チェックアウトする価値があるかもしれません。これは、すべてのタイプのフックで可能ではない可能性があると思います。

于 2009-06-16T09:51:00.840 に答える