一个关于全局HOOK卸载的问题?

树木 2003-11-29 02:48:37
使用UnhookWindowsHookEx函数卸载全局HOOK后,函数成功返回,但包含HOOK的DLL仍然被系统中某些进程映射,最长的需要十多分钟才释放。这真是太不方便了,修改DLL后想更新调试一下需要漫长的等待。唉,真烦,不知哪位高手有好办法,能够催一催那些进程,让它们既然不用,就释放DLL得了。
(WIN2000系统,DLL是用VC编译的一般的32位DLL)

此外,还有一个疑惑,为什么系统只提供系统级的,以及线程级的HOOK,进程级的为什么不提供呀?
...全文
505 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
smalltalk 2003-12-02
  • 打赏
  • 举报
回复
可以自己用LoadLibrary()来装载含有Hook函数的dll,用完后FreeLibrary(),应该可以立即将系统hook失效。
xia renjie 2003-12-02
  • 打赏
  • 举报
回复
是的,先前我说的的确不对!我自已写了个全局键盘hook,UnhookWindowsHookEx函数调用后
我查询了被HOOK的进程载入的Modules的确已经被卸载了。

写全局HOOK有一个要点就是要建立一个共享变量,用来存入SethookWindowsHookEx()
函数的返回值,如果你没有建立这个共享变量而只是在DLL中建立一个全局变量用来存
放SethookWindowsHookEx()函数返回值,那么会在HOOK生效后被另外的进程载入时
DLL全局变量是空的(如果没有初始化)!!!而如果是共享变量就不会出现问题。这样
造成的问题是在调用CallNextHookEx()时HHook参数将不正确,同样UnhookWindowsHookEx()
的HHook参数也是不正确的。

你说到的进程级HOOK!我理解你的意思是你希望被HOOK的进程建立一个新线程HOOK就要对新线
程生效是这样吧!!!
Windows Ring3下的HOOK其实是消息HOOK。Windows系统接受来自驱动程序的输入消息放入系
统消息队列中,再由windows分发到每一个目的地(线程消息队列,第一个线程都有一个),在
消息到达线程消息队列后首先进入HOOK串列!!!这里就是HOOK过程被系统调用的时机,然后
到达子类过程(如果有),最后才是窗口过程!!!!!!
所以不管进程创建多少个线程只要你的HOOK过程被载入到这个进程中就一定会起作用!所以根
本不存在进程级HOOK。。。也用不着。。。
树木 2003-12-02
  • 打赏
  • 举报
回复
结帖了,最终决定不用全局Hook了。条条大路通罗马,也不能在这里堵死。
感觉MSDN上说的有点模糊......

TO:xia renjie()
“Windows Ring3下的HOOK其实是消息HOOK。Windows系统接受来自驱动程序的输入消息放入系
统消息队列中,再由windows分发到每一个目的地(线程消息队列,第一个线程都有一个),在
消息到达线程消息队列后首先进入HOOK串列!!!这里就是HOOK过程被系统调用的时机,然后
到达子类过程(如果有),最后才是窗口过程!!!!!!
所以不管进程创建多少个线程只要你的HOOK过程被载入到这个进程中就一定会起作用!所以根
本不存在进程级HOOK。。。也用不着。。。”
这段话我没有看懂,不用从实际试验情况来看,为线程设置的Hook是不会作用到进程的其他线程中的。
(如有不同意见,可以在此帖上继续写)
flyelf 2003-12-01
  • 打赏
  • 举报
回复
我也遇到了这个问题,此时如果把工程关闭,然后重新打开,就基本上可以了,估计这个dll是被vc给钩住了
树木 2003-11-30
  • 打赏
  • 举报
回复
大家说一说呀
树木 2003-11-30
  • 打赏
  • 举报
回复
我说进程级HOOK,是因为我觉得线程级的HOOK只能针对某个线程,而进程内的线程可能不只一个,而且是会变化的,如果提供进程级的HOOK,能对进程内的所有线程自动加载HOOK,那岂不是挺方便。
(这么说,还因为好像系统级的HOOK能够对新生成的线程自动加载HOOK,而线程级的却不能)
这一点可能有误,还请指正。
树木 2003-11-30
  • 打赏
  • 举报
回复
TO: xia renjie()
我感觉是调用UnhookWindowsHookEx函数后,其他线程载入的DLL也会被卸掉的。否则岂不是那些常驻内存的线程会永远占用DLL,但实际不是这样的,过一段时间后这些线程还是卸载了DLL,只是时间长短不一样罢了。
至于你说的那个方法,我不太明白。卸载HOOK后,其他线程不会再调用DLL中的方法了吧?
syl5005 2003-11-29
  • 打赏
  • 举报
回复
你说的进程级HOOK有什么用?进程中真正起作用的是线程!不太明白你的意思

是什么意思?
xia renjie 2003-11-29
  • 打赏
  • 举报
回复
全局HOOK生效后被每个被HOOK的线程载入进程空间这也是为什么全局HOOK要写成DLL的原因,当你
调用UnhookWindowsHookEx后卸掉的是调用UnhookWindowsHookEx的线程载入的DLL,但在其它进
程中被载入的DLL并不会被卸掉。这就你看到的问题!
我想解决这个问题你得给你的DLL建立一个共享变量,在DLL的dllmain中那个退出进程就起作用
的地方改变这个变量的状态,DLL本身要有个检查这个变量状态的代码,我想这样或许可行。你
试试吧

你说的进程级HOOK有什么用?进程中真正起作用的是线程!不太明白你的意思。
树木 2003-11-29
  • 打赏
  • 举报
回复
up

15,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧