>我创建了一个简单的钩子,我安装了
它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 从钩子程序到挂钩程序进行通信,是时候卸载了,线程旋转需要停止是实现这一目标的唯一方法。谢谢汉斯。