Hook简介

概要
  • windows消息机制:os监听\捕捉事件->os向应用程序消息队列发送消息->应用程序利用getmessage获取消息队列里的一条消息->调用dispatchmessage分发消息调度给os->os调用回调函数
    hook:即钩子,用于监控消息在系统内部的传递,可以截获、处理windows消息,并调用预先定义好的功能性的回调函数。
hook原理
  • 1、系统维护着一个钩子链,每安装一个hook都会再钩子链上添加一个元素,即一个指向钩子处理函数的指针;
  • 2、钩子链处理消息时候,采用先进后处理的方式,对于系统的每一个消息都会经过钩子链条上的每一个钩子;
  • 3、当消息类型与钩子监视的类型一致时,钩子会截获该消息,进行相应的处理,处理后可继续传递、可修改、或者阻止。
  • 钩子消息处理会影响系统性能,故无需使用时及时卸载; 卸载不需要按顺序;安装钩子的进程结束时,系统会自动卸载器安装的钩子
api
  • 安装钩子
HHOOK WINAPI SetWindowsHookEx( 
_In_ int       idHook, //监视的消息类型
_In_ HOOKPROC  lpfn,  //钩子处理函数地址
_In_ HINSTANCE hMod, //钩子处理函数所在的模块,当前进程该项可写成NULL
_In_ DWORD     dwThreadId //需要监视的线程ID,0为监视当前所有运行的线程
);

钩子处理函数调用过程:当进程A的线程准备向any进程发送消息时,如果消息正在被监视,则将被钩子截获,系统将检查该钩子的钩子函数所在的DLL是否已经被映射进程A的地址空间中。如果尚未映射,系统会强制将该DLL映射到进程A的地址空间。然后获得钩子函数在进程A的虚拟地址,并调用钩子函数。(这也是DLL注入的一种方式)

  • 其他api
BOOL WINAPI UnhookWindowsHookEx(_In_ HHOOK hhk); //卸载钩子
LRESULT WINAPI CallNextHookEx(  //传递消息给下一个钩子
_In_opt_ HHOOK  hhk, 
_In_     int    nCode, 
_In_     WPARAM wParam, 
_In_     LPARAM lParam);
  • 钩子处理函数
LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam) {
    ...
    return CallNextHookEx(hhook, nCode, wParam, lParam); 
}
ref
  • 我的学习笔记_Windows_HOOK编程 2009-12-03 11:19
  • 【Windows核心编程学习笔记】HOOK入门
  • 《windows核心编程系列》十八谈谈windows钩子
  • Using Hooks

你可能感兴趣的:(Hook简介)