0

MS Detours を使用して win32 API 関数「CreateFile」をフックしようとしていますが、MS Word を使用して *.doc ファイルを開いてテストすると、MS Word によってロードされた DLL およびフォント ファイルとディレクトリの CreateFile 呼び出しが迂回先にリダイレクトされます。その *.doc ファイルではありませんが、メモ帳を使用して *.txt ファイルを開くと、その *.txt ファイルの CreateFile 呼び出しが回り道した関数に届きます。

CreateFile をフックするために次のコードを使用しています。

static HANDLE (WINAPI *Real_CreateFile)(LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile) = CreateFile;

HANDLE WINAPI Routed_CreateFile(LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile)
{
OutputDebugString(lpFileName);
return Real_CreateFile(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile);
}

BOOL APIENTRY DllMain( HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved )
{
LONG Error;
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:

    OutputDebugString(L"Attaching MyDLL.dll");
    OutputDebugString(strInfo);
    DetourRestoreAfterWith();
    DetourTransactionBegin();
    DetourUpdateThread(GetCurrentThread());
    DetourAttach(&(PVOID&)Real_CreateFile, Routed_CreateFile);
    Error = DetourTransactionCommit();

    if (Error == NO_ERROR)
        OutputDebugString(L"Hooked Success");
    else
        OutputDebugString(L"Hook Error");

    break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
    OutputDebugString(L"De-Attaching MyDLL.dll");
    DetourTransactionBegin();
    DetourUpdateThread(GetCurrentThread());
    DetourDetach(&(PVOID&)Real_CreateFile, Routed_CreateFile);
    Error = DetourTransactionCommit();

    if (Error == NO_ERROR)
        OutputDebugString(L"Un-Hooked Success");
    else
        OutputDebugString(L"Un-Hook Error");

    break;
}
return TRUE;
}

前もって感謝します。

4

2 に答える 2

3

この後にa が欠けていると思いますbreak

case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
    break;  // Not interested in thread messages
case DLL_PROCESS_DETACH:

迂回路が呼び出される前に切り離しているだけですか?おそらく、 a を開くと.doc新しいスレッドが作成されますが、 a は作成さ.txtれず、このコードパスがトリガーされます。

于 2013-01-09T13:47:35.413 に答える
1

Real_CreateFile 関数ポインタを適切に初期化していないようです。モジュールの CreateFile のインポート テーブル エントリに設定していると思います。

代わりに、初期化してGetProcAddress(GetModuleHandle("kernel32"),"CreateFileW");

于 2013-01-10T16:06:45.447 に答える