概要
- 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);
}
网友评论