window消息钩取

原理介绍

在操作系统中安装全局钩子以后,只要进程接收到可以发出钩子的消息后,全局钩子的DLL文件会被操作系统自动或者强行地加载到该进程中。
主要是SetWindowsHookEx()这个API函数
Hook SetWindowsHookEx(
int idHook, //hook type
HOOKPROC lpfn //hook procedure
HINSTANCE hMOd // hook Procedure 所属的DLL句柄
DWORD dwThreadId // 想要挂钩的线程ID
)
钩子过程是由操作系统调用的回调函数,安装消息钩子的时候,钩子过程需要存在于某个DLL内部,且该DLL的实例句柄即是hMod.
这里要注意,当dwThreadId参数被设置为0时候,则安装的是全局钩子,他会影响到运行中的所有进程。
像是使用SetWindowsHookEx()设置好钩子之后,在某个进程中生成指定消息时,操作系统会将相关的DLL文件强制注入到相应进程,然后调用注册的钩子函数。

实验记录

  • 这里练习一下WH_KEYBOARD 这个键盘钩子,记录下钩子过程的地址后面用的到,为10046f00,其实就是keyboardProc函数
  • 附加进程->勾选debugging options中的Break on new module(dll)->运行HookMain.exe->在notepad中键盘输入->此时就有如下
  • 如下图所示,每当notepad.exe发生键盘输入事件的时候,调试就会停在此处。

    总结

  • 我觉得这张图能很好的阐释windows钩子的原理

    spy++是一个功能十分强大的消息钩取程序,能够查看操作系统中来往的所有消息。
  • 在windows中SetWindowsHookEx()这个API可以轻松实现消息钩子。

    参考

    逆向工程核心原理