我正在做一个全局钩子(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/