钩子编程(HOOK) 安装系统全局钩子 (3)
摘要:全局钩子,钩子一词多用于计算机编程中,英文叫hook,指利用api来提前拦截并处理windows消息的一种技术。如键盘钩子,许多木马都有这东西,监视你的键盘操作。全局钩子是系统钩子的一种,当指定的一些消息被系统中任何应用程序所处理时,这个钩子就被调用。
目录:
钩子程序DLL
触发DLL的客户端
补充:动态加载DLL
---------------------------------
下面我们演示一下安装全局钩子,屏蔽你的计算机鼠标的所有操作~~~~
全局钩子,由两部分组成:钩子程序DLL、触发DLL的客户端。其中,钩子程序DLL是负责逻辑处理的那部分——也就是钩子程序的主要执行体;由于DLL不能独立执行,顾需要一个触发DLL的客户端,其实该客户端就一个作用——调用钩子程序DLL中的相关函数,让DLL跑起来。下文将一步步讲解如何对着两部分进行开发。
第一部分:《钩子程序DLL》
钩子程序DLL是整个系统全局钩子的核心,所有的事物操作全部在DLL中完成。
Step 1:打开VC6.0,选择编写DLL(动态链接库,Win32 Dynamic-Link Library),将工程命名为GHookDll。其实就和创建C/C++项目工程一样简单,只不过这里创建的是DLL工程。
Step 2:创建一个.cpp文件,命名为hook.cpp (步骤和平时编写win32 Console Application一样),这里面主要就是存放Hook的主要逻辑执行体。
Step 3:在hook.cpp里面编写如下钩子事件~~~~
#include <windows.h> HHOOK g_hMouse = NULL; //鼠标钩子过程 LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam) { return 1; } //安装鼠标钩子过程的函数 void SetHook() { g_hMouse = SetWindowsHookEx(WH_MOUSE, MouseProc, GetModuleHandle("GHookDll"),0); }
Step 4:再在本工程里面新建一个hook.def文件,(这个主要用来编码,函数命名错误问题)
Step 5:在里面编写如下代码,
LIBRARY GHookDll EXPORTS SetHook @2
此时,工程目录应该是这样...
Step 6:编译->链接。(DLL是不能单独运行的,所以点击链接之后,目录下就会生成相应的DLL与Lib,如下文,不要企图点击运行)
好了,DLL全局钩子已经编写好了,关闭DLL工程。
第二部分:《触发DLL的客户端》
触发DLL的客户端,这里简单介绍使用MFC对话框应用程序来触发DLL钩子程序。
Step 1:重新打开VC6.0,新建一个基于对话框的MFC应用程序(步骤,MFC AppWizard(exe) -> 基于对话框 -> 完成),命名为GHookEXE。
Step 2:将开始编写好的GHookDll.dll与GHookDll.lib两个文件拷贝到当前目录下面。注意是.cpp存放的同级目录下,不要放置下Debug目录下了,将会导致DLL无法找到。这里需要说明,DLL与Lib的关系:DLL里面放置的是具体的实现函数,Lib里面是函数的清单——Lib也就是负责告诉编程者,DLL中有哪些方法可以调用,函数名为什么,应该如何传参等。
Step 3:如果不想动态加载,也可以手动配置一下,GHookDll.lib文件。(点击工程->设置->链接,然后将GhookDll.lib的名字写进去)。在实际开发中,一般也都是使用此种方式。(但下文也会介绍动态加载DLL的方法。)
Step 4:在BOOL CGlobalHookDlg::OnInitDialog()函数上面插入一行如下代码,声明dll动态链接库,声明SetHook()函数之后,程序中就可以直接使用了。(但SetHook函数,必须在DLL中有具体的实现,同时实现名也必须一致)。
_declspec(dllimport) void SetHook();
Step 5:在OnInitDialog()函数中调用安装钩子函数 SetHook(),做了上述如此多铺垫,就是为了调用SetHook函数。该函数也只有一个目的——触发DLL钩子程序,
Step 6:编译->链接->运行。这时候,你发现不管你通过键盘ALT+TAB切换到哪个界面,你的鼠标都用不了。
如果你要退出:请切换回程序切面(用ALT+TAB切换),然后按一下 回车键。(这时候响应了ID_OK按钮,自动调用关闭窗口,这时候你发现鼠标又能用了)。可能有些时候,上述方式并不能退出,这时候你应该按CTRL+ALT+DEL呼出任务管理器,使用上下左右方向键选择当前运行的exe客户端,最后CTRL+E——终止掉程序。
文章阅读到这里,其实已经结束了,下文知识做一些知识点的扩展、补充。
《补充:关于DLL动态加载》
如果你需要实现DLL动态加载,而不是像上面那样,在链接里面添加 GHookDll.lib 文件。那么就有必要说明一下动态加载DLL了。
Step 1:将GHookDll.dll 和 GHookDll.lib拷贝到客户端目录下面。
Step 2:将 _declspec(dllimport) void SetHook(); 这行代码注释掉。
Step 3:在OnInitDialog()函数里面添加如下代码(实现动态加载DLL)...
HINSTANCE hInst; hInst = LoadLibrary("GHookDLL.dll"); typedef void (*SetHookProc)(); SetHookProc SetHook = (SetHookProc)GetProcAddress(hInst,"SetHook");
下面是添加位置截图,
想了解更多,推荐阅读《钩子编程(HOOK)初探进程内钩子、全局系统钩子系列文章》,相信你一定会有所收获。
- 上一篇: windows 全局hook
- 下一篇: Windows Hook机制(转贴一)