2011-12-19 7 views
8

SetWindowsHookEx APIを使用してWindowsにグローバルにインストールされたフックの一覧を取得するにはどうすればよいですか?インストールされているWindowsフックのリスト

+0

@DavidStratton彼は 'SetWindowsHookEx'と呼ばれるものすべてのリストを要求していると思います。 – vcsjones

+0

キーボードなど。 SetWindowsHookExは、アプリケーション定義のフックプロシージャをフックチェーンにインストールします。私はこのフックチェーンを取得したい。 – lightstep

+0

これ自体はできません。あなたは何を達成しようとしていますか? – Michael

答えて

3

悪意のある方法は、他のものがチャンスを得る前に、すべてのフッキング機能をフックすることです。

+0

私のフックがCallNextHookExを呼び出すときにいくつの登録フックが続くかは分かりませんが、他のものの前に呼び出される私自身のフックをインストールすることは可能です。 – lightstep

+0

フックのようなものではありません。 'SetWindowsHookEx'の関数フックをインポートします。このようにして、プロセスがその関数を呼び出したときにカウントすることができます。 – kichik

+0

誰かが呼び出す前にSetWindowsHookExを確実にフックすることができますか? – lightstep

5

installeを列挙、他の操作に比べフックを見つける


を参照してください。 d フックは非常に簡単です。

スレッド固有のフックは、スレッドごとのwin32kデータ 構造体にTHREADINFO 1として想像して記録されます。これは本質的にETHREAD/TEBのような構造ですが、具体的にはユーザーとgdiの情報に合わせて を調整しました。 です。そのメンバーの1つである (aphkStart)はポインタの16要素の配列で、個別に を指すか、またはHOOK構造のリンクリストの先頭です。 フックを列挙することは、単にそれらの鎖を歩く尺度に過ぎません。

フックが設定されている場合は便宜的に、またおそらく反復を必要としないように THREADINFOには別のメンバーfsHooks、ビットフィールドである が含まれています。ビットがオンの場合、 フック配列の対応するインデックスが有効です。 33の比較の代わりに(NULLの場合は16、forループの場合は の17)、フックがあるかどうかを伝えるには、ちょうど1つ、気の利いた!デスクトップ2ごとある

グローバルフックは、さらにまた、想像(DESKTOPINFO)と命名 ごとのオブジェクト構造に格納され、そして も添付ビットフィールドを配列に格納されています。 の2つのブリッジは、所有する DESKTOPINFOを指すTHREADINFOのメンバーであるpDeskInfoです。

イントロで腹が立っているにもかかわらず、これらのすべての文書化されていない構造で作業することは、実際にはあまりにも難しいことではありません。 win32k.sysのWindows 7シンボルにはレイアウトが含まれています。 Vista/Server 2008の時代のシンボルはありませんが、これは のアセンブリ学習が来てその日を節約するところです。これらの構造がどのように見えるかを知る

は、それらの上に私たちの汚いミトンを得た別の...

である彼らになって、一つのことで、私たちはHOOK構造のレコードを検索 関連情報そのものの最も:

struct tagHOOK 
{ 
    THRDESKHEAD head; // info about the creator 
    struct tagHOOK* phkNext; // next entry in linked list 
    int iHook; // WH_ hook type 
    UINT_PTR offPfn; // RVA to hook function in ihmod library 
    UINT flags; // HF_ flags (GLOBAL, ANSI) 
    int ihmod; 
    THREADINFO* ptiHooked; // the hooked thread 
    PVOID rpDesk; // saved desktop pointer 
    ULONG nTimeout :7; 
    ULONG fLastHookHung :1; 
}; 

あなたはsoftware here


をダウンロードすることができます

インストールグローバルフックを検出するための概要は次のとおりです。

  1. コールPsGetCurrentThreadと現在のスレッドのETHREAD構造を取得します。 ETHREADは、 MSDNのドキュメントに従った不透明なデータ構造です。
  2. PsGetThreadWin32Threadを呼び出してTHREADINFO構造体を抽出します。どちらも文書化されていません。
  3. DESKTOPINFOを抽出します。
  4. ここには、すべてのグローバルにインストールされたフックがあります。それらは配列で構成されています。各要素はリンクされたリストで、 特定のフック(WH_ *)に対応します。

インストールローカルフックを検出するための概要は次のとおりです。スレッドIDを与えられた

  1. PsLookupThreadByThreadIdを呼び出し、指定されたスレッドのETHREAD構造体を取得します。
  2. PsGetThreadWin32Threadを呼び出してTHREADINFO構造体を抽出します。
  3. ここには、指定したスレッドのすべてのローカルにインストールされたフックがあります。それらは配列で構成されています。各要素は リンクリストで、特定のフック(WH_ *)に対応します。

あなたはsource here


プロセスハッカー2(http://processhacker.sourceforge.net)用のプラグイン、 ディスプレイシステムフックと外しすることができる(右を見ることができますクリックメニュー)。

プロセスのハッカーソースを取得してコンパイルし、 HookTools.vcxprojをPlugins.slnに追加します。 VS 2013が使用された。ライブラリ をVC++ディレクトリに設定します。ここ

しかし、私はまだそれを行うための信頼性の高い方法を発見していない答えを持つ


または関連する質問。

+2

*「このウェブページは利用できません」*。 [良い答えを書くにはどうすればいいですか?](http://stackoverflow.com/help/how-to-answer)を参照してください。具体的には次のようなものです。* "リンクのコンテキストを提供する:外部リソースへのリンクが推奨されますが、あなたの仲間のユーザーは、それが何であるか、そしてなぜそれがあるのか​​をいくつか考えているでしょう。**ターゲットサイトに到達できない場合、または永久にオフラインになった場合に備えて、常に重要なリンクの最も関連性の高い部分を引用します** " – IInspectable