1

1 つまたは複数の外部プロセスに dll を挿入する必要があります。そこから、keybord イベントも傍受したいと考えています。そのため、WH_KEYBOARD で SetWindowsHookEx を使用すると、1 つのステップで両方を実現する簡単な方法のように見えます。

いくつかの選択されたプロセスにのみ関心がある場合、グローバルフックをインストールしたくありませんが、Windows フックはグローバルまたはスレッドのみのようです。

私の質問は、プロセス全体のフックを適切に設定する方法です。

1つの方法は、アプリケーションからターゲットプロセスのメインスレッドにフックを設定し、DLL_PROCESS_ATTACHで他のすべての実行中のスレッドに対してDLL_PROCESS_ATTACHで同じことを行うことです(さらに後で開始されたスレッドのDLL_THREAD_ATTACHで)。しかし、これは本当に良い方法ですか?さらに重要なことは、プロセス全体のフックをセットアップする簡単な方法はありませんか? 私のアイデアはかなり面倒で醜いように見えますが、これを行うことに関する情報はどこにも見つかりませんでした。

4

1 に答える 1

3

この投稿のコードを確認してください。必要と思われることを実行しているまともなコードがいくつかあります。これは、あなたの場合に最適なグローバルフックを使用します。

編集:

特定のスレッドを監視するために特定のプロセスにフックを挿入する方法を知りたいというベンのコメントへの返信:

  • インジェクター プロセスが管理者権限で実行されていることを確認します。
  • インジェクター コードで OpenProcess を実行し、SeDebugPrivilege priv を取得します。
  • PROCESS_CREATE_THREAD、VM_READ / WRITE特権を使用して、ターゲットでOpenProcessを使用します。
  • VirtualAlloc ターゲット プロセスの一部のメモリを PAGE_EXECUTE_READWRITE にします。
  • フック DLL のパスと名前をそのメモリに書き込みます。
  • kernel32 のモジュール ハンドルを取得します。
  • kernel32 で LoadLibraryW の proc アドレスを取得します。
  • ターゲットで CreateRemoteThread を呼び出し、LoadLibraryW のアドレスと、割り当てたフック dll 文字列のアドレスを指定します。
  • ロードが完了するまでリモート スレッドで WaitForSingleObject
  • 掃除

フックするプロセスごとに繰り返すことを忘れないでください。また、フックコードがフックされたプロセスのスレッドの作成/削除を処理することを確認して、それらのスレッドもフックできるようにします。

グローバルな WH_KEYBOARD フックが悪い考えであると読んだ場合、このアプローチがさらに悪い理由を理解し始めることができます。

于 2010-06-10T19:44:28.920 に答える