windows hook知识讲解

  • A+
所属分类:逆向工程
windows hook知识讲解

点击蓝字关注我们吧!




windows hook知识讲解

1.Windows Hook的概念




  • Windows操作系统的图形用户界面(Graphic User Interface)以事件驱动 (Event Driven)的方式工作


  • 在操作系统中键盘、鼠标,选择菜单、按钮,以及移动鼠标、改变窗口大小 与位置等都是事件


  • 发生这样的事件时,OS会把事先定义好的消息发送给相应的应用程序,应用 程序分析收到的信息后执行相应动作(上述过程在《Windows程序设计》一书中有详尽说明)


  • 也就是说,敲击键盘时,消息会从操作系统内核移动到应用程序。所谓的 “消息钩子”就在此间偷看这些信息




windows hook知识讲解

2.常规Windows消息流



  • 发生键盘输入事件时,WM_KEYDOWN消息 被添加到 [OS message queue]


  • OS 判断哪个应用程序中发生了事件,然后从[OS message queue]取出消息,添加到相应应 用程序的[application message queue]


  • 应用程序(如记事本)监视自身的[application message queue],发现新添加的WM_KEYDOWN消息后,调用相应的事件处理程序处理


windows hook知识讲解




windows hook知识讲解

3.被Hook后的消息流




  • OS消息队列与应用程序消息队列之间存在一条“钩链”(Hook Chain),设置好键盘消息钩子之后,处于“钩链”中的键盘消息钩子会比应用程序先看到相应信息。


    在键盘消息钩子函数的内部,除了可以查看消息之外,还可以修改消息本身,而且还能对消息实施拦截,阻止消息传递


  • 可以同时设置多个相同的键盘消息钩子,这些钩子按照设置的先后顺序被触发,最近安装的钩子放在链的开始,而最早安装的钩子放在最后,也就是后加入的先获得控制权



windows hook知识讲解





windows hook知识讲解

4.SetWindowsHookEx()




  • 使用SetWindowsHookEx( ) API设置消息钩子 - 若dwThreadID参数被设置为0

    则安装的钩子为“全局钩子”(GlobalHook),

    它会影响到运行中的(以及以后要运行的)所有进程。


  • 使用SetWindowsHookExO设置好钩子之后,在某个进程中生成指定消息时,操作系统会将相关的DLL文件强制注入到相应进程然后调用注册的钩子




windows hook知识讲解

5.Hook键盘输入




程序代码由两部分组成


  • 1. HookMain:用于加载DLL文件并控制Hook的设置和取消

    编译后为一个.exe可执行文件


  • 2. - KeyHook:Hook相关的主要代码

    编译后为一个.dll文件

5.1.HookMain


相当于一个DLL加载器


windows hook知识讲解


5.2.KeyHook


KeyHook.dll的核心代码


安装好键盘 “钩子” 后,无论哪个进程,只要发生键盘输入事件,

OS就会强制将KeyHook.dll 注入相应进程。


加载了KeyHook.dll的进程中,发生键盘事件时会首先调用执行KeyboardProc( )



windows hook知识讲解


5.3.在编译时注意选择合适的版本:


Release x64


windows hook知识讲解



windows hook知识讲解windows hook知识讲解



5.4.打开HookMain.exe


无法在1.txt中输入任何内容


windows hook知识讲解


5.5.


在exe中输入q退出后,又可以在1.txt中输入了




windows hook知识讲解

6.其他



6.1.Hook还有很多种实现方式


- 注入:inline、DLL

- 调试:通过调试相关的API进行Hook


6.2.Hook的目标也有多种


- IAT、代码、EAT




end




windows hook知识讲解


发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: