Windows的HOOK机制的学习笔记
2008-03-08 10:58
337 查看
前段时间学习了HOOK,但没有做笔记,今天稍微整理下。
一 HOOK的功能
在消息体传递给应用程序的消息队列前对消息进行处理,也就是说如果在钩子过程中对消息进行了屏蔽,是不会进入应用程序的消息队列的。(我试验过,我们自己使用SendMessage和PostMessage的消息是没办法被钩住的,说明钩子过程的调用应该比较靠近消息传递过程的前面,很有可能位于事件触发,形成消息之后的环节)
二 HOOK的分类
1 进程内HOOK:只能截获自己进程的消息。
2 全局HOOK(系统钩子):能够截获所有进程的消息。
三 Hook函数
1 设置钩子的函数
HHOOK WINAPI SetWindowsHookEx(int idHook,HOOKPROC lpfn, HINSTANCE hmod, DWORD dwThreadId);
WINAPI不用说 大家知道是__stdcall,windows api的标准调用方式,由api函数中自行清理堆栈。
参数1 idHook,截获的钩子类型,前缀WH,可以在MSDN中输入“WH_”来查看可截获的各种类型的消息
参数2 lpfn是HOOKPROC类型的,HOOKPROC是使用typedef定义的一个函数指针的别名:
typedef LRESULT (CALLBACK *)(int nCode, WPARAM wParam, LPARAM lParam) HOOKPROC;
参数3 在进程内钩子时为NULL,在系统钩子时指定钩子过程所在的DLL,是HINSTANCE类型的,可以通过GetModule来获取。
参数4 在进程内钩子时是GetCurrentThreadId(),在系统钩子时设0。
返回值:钩子的句柄,可根据该句柄卸载钩子。
2 调用下一个钩子的函数
LRESULT WINAPI CallNextHookEx(HHOOK hhk,int nCode, WPARAM wParam, LPARAM lParam);
在HookProc中判断该消息是否是自己要处理的,如果是的话处理完返回一个1,则不会调用别人设置的钩子了,否则要调用下一个钩子。
3 卸载钩子
BOOL WINAPI UnhookWindowsHookEx(HHOOK hhk);
卸载掉一个钩子。
四 设置系统钩子的方法
系统钩子的设置需要将钩子过程函数放到动态链接库中,原因很简单,因为动态链接库在内存中是共享的,所以系统才能访问到这个钩子过程函数。
在原钩子过程的基础上加入 __declspec(dllexport) 即可实现,然后其他进程导入该钩子过程函数,调用SetWindowHookEx的时候第三个参数设置GetModule获取的dll模块,第四个参数设置0即可。
一 HOOK的功能
在消息体传递给应用程序的消息队列前对消息进行处理,也就是说如果在钩子过程中对消息进行了屏蔽,是不会进入应用程序的消息队列的。(我试验过,我们自己使用SendMessage和PostMessage的消息是没办法被钩住的,说明钩子过程的调用应该比较靠近消息传递过程的前面,很有可能位于事件触发,形成消息之后的环节)
二 HOOK的分类
1 进程内HOOK:只能截获自己进程的消息。
2 全局HOOK(系统钩子):能够截获所有进程的消息。
三 Hook函数
1 设置钩子的函数
HHOOK WINAPI SetWindowsHookEx(int idHook,HOOKPROC lpfn, HINSTANCE hmod, DWORD dwThreadId);
WINAPI不用说 大家知道是__stdcall,windows api的标准调用方式,由api函数中自行清理堆栈。
参数1 idHook,截获的钩子类型,前缀WH,可以在MSDN中输入“WH_”来查看可截获的各种类型的消息
参数2 lpfn是HOOKPROC类型的,HOOKPROC是使用typedef定义的一个函数指针的别名:
typedef LRESULT (CALLBACK *)(int nCode, WPARAM wParam, LPARAM lParam) HOOKPROC;
参数3 在进程内钩子时为NULL,在系统钩子时指定钩子过程所在的DLL,是HINSTANCE类型的,可以通过GetModule来获取。
参数4 在进程内钩子时是GetCurrentThreadId(),在系统钩子时设0。
返回值:钩子的句柄,可根据该句柄卸载钩子。
2 调用下一个钩子的函数
LRESULT WINAPI CallNextHookEx(HHOOK hhk,int nCode, WPARAM wParam, LPARAM lParam);
在HookProc中判断该消息是否是自己要处理的,如果是的话处理完返回一个1,则不会调用别人设置的钩子了,否则要调用下一个钩子。
3 卸载钩子
BOOL WINAPI UnhookWindowsHookEx(HHOOK hhk);
卸载掉一个钩子。
四 设置系统钩子的方法
系统钩子的设置需要将钩子过程函数放到动态链接库中,原因很简单,因为动态链接库在内存中是共享的,所以系统才能访问到这个钩子过程函数。
在原钩子过程的基础上加入 __declspec(dllexport) 即可实现,然后其他进程导入该钩子过程函数,调用SetWindowHookEx的时候第三个参数设置GetModule获取的dll模块,第四个参数设置0即可。
相关文章推荐
- 我的学习笔记_Windows_HOOK编程 2009-12-03 11:19
- [软件调试学习笔记]WinDbg演示IA-32 CPU下的Windows 分页机制下的地址转换过程
- 我的学习笔记_Windows_HOOK编程 2009-12-03 11:19
- windows下32位汇编语言学习笔记 第四章 第一个窗口程序 (windows的消息机制)
- HOOK钩子机制学习笔记
- Windows 8 学习笔记(十五)--.Windows 8 RP Metro 墓碑机制思考
- 我的学习笔记_Windows_HOOK编程 2009-12-03 11:19
- HOOK钩子机制学习笔记(4) - 钩子函数说明
- Windows安全机制学习笔记(五)-枚举文件ACL
- Windows安全机制学习笔记(二)
- 理解windows消息机制-delphi消息机制学习笔记。
- 我的学习笔记_Windows_HOOK编程 2009-12-03 11:19
- vc学习笔记之windows程序内部运行机制
- 一. Windows程序内部运行机制--Windows编程课程学习笔记
- HOOK钩子机制学习笔记(1)
- 我的学习笔记_Windows_HOOK编程 2009-12-03 11:19
- 我的学习笔记_Windows_HOOK编程 2009-12-03 11:19
- [Windows]安全机制学习笔记
- 我的学习笔记_Windows_HOOK编程 2009-12-03 11:19
- HOOK钩子机制学习笔记(2)