1

私はいくつかの Windows 関数(GetOpenFileNameA, GetOpenFileNameW, GetSaveFileNameA, GetSaveFileNameW)を MHook ライブラリでフックするこのプロジェクトを持っています。これは、フックをインストールするために使用するコードです。

for(size_t i = 0; i < FunctionsCount; ++i)
{
    HMODULE hModule = GetModuleHandleA(Function[i].ModuleName);

    //[1]
    if( !hModule )
        return FALSE;

    *Function[i].Original = GetProcAddress(hModule, Function[i].Name);

    if(*Function[i].Original == NULL)
        return FALSE;

    if(!Mhook_SetHook(Function[i].Original, Function[i].Hooked))
        return FALSE;
}

理由から呼び出されDllMainます。DLL_PROCESS_ATTACH

さて、このアプローチを使用して Dll を挿入すると、CreateRemoteThreadかなりうまく機能しますが、LoadAppInit_DLLsメカニズムを使用してシステム全体のフックをセットアップしたい場合、フックが機能しません。何時間もデバッグした後、その理由は Dll が BEFORE comdlg32.dll(これらの関数があるモジュール) にロードされ、ステートメント[1]が false を返し、Dll がロードされないことが原因であることがわかりました。

私がこれまでに行った解決策は、false を返すLoadLibrary場合に呼び出すことです。[1]

HMODULE hModule = GetModuleHandleA(Function[i].ModuleName);

//[2]
if( !hModule )
{
    LoadLibraryA(Function[i].ModuleName);
    hModule = GetModuleHandleA(Function[i].ModuleName);
}

私はこれが悪だと言っている多くのサイトを見つけました。また、プロセスが一般的なダイアログをまったく使用しない場合は、決して呼び出されない関数をフックしています。

誰かが助けてくれれば、回避策やグローバルフックを設定する別の方法の説明をいただければ幸いです。前もって感謝します

4

1 に答える 1

4

関数をフックする必要がありLoadLibraryXXX、実行が成功した後、モジュールがロードされているかどうかを確認し ( を呼び出してGetModuleHandle)、ロードされている場合はフックします。

また、フックされた dll を固定して、アンロードされないようにすることをお勧めします。

于 2013-09-18T10:23:29.663 に答える