问题标签 [unhookwindowshookex]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
winapi - 解除全局 CBT 挂钩后从所有进程中卸载 DLL
当加载它们的系统范围的钩子被卸载时,如何从所有进程中正确卸载 DLL?
来自MSDN:
您可以使用 UnhookWindowsHookEx 释放全局挂钩过程,但该函数不会释放包含挂钩过程的 DLL。这是因为全局挂钩过程在桌面中每个应用程序的进程上下文中被调用,从而导致对所有这些进程的 LoadLibrary 函数的隐式调用。由于无法为另一个进程调用 FreeLibrary 函数,因此无法释放 DLL。在显式链接到 DLL 的所有进程都已终止或调用 FreeLibrary 并且调用挂钩过程的所有进程都已恢复 DLL 外部的处理后,系统最终会释放 DLL。
所以我正在寻找的是一种检测钩子何时脱钩的方法,然后FreeLibrary
从所有被钩子的进程中调用。卸载钩子时,是否有任何其他方法可以立即卸载 DLL?
c++ - 即使在异常终止时,如何确保调用 UnhookWindowsHookEx?
不幸的是,MSDN 对它不够清楚。我正在编写一个使用全局钩子的程序,我担心如果程序异常终止(崩溃、被用户杀死等)会发生什么。
当进程终止时,Windows 是否会自动解除进程安装的全局挂钩?
如果没有,是否可以在另一个进程中调用 UnhookWindowsHookEx() 来释放钩子?(如果它检测到安装程序进程已死,我正在考虑在挂钩线程中执行此操作。)
如果答案是“否”和“否”,那么当安装程序终止时让全局钩子处于活动状态不是很危险吗?处理这种情况的标准方法是什么?
我在 MSDN 中读到 UnhookWindowsHookEx() 不会释放在其他进程中加载的 dll,但它没有说明何时释放 dll。CodeProject 中的这篇文章似乎表明当第一条消息到达挂钩线程时,dll 未映射(在相应的进程中),因此它大约在 UnhookWindowsHookEx() 调用之后。这是真的吗?
谢谢你。
c++ - 卸载注入的 DLL
我有一个 DLL,我使用SetWindowsHookEx
. 在 DLL 中,我通过调用来增加模块的引用计数器,GetModuleHandleEx
这样我就可以控制何时卸载模块。
此时,来自这两个 API 调用的模块引用计数“应该”为 2。当调用进程关闭时,它调用UnhookWindowsHookEx
,将引用计数减为 1。DLL 有一个线程等待一些事情,其中之一是调用 的进程的句柄SetWindowsHookEx
。当进程消失时,DLL 会进行一些清理,终止所有线程,清理内存和句柄,然后调用FreeLibraryAndExitThread
. 这会递减计数器并卸载 DLL。
这是我的问题。有一些进程,尤其是那些没有 UI 的进程,DLL 永远不会被卸载。我很有信心我已经清理了所有东西。而且我知道我的所有线程都没有运行。
首先,如果您有任何故障排除技巧来帮助找出原因,那将很有帮助。否则,我正在考虑使用一些 API,例如NtQueryInformationProcess
获取模块地址并确认模块句柄计数实际上为零,然后调用CreateRemoteThread
以注入调用以LdrUnloadDll
从进程中卸载模块地址。您对这种方法有何看法?有没有人有任何示例代码?我很难找出如何获取模块句柄计数。
c# - 如何正确解挂?
我做了一个非常简单的 Hook 代码(我是初学者)。
我打开记事本并测试。
如果我按 ANY 键,它会发出哔哔声并自行打印。
除“x”键外,它是一个终止键。
问题:
我不想看到打印的“x”键。我刚退出程序。我需要做什么 ?
wpf - UnhookWindowsHookEx 产生 ERROR_INVALID_HOOK_HANDLE?
我正在尝试在 WPF 中实现一个后台应用程序,该应用程序仅在右键单击屏幕顶部时才执行某些操作,因此我尝试了 hooking WH_MOUSE_LL
,效果很好。问题是在退出应用程序时取消回调,这在 C 中工作得非常好,但ERROR_INVALID_HOOK_HANDLE
在 C# 中给了我,即使传递给的钩子句柄UnhookWindowsHookEx
与我得到的句柄完全相同SetWindowsHookEx
(下面的示例)。
编辑:我刚刚创建了一个简单的 C# 控制台应用程序,注册了相同的钩子并立即取消注册它,它也可以正常工作,所以我认为 WPF 可能会导致问题。
这是不起作用的 C# 代码,问题出在析构函数中:
以下是完美运行的 C 代码:
java - Java JNA:如何将整数(int)转换为 HHOOK?
我想解开所有钩子消息(环 3)并且不能,因为在 Java 中似乎不可能从int
forHHOOK
类型转换。
有人知道如何解决这个问题吗?
谢谢你。
c++ - 多次取消使用 SetWindowsHookEx 设置的钩子会使钩子进程崩溃
我正在尝试挂钩目标应用程序的键盘和鼠标事件。我遵循了 SO question How to hook external process with SetWindowsHookEx 和 WH_KEYBOARD,并且第一次正确安装和卸载了这些钩子。但是,在我卸载钩子一次然后再次安装后,第二次尝试卸载钩子会使目标应用程序崩溃。钩子的目的是监控应用程序空闲时间,以便我可以在应用程序空闲时执行一些任务。对于问题的长度,我深表歉意,但我试图提供所有可能有帮助的细节谢谢
我需要能够根据系统托盘图标中的菜单命令安装和卸载挂钩。我有一个控制台应用程序 [HookApp],它调用 DLL [HookDLL] 中的安装和卸载方法。控制台应用程序还创建一个窗口来处理菜单事件。我使用窗口的线程来实际安装和卸载钩子,因为安装钩子的同一线程必须卸载它。控制台和窗口都必须是不可见的。只有系统托盘图标及其相关菜单必须可见。我从命令行使用参数 i 启动挂钩应用程序。目标进程的ProcessId ii。进程名称 iii. 空闲时间 [以秒为单位] - 在 DLL 中启动操作之前的空闲时间我想知道我在 HookProcs 中启动的计时器是否对崩溃负责。
事件查看器日志错误应用程序名称:notepad.exe,版本:10.0.17134.1,时间戳:0x9d4727c2 错误模块名称:HookDLL_x64.dll_unloaded,版本:0.0.0.0,时间戳:0x5c31aabd 异常代码:0xc0000005 错误偏移量:0x00000000000ba505 错误进程: 0x2bac
异常代码似乎表明内存访问冲突。
我尝试了以下 I.a. 从 HookApp b 调用带有 HWND_BROADCAST 的 SendMessageTimeout API。使用 HWND_BROADCAST 从 HookDLL 调用 SendMessageTimeout API,基于Unloading DLL from all processes after unhook global CBT hook
二、一个。在 DLL_PROCESS_DETACH 和 DLL_THREAD_DETACH 的 DLLMain 方法中调用 FreeLibraryAndExitThread API - 一起和单独基于http://www.rohitab.com/discuss/topic/42505-unloading-dll-crashes-exe/
三、使 HookApp 控制台和窗口可见和隐藏,看看它是否有任何区别
四。由于 64 位架构,无法尝试以下操作 https://www.unknowncheats.me/forum/programming-for-beginners/73377-unload-injected-dll-thread-process.html
我提到的其他链接 使用 UnhookWindowsHookEx() 解除挂钩时,多个程序崩溃 b. 如何正确使用 SetWindowsHookEx & CallNextHookEx c. 卸载注入的 DLL d. FreeLibraryAndExitThread 在卸载注入的 DLL 时使程序崩溃
- DLL [HookDLL] 方法中的 SendMessageTimeout 卸载立即使应用程序崩溃
- 应用程序 [HookApp] 中的 SendMessageTimeout 似乎没有做任何有用的事情。
- FreeLibraryAndExitThread 似乎没有做任何有用的事情。但是,使用 2 和 3,我想我可以第二次安装挂钩。没有它们,第一次取消挂钩会使应用程序崩溃。
- 由于 64 位架构,我无法尝试使用内联汇编语言的建议。
请帮忙。