C++ 当钩子开始一个新线程时,将钩子进程解钩

C++ 当钩子开始一个新线程时,将钩子进程解钩,c++,hook,ipc,C++,Hook,Ipc,我创建了一个安装时使用的简单挂钩 SetWindowsHookEx(WH_CBT, addr, dll, 0); DllMain(..., DLL_PROCESS_DETACH, ...) 完成后,我将使用卸载 UnhookWindowsHookEx(0); 然后我可以看到注入的DLL从被调用的注入DLL的DllMain中的挂接进程卸载 SetWindowsHookEx(WH_CBT, addr, dll, 0); DllMain(..., DLL_PROCESS_DETACH, ...

我创建了一个安装时使用的简单挂钩

SetWindowsHookEx(WH_CBT, addr, dll, 0);
DllMain(..., DLL_PROCESS_DETACH, ...)
完成后,我将使用卸载

UnhookWindowsHookEx(0);
然后我可以看到注入的DLL从被调用的注入DLL的DllMain中的挂接进程卸载

SetWindowsHookEx(WH_CBT, addr, dll, 0);
DllMain(..., DLL_PROCESS_DETACH, ...)
但是,如果我的注入DLL启动一个简单线程,则如下所示:

LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
...
    static bool alreadyHooked = false;
    switch (nCode)
    {
    case HCBT_ACTIVATE:
    {
        if (alreadyHooked)
        {
            break;
        }
        alreadyHooked = true;
        std::thread([&]
        {
            for (;;)
            {
                Sleep(1000);
            }
        }).detach();
    }
}
然后注入的DLL不会卸载。运行的线程使其继续运行

要卸载DLL,我有哪些选项?我可以使用IPC让所有挂接的进程知道,在调用unhookwindowshookx()时,是时候关闭额外的线程了,但这感觉有点多余,因为已经有一些通信通过unhookwindowshookx()进行


除了IPC之外,还有没有其他方法可以在钩住的进程中发现unhookwindowshookx()已被调用,然后彻底关闭所有我启动的线程?旋转线程阻止dll卸载的原因是什么,而使用Minhook拼接我的dll代码等其他方法却没有这样做?

我前一段时间问过这个问题,@Hans Passant在评论中基本上回答了这个问题,但由于没有正式答案,它随后被自动删除。觉得带着答案回来是值得的

汉斯指出,

当所有显式链接到DLL的进程终止或调用FreeLibrary,并且所有调用钩子过程的进程在DLL外部恢复处理后,系统最终释放DLL

因此,基本上,是的,IPC从挂钩程序到挂钩程序的通信,是时候卸载了,线程旋转需要停止,这是实现这一点的唯一方法。谢谢你,汉斯