背景情報を少し紹介します。私は、AppInit_DLLs
レジストリ エントリを介して dll インジェクション手法で使用されている dll を置き換えることに取り組んでいます。その目的は、すべてのプロセスに存在し、GDI32.dll にフックを設定して、印刷に関する情報を収集することでした。これは、私たちが望むものを手に入れるための一種のファンキーな方法です。.dll 自体は 10 年以上前のもの (Visual Studio 97 で記述) であり、挿入された dll よりも少し侵襲性の低いものに置き換えたいと考えています。
おそらく私たちがSetWindowsHookEx()
探しているもののようです。私はそれでいくつかの問題を抱えていましたが、このツリーが吠える価値があるかどうかについて同僚と話し合ったこともあります. 以下は、特定できなかったいくつかの質問です。
たとえば
StartDoc()
GDI32.dll などの DLL からルーチンをフックすると、他のプロセスがその DLL からそのルーチンを使用するたびに通知を受け取るのでしょうか? これは、注入された .dll で取得していた機能の一種であり、今後も同じ機能が必要です。フックがトリガーされると、フック処理手順は、実際の呼び出しを開始したプロセスのプロセス空間で実行されますか?それとも、フックをセットアップしたプロセスのプロセス空間で実行されますか? 私の意見では、ルーチンを呼び出したプロセスのプロセス空間で実行する必要があります。たとえば、プログラムが呼び出す場合
StartDoc()
GDI32.dll から、フック処理プロシージャ コードがそのスペースに「注入」され、実行されます。それ以外の場合は、呼び出しプロセスとフックをセットアップするプロセスとの間で自動的にセットアップされるプロセス間通信が必要になりますが、そうではないと思います。また、このフック処理ルーチンが呼び出しプロセスのプロセス空間で実行される必要があるのは、それが知る必要があることの 1 つはその呼び出しプロセスの名前であるためです。実際にはそのプロセスで実行されていませんでした。フック処理ルーチンが .NET 管理環境を使用して記述されている場合、.NET 管理環境を利用していないプロセスにフックされると壊れますか? ここで C++ から離れて C# を使用したいのですが、管理されていないプロセスからフックが呼び出されたらどうなるでしょうか? 前に述べたように、フック処理手順は、フックされたルーチンを最初に呼び出したプロセスで実行されると思います。しかし、これが本当なら、このプロセスが .NET ランタイム環境を使用していないのに、着信フック処理コードが使用していると問題が発生すると思います。