gpt4 book ai didi

c++ - 当钩子(Hook)启动一个新线程时取消 Hook 一个钩子(Hook)进程

转载 作者:行者123 更新时间:2023-11-30 04:55:49 31 4
gpt4 key购买 nike

我创建了一个简单的钩子(Hook),我安装了它

SetWindowsHookEx(WH_CBT, addr, dll, 0);

完成后,我卸载

UnhookWindowsHookEx(0);

然后我可以看到注入(inject)的 DLL 从被调用的注入(inject) DLL 的 DllMain 中的钩子(Hook)进程中卸载

DllMain(..., DLL_PROCESS_DETACH, ...)

但是,如果我注入(inject)的 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();
}
}

然后注入(inject)的 DLL 不会卸载。正在运行的线程使其继续运行。

要卸载 DLL,我有哪些选择?在我调用 UnhookWindowsHookEx() 时,我可以使用 IPC 让所有 Hook 的进程知道是时候关闭额外的线程了,但这感觉有点多余,因为已经通过 UnhookWindowsHookEx() 进行了一些通信。

除了 IPC 之外,是否有其他方法可以在 Hook 进程中发现 UnhookWindowsHookEx() 已被调用,然后彻底关闭我启动的所有线程?旋转阻止 dll 卸载的线程,但使用 Minhook 拼接我的 dll 代码等其他事情却没有?

最佳答案

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

Hans 从 MS documentation on hooking 中指出了这一点:

The system eventually frees the DLL after all processes explicitly linked to the DLL have either terminated or called FreeLibrary and all processes that called the hook procedure have resumed processing outside the DLL.

所以基本上,是的,从 Hook 程序到 Hook 程序的 IPC 通信是时候卸载并且需要停止线程旋转是完成此操作的唯一方法。谢谢汉斯。

关于c++ - 当钩子(Hook)启动一个新线程时取消 Hook 一个钩子(Hook)进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52896848/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com