枚举全局钩子
标 题: 枚举全局钩子
作 者: 一块三毛钱
邮箱: zhongts@163.com
时 间: 2005-06-19,21:23:16
链 接: http://bbs.pediy.com/showthread.php?t=14600
首先强调一点,本文给出的代码只在 WinXP+SP2 下测试通过,使用其他系统的朋友最好看懂代码,然后调试运行。如果不巧系统蓝屏可不要找我哦。:)
鼠标钩子、键盘钩子等大家一定是耳熟能详,在 Windows 环境下编程的朋友们肯定都和他们打过交道,比如说截获密码什么的都可以用到他们。本文将介绍一种办法可以枚举所有的全局钩子,找到到底是什么动态库创建了钩子(大部分全局钩子都需要通过动态库来实现)。
下图是程序运行后显示的所有的全局钩子,包括钩子函数在那个动态库中,也就是创建钩子的动态库。图中显示的钩子句柄是指得在当前进程中的句柄,不是系统范围的。比如说 MouseHook 添加了一个全局的鼠标钩子,那么在 explorer 中这个钩子的句柄和在 word 中的句柄是不同的(这一点我是通过 Icesword 观察到的),但都是 MouseHook 添加的钩子都在 mousehook.dll 动态库中。如果想获得 Icesword 一样的结果可以针对每一个进程枚举全局钩子(没试过)。l另外,如果鼠标钩子和键盘钩子不能够显示动态库,可以先动一动鼠标,摁几下键盘再刷新应该就可以显示。

之所以会写这篇文章是因为在编程板块中有一个主题说判断全局钩子的调用者,所以才想着能不能枚举出所有的全局钩子。但那个主题好像说的是钩子的调用者,又好像全局钩子指得是 Hook API 类型的钩子,没搞懂。在那个主题下 zworm 大侠好像说可以通过一个钩子链的东东来枚举钩子,不过大侠没有细说,我自己也没有在符号文件中找到有关钩子链的符号(我只会这一种办法找系统内部变量,比如活动进程链就可以通过这种办法找到位置),所以准备从 CallNextHookEx 函数慢慢往下追希望能够找到系统是怎么找到下一个钩子函数的。本文介绍的方法就是这样来的(另外有一个很重要的一点会在文章的最后提到)。
阅读全文…

近期评论