在挂钩启动新线程时解除挂钩进程
Unhooking a hooked process when the hook starts a new thread
>我创建了一个简单的钩子,我安装了
它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 从钩子程序到挂钩程序进行通信,是时候卸载了,线程旋转需要停止是实现这一目标的唯一方法。谢谢汉斯。
相关文章:
- 在挂钩启动新线程时解除挂钩进程
- 如何制作启动 Python 脚本的 linux 后台进程(在 c 中)
- 由 JOB 中的进程启动的子进程是否可以将 JOB 属性设置为脱离作业?
- 通过服务启动进程后,从SHGetKnownFolderPath 0x80070005错误
- 如何在启动时将 gdbserver 附加到进程?
- 如何在Windows上通过QProcess启动提升的子进程?
- 阻止进程在从服务启动时启动,并在某些进程关闭后继续运行服务。
- 启动-停止守护进程启动的C程序无法捕获信号
- linux通过这个进程启动所有线程
- 将进程作为子进程启动到服务
- QProgressDialog "closes" 当另一个进程启动时
- 进程启动功能
- 窗口在进程启动前没有弹出 ->尝试了 sleep() 方法,但"fails"
- 从c++进程启动Java进程
- COM进程启动,但只有IUnknown是可查询的
- 当使用CreateProcessLogonW或类似的方法启动时,进程启动,但不能运行
- 在进程启动时加载依赖缓存
- 如何确保在后续进程启动时RNG的种子是唯一的
- 如何将应用程序作为新创建的资源管理器进程的子进程启动
- 如何用c++程序在OS X上获取进程启动时间