我创建了一个用于安装的简单钩子
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的代码之类的其他东西却没有?
答案 0 :(得分:1)
我曾问过这个,@ Hans Passant基本上在评论中回答了它,但是由于没有官方回答,它被自动删除了。感到值得带回一个答案。
Hans在MS documentation on hooking中指出了这一点:
在所有显式链接到DLL的进程已终止或调用FreeLibrary并且所有调用挂接过程的进程已恢复DLL之外的处理之后,系统最终释放DLL。
因此,基本上,是的,IPC从钩子程序与钩子程序进行通信,是时候卸载了,并且需要停止线程加速,这是实现此目的的唯一方法。谢谢汉斯。