SetWindowsHookEx DLL 卸载
Posted
技术标签:
【中文标题】SetWindowsHookEx DLL 卸载【英文标题】:SetWindowsHookEx DLL unloading 【发布时间】:2016-11-09 16:49:09 【问题描述】:我正在使用 SetWindowsHookEx 将 dll 注入另一个进程。但是,当注入程序退出时,dll 会从其他进程中卸载。无论如何我可以停止卸载吗?基本上,无论注入程序是否仍在运行,我都希望 dll 永久存在。如果我能够从 dll 中增加 dll 引用计数,那可能会起作用。但是我还没有找到方法。
【问题讨论】:
用于增加 dll 引用计数 -LdrAddRefDll(0, &__ImageBase);
谢谢。我将您的建议放在 Visual Studio 中,但这些名称未知。有我必须使用的包含文件吗?
自行声明并使用ntdll.lib
【参考方案1】:
存在两种方式 1.) 最有效 - 使用 LdrAddRefDll - 这正是您需要的最短方式。您需要使用 ntdll.lib(或 ntdllp.lib)进行链接。
LdrAddRefDll(0, (HMODULE)&__ImageBase);
2) 效果不好,但有效
WCHAR sz[MAX_PATH];
if (GetModuleFileName((HMODULE)&__ImageBase, sz, RTL_NUMBER_OF(sz)))
LoadLibrary(sz);
【讨论】:
谢谢。我正在写 2).现在我将复制并粘贴:)。至于1),看起来很复杂。如果 2) 不起作用,我会使用它。 当然 1 和 2 都有效。两者都添加了对 dll 的引用,它阻止它卸载 - 现在需要额外的 FreeLibrary。但是 1 - 直接执行此操作。 2 先把&__ImageBase翻译成name,再把name翻译成同样的__ImageBase最后加上reference 成功。我使用 2 是因为我不必更改链接器设置——我什至不知道那在哪里。 DLL_PROCESS_ATTACH 给了我输入 GetModuleFileName 的 dll 句柄。该模块是从新线程加载的,以防 DllMain 出现死锁。 与往常一样,在提议使用未记录的函数调用时,请确保为此添加免责声明。该解决方案可能不适用于所有版本的 Windows,并且可能随时停止工作,恕不另行通知。 @IInspectable - 关于版本 - 在 win2000(可能是和 nt 4.0)、xp、2003、vista、win7、win 8.1、win 10、.. 但可能不可用.. 在这种感觉总有一天会停止工作以上是关于SetWindowsHookEx DLL 卸载的主要内容,如果未能解决你的问题,请参考以下文章
SetWindowsHookEx() 只注册一个本地钩子,同时注入DLL