您的位置:首页 > 编程语言

钩子编程(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工程。



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)初探进程内钩子、全局系统钩子系列文章》,相信你一定会有所收获。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: