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从挂钩程序到挂钩程序的通信,是时候卸载了,线程旋转需要停止,这是实现这一点的唯一方法。谢谢你,汉斯