钩子编程(HOOK) 安装系统全局钩子 (3)
2014-05-15 11:17
961 查看
摘要:全局钩子,钩子一词多用于计算机编程中,英文叫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工程。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202012/07/fce18b4967e20a83a93b92221488b5e3)
Step 2:创建一个.cpp文件,命名为hook.cpp (步骤和平时编写win32 Console Application一样),这里面主要就是存放Hook的主要逻辑执行体。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202012/07/2d0c3d9049739e50a33cdcc879b7b4bd)
Step 3:在hook.cpp里面编写如下钩子事件~~~~
Step 4:再在本工程里面新建一个hook.def文件,(这个主要用来编码,函数命名错误问题)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202012/07/76dffab47a9eb94753be0a317ee00996)
Step 5:在里面编写如下代码,
此时,工程目录应该是这样...
![](https://oscdn.geek-share.com/Uploads/Images/Content/202012/07/faabc87842b23a4a2f58ac4540fa9bf8)
Step 6:编译->链接。(DLL是不能单独运行的,所以点击链接之后,目录下就会生成相应的DLL与Lib,如下文,不要企图点击运行)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202012/07/70d2aea606cf25e573d713ed4dc0edcd)
好了,DLL全局钩子已经编写好了,关闭DLL工程。
第二部分:《触发DLL的客户端》
触发DLL的客户端,这里简单介绍使用MFC对话框应用程序来触发DLL钩子程序。
Step 1:重新打开VC6.0,新建一个基于对话框的MFC应用程序(步骤,MFC AppWizard(exe) -> 基于对话框 -> 完成),命名为GHookEXE。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202012/07/002a637511edaa52b261d5b10a2a9591)
Step 2:将开始编写好的GHookDll.dll与GHookDll.lib两个文件拷贝到当前目录下面。注意是.cpp存放的同级目录下,不要放置下Debug目录下了,将会导致DLL无法找到。这里需要说明,DLL与Lib的关系:DLL里面放置的是具体的实现函数,Lib里面是函数的清单——Lib也就是负责告诉编程者,DLL中有哪些方法可以调用,函数名为什么,应该如何传参等。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202012/07/f894068c1cea63be1959a1c8d4839506)
Step 3:如果不想动态加载,也可以手动配置一下,GHookDll.lib文件。(点击工程->设置->链接,然后将GhookDll.lib的名字写进去)。在实际开发中,一般也都是使用此种方式。(但下文也会介绍动态加载DLL的方法。)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202012/07/4b3f096f52cec95662a788b7018c5eb6)
Step 4:在BOOL CGlobalHookDlg::OnInitDialog()函数上面插入一行如下代码,声明dll动态链接库,声明SetHook()函数之后,程序中就可以直接使用了。(但SetHook函数,必须在DLL中有具体的实现,同时实现名也必须一致)。
Step 5:在OnInitDialog()函数中调用安装钩子函数 SetHook(),做了上述如此多铺垫,就是为了调用SetHook函数。该函数也只有一个目的——触发DLL钩子程序,
![](https://oscdn.geek-share.com/Uploads/Images/Content/202012/07/8c54138e618d620fc7f25f09a1df2cbe)
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)...
下面是添加位置截图,
![](https://oscdn.geek-share.com/Uploads/Images/Content/202012/07/1152b8aaed01eea54f16fe290a23ffc1)
想了解更多,推荐阅读《钩子编程(HOOK)初探进程内钩子、全局系统钩子系列文章》,相信你一定会有所收获。
目录:
钩子程序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)初探进程内钩子、全局系统钩子系列文章》,相信你一定会有所收获。
相关文章推荐
- 钩子编程(HOOK) 安装进程内鼠标钩子 (0)
- 钩子编程(HOOK) 屏蔽全部按键、鼠标及系统功能键 (4)
- 钩子编程(HOOK) 屏蔽所有按键、鼠标及系统功能键 (4)
- [C#.net]如何解决安装系统全局钩子程序调试时失败的问题
- 钩子编程(HOOK) 安装进程内键盘钩子 (1)
- 钩子编程(HOOK) 安装进程内键盘钩子 (1)
- C++ Hook(钩子)编程,通过内联汇编,使类成员函数代替全局函数(静态函数)
- HOOK编程 ----全局钩子
- HOOK全局键盘钩子
- 用VC编程阻止全局钩子的加载
- VC中调用系统全局的钩子实现(附注释)
- 控制台程序安装全局钩子
- 钩子技术、HOOK技术在VC编程中的应用
- VB.NET全局键盘鼠标钩子 [Vb.Net Hook](修正版)
- C#.Net的全局键盘钩子(Hook)技术
- VS调试时SetWindowsHookEx返回0,全局钩子(hook)无效
- 不使用DLL创建全局系统钩子
- 全局钩子(hook鼠标键盘消息)
- 一种绕过全局钩子安装拦截的思路
- 转自sgear博客:C#.Net的全局键盘钩子(Hook)技术