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

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

此外,还有一个疑惑,为什么系统只提供系统级的,以及线程级的HOOK,进程级的为什么不提供呀?
...全文
405 10 打赏 收藏 转发到动态 举报
写回复
用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
修正结束进程并且删除文件的问题 本工具目前初步实现如下功能: 1.进程、线程、进程模块、进程窗口信息查看,杀进程、杀线程、卸载模块等功能 2.内核驱动模块查看,支持内核驱动模块的内存拷贝 3.SSDT、Shadow SSDT、FSD、IDT信息查看,并能检测和恢复ssdt hook和inline hook 4.CreateProcess、CreateThread、LoadImage、Shutdown、Lego等Notify Routine信息查看,并支持对这些Notify Routine的删除 5.端口信息查看,目前不支持2000系统 6.查看消息钩子 7.内核模块的iat、eat、inline hook、patchs检测和恢复 8.磁盘、卷、键盘、网络层等过滤驱动检测,并支持删除 9.注册表编辑 10.进程iat、eat、inline hook、patchs检测和恢复 11.文件系统查看,支持基本的文件操作 12.查看(编辑)IE插件、SPI、启动项、服务、Host文件、映像劫持 13.ObjectType Hook检测和恢复 XueTr教程: 1.如何用XueTr安全卸载注入模块http://bbs.kafan.cn/thread-425594-1-1.html 免责声明:这只是一个免费的辅助小工具,如果您使用本工具,给您直接或者间接造成损失、损害,本人概不负责。从您使用本小工具的一刻起,将视为您已经接受了本免责声明。 2009-04-10 0.24版本:(如果老版本的驱动已经被加载,务必重启系统使用新版本) 1.新增DPC定时器检测 2.新增全局模块卸载功能 3.丰富一些右键菜单 4.内核模块加入“加载顺序”显示 5.增强SSDT、Shadow SSDT、FSD、IDT、ObjectType Hook函数所在模块的查找能力 6.加入一个查看重启删除功能(文件部分树形空间右键菜单) 7.文件部分加入是否常规属性显示,新增"去掉系统、只读、隐藏属性"功能 8.修正FAT32磁盘分析的一个Bug 9.修正xp无补丁版本Shadow SSDT无法显示Bug 10.还有若干小改动,不表

15,471

社区成员

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

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