钩子(hook)编程
钩子(hook)编程
一、钩子介绍
1.1钩子的实现机制
钩子英文名叫Hook,是一种截获windows系统中某应用程序或者所有进程的消息的一种技术。下图是windows应用程序传递消息的过程:
如在键盘中按下一键,操作系统将收到键按下消息,把消息放入消息队列,然后消息队列对消息进行派发,发给相应的应用程序,经过应用程序处理后发给操作系统,操作系统再调用相应的应用程序的创建的窗口过程。
我们可能通过钩子截获这些消息,让消息不再往下传递,或者说截获到感兴趣的消息后做点什么。
1.2钩子分类与实现
钩子分进程内钩子与全局钩子,进程内钩子是截取某一指定的进程的消息,直接在进程内创建与消除钩子即可。全局钩子是截取所有进程的消息,得以动态库的方式实现。
二、创建钩子
2.1钩子的创建
SetWindowsHookEx安装一个应用程序定义的钩子过程,并把创建的钩子过程放在钩子链中,可以安装多个钩子,多个钩子就形成了钩子链,最后安装的钩子总是在最前面。创建钩子的函数如下:
idHook:钩子过程类型,如:鼠标消息钩子、键盘消息钩子、消息队列监控钩子等等。具体取值如下:
hMod:指向钩子过程所在的应用程序实例句柄,如:钩子过程所在的DLL的句柄。如果dwThreadId指定的线程是由当前进程创建,并且钩子过程在当时进程中,那么hMod必须设置为NULL。
dwThreadId:指定与钩子相关的线程标志。如果为0,那么钩子将与桌面上运行的所有线程相关。
钩子过程可以与特定线程相关也可以与所有线程相关,取决于dwThreadId的取值。
2.2钩子过程分析
钩子过程,是处理钩子截取的消息的一个回调函数,即SetWindowsHookEx函数中的第二个形参。格式如下:
nCode:指示钩子过程如何处理当前的消息,如果钩子是鼠标消息钩子的话,有两种含义:
lParam:指向MOUSEHOOKSTRUCT结构体指针。以下是MOUSEHOOKSTRUCT结构体,包含着鼠标消息。
} MOUSEHOOKSTRUCT, *PMOUSEHOOKSTRUCT;
其他钩子过程参数的含义可以通过MSDN文档查看详细说明,如KeyboardProc、MessageProc等。
2.3消毁钩子
三、进程内钩子
进程内钩子一般是为了截获当前应用程序的消息,一般会可以在应用程序初始化的时候创建,当然也可以在自己想创建的时候创建,只是创建之前的消息无法截获。
3.1鼠标钩子过程函数
LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam)
if (WM_MOUSEMOVE <= wParam && wParam <= WM_MOUSEWHEEL) {
::SendMessage(g_DestWndH, wParam, wParam, lParam);
//鼠标钩子,lParam是MOUSEHOOKSTRUCT结构指针
PMOUSEHOOKSTRUCT lpMsg = (PMOUSEHOOKSTRUCT)lParam;
lpMsg->hwnd = NULL; //把目的窗口置NULL
return ::CallNextHookEx(g_hHookDm, nCode, wParam, lParam);
3.2创建钩子过程
//如果dwThreadId指定的线程是由当前进程创建,并且钩子过程在当时进程中,那么hMod必须设置为NULL。
g_hHookDm = ::SetWindowsHookEx(WH_MOUSE,MouseProc, NULL, GetCurrentThreadId());
g_DestWndH = m_hWnd;//保存目的窗口句柄
3.3消毁进程内钩子
UnhookWindowsHookEx(g_hHookDm);
四、全局钩子
4.1键盘钩子过程函数
nCode:与鼠标钩子是一样的含义,有HC_ACTION与HC_NOREMOVE两个值。
Param:代表具体的虚拟键,如:VK_TAB、VK_RETURN分别代表Tab键、Enter键按下,其他虚拟键消息可查看MSDN的”virtual-key code”.
lParam:存放一些扩展信息,如:按键重复数据、29位表示ALT键的按下情况。
参数的具体含义可查MSDN。关于组合键的问题,参看以下键盘钩子函数的示例代码:
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
//wParam表示虚拟键,lparam第29位表示ALT键按下状态(按下为1,否则为0),
//GetKeyState可以获得对应键的状态,所以收下表示Control + ALT + Z组合键按下
if ('Z' == wParam && GetKeyState(VK_CONTROL) < 0 && (lParam >> 29 & 1)) {
::SendMessage(g_DestWnd, WM_KEYDOWN, wParam, lParam);
return CallNextHookEx(g_HookKeyBoard, nCode, wParam, lParam);
注:全局钩子在某版本的系统中,调试状态下,如果调试程序窗口没有获得焦点,在设置断点的方不会停留,如果获得焦点才会停留,也就是说,在调试状态下,不属于本进程的消息断点处不会停留。
4.2创建全局钩子接口
创建全局钩子的方法在DLL中,所以得引出一个接口,代码如下:
//第三个参数可通过些方法获得:GetModuleHandle("MouseHook.dll")
return (NULL != (g_HookKeyBoard = ::SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, g_hInst, 0)));
4.3消毁全局钩子接口
UnhookWindowsHookEx(g_HookKeyBoard);
4.4使用DLL创建全局钩子
void CHookTestDlg::OnCreateDllHook()
hIst = ::LoadLibrary("..\\HookDll\\Debug\\HookDll.dll");
typedef BOOL (*pFunSetHook)(HWND);
pFunSetHook pSetHook = (pFunSetHook)GetProcAddress(hIst, "SetHook");
void CHookTestDlg::OnDestroyDllHook()
typedef void (*pFunDestroyHook)();
pFunDestroyHook pDestryHook = (pFunDestroyHook)GetProcAddress(hIst, "DestroyHook");
配套源码链接:http://download.csdn.net/detail/mingojiang/4526390
转载自:http://blog.csdn.net/mingojiang
钩子(hook)编程相关推荐
- java hook全局钩子_钩子(hook)
钩子(hook)编程 一.钩子介绍 1.1钩子的实现机制 钩子英文名叫Hook,是一种截获windows系统中某应用程序或者所有进程的消息的一种技术.下图是windows应用程序传递消息的过程: 如在 ...
- 用键盘全局钩子[Hook]监视多进程键盘操作
用键盘全局钩子[Hook]监视多进程键盘操作 闲来无事,在WIN2K下用BCB5做了个键盘挂钩小程序,监视全局按键情况.Hook安放和回调函数放在一个单独DLL中,DLL原码如下: //------- ...
- 关于钩子(Hook)的使用
基本概念 钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的.当消息到达后,在目标窗口处理函数之前处理 ...
- mysql 钩子函数_SetWindowsHookEx原理(如何使用钩子,使用钩子hook其他进程的函数)...
基本概念 钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的.当消息到达后,在目标窗口处理函数之前处理 ...
- 易语言 钩子 (钩子HOOK与APIHOOK是不一样的)
钩子 原英文名称 Hook ,钩子的意思是指拦截或截获.作用就是拦截程序中交互的数据,先经过我们预定的钩子处理接口程序,处理过后,再交还给原处理程序,或者干脆阻止,吃掉这些数据,让原处理程序什么也得不 ...
- Thinkphp5.0行为钩子Hook的用法
什么是行为钩子? 行为 可以把行为想象成在应用执行过程中的一个动作.例如在框架的执行流程中,路由检测.静态缓存.用户权限检测是一个行为,大到业务逻辑,小到浏览器检测.多语言检测等都可以当做是一个行为. ...
- svn添加钩子hook
svn 提供了钩子功能,可以在提交代码的几个阶段执行脚本. hooks目录下的 pre-commit.tmpl是模板文件 vi pre-commit ------------------------- ...
- php扩展实现hook,ThinkPHP3.2 扩展(钩子,HOOK)
Thinkphp 执行流程 /index.php ->require './ThinkPHP/ThinkPHP.php'; /ThinkPHP/ThinkPHP.php ->require ...
- Windows 全局钩子 Hook 详解
监控程序的实现 我们发现一些木马或其他病毒程序常常会将我们的键盘或鼠标的操作消息记录下来然后再将它发到他们指定的地方以实现监听.这种功能其他是利用了全局钩子将鼠标或键盘消息进行了截取,从而 ...
- SVN钩子HOOK设置自动备份,服务本地可以看到所有更新内容。
可以实现SVN本机备份.或者其他备份.关键是可以保持有一份最新的SVN文件可以查看. 实现SVN与WEB同步,可以CO一个出来,也可以直接用自动更新web目录的方法,我们要在svn版本库中配置钩子来实 ...
最新文章
- c++做界面_为什么80%的毕业设计做的都是滨水?
- MobileNetv2优化问题
- es安全组端口_从零开始在远程服务器(Linux)上搭建es,eshead和ik分词器
- 02-02 Python 读写文件 open|os|sys
- 让ubuntu在一个窗口下打开多个终端的软件——terminator
- 标记语言——邪恶的表格?
- ubuntu 18.04安装php 7,如何在Ubuntu 18.04和16.04上安装PHP(7.3,7.2和7.0)?
- [转]GDI+ 中发生一般性错误解决方案
- nutch ajax mysql_Nutch爬取Ajax请求的动态网页
- JS 判断数组的六种方法
- 网络扫描及安全评估实验实验报告
- noip by 20XZH02
- Java多线程开发——一个简单的数字加减小例子
- 计算机常见故障 英语词汇,计算机常用英语词汇大全剖析.doc
- hexo categories和tags页面不显示解决办法
- 隐藏的Word快捷键操作
- 等保2.0.第九章.等保2.0基础知识
- 架构衍变过程----58同城沈剑:好的架构源于不停地衍变,而非设计
- RFID医疗耗材柜管理系统中的解决方案
- Android 开源优秀项目