c++ - 使用 UnhookWindowsHookEx() 解除 Hook 时,多个程序崩溃

标签 c++ windows winapi detours

我正在做一个全局钩子(Hook)以将我的 DLL 添加到钩子(Hook)链中:

HHOOK handle = SetWindowsHookEx(WH_CALLWNDPROC, addr, dll, 0);

在我的 DLL 中,我使用 Detours 拦截多个 WINAPI 函数调用。一切正常,除了 WaitForSingleObject 调用。每当我将 WaitForSingleObject 添加到迂回函数时,当我解开我的 DLL(Chrome、Skype 等)时,有几个程序会崩溃。 DLL 的外观如下:

DWORD (WINAPI* Real_WaitForSingleObject)( HANDLE hHandle, DWORD dwMilliseconds) = WaitForSingleObject;
DWORD WINAPI Mine_WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds);
INT APIENTRY DllMain(HMODULE hDLL, DWORD Reason, LPVOID Reserved) {

    switch(Reason) {
        case DLL_PROCESS_ATTACH: 
            DetourTransactionBegin();
            DetourUpdateThread(GetCurrentThread());
            DetourAttach(&(PVOID&)Real_WaitForSingleObject, Mine_WaitForSingleObject);
            DetourTransactionCommit();
            break;
        case DLL_PROCESS_DETACH: 
            DetourTransactionBegin(); 
            DetourUpdateThread(GetCurrentThread());
            DetourDetach(&(PVOID&)Real_WaitForSingleObject, Mine_WaitForSingleObject);
            DetourTransactionCommit();
            break;
        case DLL_THREAD_ATTACH:

            break;
        case DLL_THREAD_DETACH:

            break;
    }
    return TRUE;
}
DWORD WINAPI Mine_WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds) {

    return Real_WaitForSingleObject(hHandle, dwMilliseconds);
}

extern "C" __declspec(dllexport) int meconnect(int code, WPARAM wParam, LPARAM lParam) {

    return CallNextHookEx(NULL, code, wParam, lParam);
}

有人可以帮助我理解为什么会发生这种情况以及如何解决该问题吗?谢谢!

最佳答案

我认为发生这种情况是因为许多程序(Chrome、Skype 等)都有一个线程池,其中后台线程正在等待 WaitForSingleObject() 以等待他们感兴趣的事情发生,以及何时发生,那个线程[s]醒来并做一些事情。

因此,您的线程 A 正在调用 DetourDetach,而同一进程的另一个线程 B 当前在 Mine_WaitForSingleObject() 中,然后 DLL 卸载,一切都崩溃了。您可以使用调试器进行验证,附加到有问题的进程,在 DLL_PROCESS_DETACH 中设置断点,当断点命中时,查看另一个线程的堆栈以查找 Mine_WaitForSingleObject。

我不确定如何解决。 但是,您可以尝试一种方法——枚举线程,并为进程的每个线程调用 DetourUpdateThread()。这样一来,Detours 可能会对此有所作为。

关于c++ - 使用 UnhookWindowsHookEx() 解除 Hook 时,多个程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33713966/

相关文章:

c++ - 指向对象表示元素的指针还是指向所提供存储的元素的指针?

c++ - 使用 OpenCV 和机器学习的简单对象检测

c++ - 空 vector 占用的空间是否与指向当前设置为 nullptr 的类型的指针一样多?

c++ - 使用 CMake、Clang 和 Ninja 在 Windows 上构建 c++ 项目

winapi - 如何使用 win32 API 更改组合框的颜色

c++ - clang 中的 constexpr 错误,但 gcc 中没有?

windows - 使用 IE8 进行身份验证时更改域

python - 在 Python 中检测 Windows 8.1?

代码更正以使 RASENUM 连接在 XP 中工作

c# - Win32_Processor 和 Win32_NetworkAdapterConfiguration WMI 方法在 Windows 8 中可用吗?