当挂钩启动新线程时,取消挂钩进程的钩子

时间:2018-10-19 16:55:53

标签: c++ hook ipc

我创建了一个用于安装的简单钩子

SetWindowsHookEx(WH_CBT, addr, dll, 0);

完成后,我使用

进行卸载
UnhookWindowsHookEx(0);

然后我可以观察到注入的DLL从注入的DLL的DllMain中的钩子进程中卸载了

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让所有被钩住的进程知道在我调用UnhookWindowsHookEx()时该关闭额外的线程了,但这有点多余,因为通过UnhookWindowsHookEx()已经发生了一些通信。

除了IPC之外,是否还有其他方法可以在钩住的进程中发现UnhookWindowsHookEx()已被调用,然后干净地关闭我启动的所有线程?旋转阻止dll卸载的线程有什么用,但是诸如使用Minhook拼接我的dll的代码之类的其他东西却没有?

1 个答案:

答案 0 :(得分:1)

我曾问过这个,@ Hans Passant基本上在评论中回答了它,但是由于没有官方回答,它被自动删除了。感到值得带回一个答案。

Hans在MS documentation on hooking中指出了这一点:

  

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

因此,基本上,是的,IPC从钩子程序与钩子程序进行通信,是时候卸载了,并且需要停止线程加速,这是实现此目的的唯一方法。谢谢汉斯。