在挂钩启动新线程时解除挂钩进程

Unhooking a hooked process when the hook starts a new thread

本文关键字:进程 启动 新线程 线程      更新时间:2023-10-16

>我创建了一个简单的钩子,我安装了

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 代码(却没有?

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

Hans 从 MS 文档中指出了这一点 钩子:

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

所以基本上,是的,IPC 从钩子程序到挂钩程序进行通信,是时候卸载了,线程旋转需要停止是实现这一目标的唯一方法。谢谢汉斯。