1.Windows Hook的概念
- Windows操作系统的图形用户界面(Graphic User Interface)以事件驱动 (Event Driven)的方式工作
- 在操作系统中键盘、鼠标,选择菜单、按钮,以及移动鼠标、改变窗口大小 与位置等都是事件
- 发生这样的事件时,OS会把事先定义好的消息发送给相应的应用程序,应用 程序分析收到的信息后执行相应动作(上述过程在《Windows程序设计》一书中有详尽说明)
- 也就是说,敲击键盘时,消息会从操作系统内核移动到应用程序。所谓的 “消息钩子”就在此间偷看这些信息
2.常规Windows消息流
- 发生键盘输入事件时,WM_KEYDOWN消息 被添加到 [OS message queue]
- OS 判断哪个应用程序中发生了事件,然后从[OS message queue]取出消息,添加到相应应 用程序的[application message queue]中
- 应用程序(如记事本)监视自身的[application message queue],发现新添加的WM_KEYDOWN消息后,调用相应的事件处理程序处理
3.被Hook后的消息流
- OS消息队列与应用程序消息队列之间存在一条“钩链”(Hook Chain),设置好键盘消息钩子之后,处于“钩链”中的键盘消息钩子会比应用程序先看到相应信息。
在键盘消息钩子函数的内部,除了可以查看消息之外,还可以修改消息本身,而且还能对消息实施拦截,阻止消息传递 - 可以同时设置多个相同的键盘消息钩子,这些钩子按照设置的先后顺序被触发,最近安装的钩子放在链的开始,而最早安装的钩子放在最后,也就是后加入的先获得控制权
4.SetWindowsHookEx()
- 使用SetWindowsHookEx( ) API设置消息钩子 - 若dwThreadID参数被设置为0,
则安装的钩子为“全局钩子”(GlobalHook),
它会影响到运行中的(以及以后要运行的)所有进程。 - 使用SetWindowsHookExO设置好钩子之后,在某个进程中生成指定消息时,操作系统会将相关的DLL文件强制注入到相应进程然后调用注册的钩子
5.Hook键盘输入
程序代码由两部分组成
- 1. HookMain:用于加载DLL文件并控制Hook的设置和取消
编译后为一个.exe可执行文件 - 2. - KeyHook:Hook相关的主要代码
编译后为一个.dll文件
5.1.HookMain
相当于一个DLL加载器
5.2.KeyHook
KeyHook.dll的核心代码
安装好键盘 “钩子” 后,无论哪个进程,只要发生键盘输入事件,
OS就会强制将KeyHook.dll 注入相应进程。
加载了KeyHook.dll的进程中,发生键盘事件时会首先调用执行KeyboardProc( )
5.3.在编译时注意选择合适的版本:
Release x64
5.4.打开HookMain.exe
无法在1.txt中输入任何内容
5.5.
在exe中输入q退出后,又可以在1.txt中输入了
6.其他
6.1.Hook还有很多种实现方式
- 注入:inline、DLL
- 调试:通过调试相关的API进行Hook
6.2.Hook的目标也有多种
- IAT、代码、EAT