4

DLL をロードしたシステム全体のフックがアンロードされたときに、すべてのプロセスから DLL を適切にアンロードするにはどうすればよいですか?

MSDNから:

UnhookWindowsHookEx を使用してグローバル フック プロシージャを解放できますが、この関数はフック プロシージャを含む DLL を解放しません。これは、デスクトップ内のすべてのアプリケーションのプロセス コンテキストでグローバル フック プロシージャが呼び出され、それらのすべてのプロセスに対して LoadLibrary 関数が暗黙的に呼び出されるためです。別のプロセスに対して FreeLibrary 関数を呼び出すことはできないため、DLL を解放する方法はありません。DLL に明示的にリンクされたすべてのプロセスが終了するか、FreeLibrary を呼び出し、フック プロシージャを呼び出したすべてのプロセスが DLL の外部で処理を再開した後、システムは最終的に DLL を解放します。

だから私が探しているのは、フックがフックされていないことを検出し、フックFreeLibraryされたすべてのプロセスから呼び出す方法です。フックがアンロードされたときに DLL を即座にアンロードする他の方法はありますか?

4

2 に答える 2

5

フックdllは、メッセージループでアンロードされます。それらにメッセージループを渡すように強制すると、それらをアンロードするのに役立ちます。

UnhookWindowsHookExの後にこれを追加して、すべてのメッセージループを強制的にウェイクアップさせます。

DWORD dwResult;
SendMessageTimeout(HWND_BROADCAST, WM_NULL, 0, 0, SMTO_ABORTIFHUNG|SMTO_NOTIMEOUTIFNOTHUNG, 1000, &dwResult);

しかし、私はまだ時々問題を抱えています。どこから来たのかわかりません。ロックされたプロセスがdllのアンロードを妨げる可能性があると思いますが、その証拠はありません。

于 2010-11-02T09:50:29.283 に答える
1

一般に、が必要でない場合FreeLibraryは、グローバルウィンドウフックを使用する必要があります。これを実行したい場合は、DLLインジェクションを使用できます(たとえば、 http://www.codeproject.com/KB/threads/winspy.aspxおよびhttp://www.codeproject.com/KB/system/hooksysを参照してください。 aspxCreateRemoteThreadLoadLibraryテクニックに関して。この場合、リモートプロセスで必要なことを実行できます。両方の手法を組み合わせることができます。

FreeLibraryDLLの更新のみを呼び出す場合は、別の方法でこれを行うことができます。ロードされたすべてのDLLは、(たとえばcmd.exeで)一時的な名前に名前を変更できMoveFileExMOVEFILE_DELAY_UNTIL_REBOOTフラグを使用して呼び出すことができます。その後、DLLの新しいバージョンをすでにコピーして使用できます。古い1つのDLLは、コンピュータの次回の再起動時に削除されます。

于 2010-07-02T11:36:27.027 に答える