全局钩子实例分析

来源:互联网 发布:可以货到付款的软件 编辑:程序博客网 时间:2024/06/13 01:12

1.关于全局钩子

如果要屏蔽其他进程的鼠标和键盘消息的话,那么局部钩子是不能实现的,我们需要使用远程钩子。而远程钩子的实现是需要借助DLL的,安装的钩子过程需要必须在动态链接库中去实现。远程钩子的设置过程与局部钩子的安装过程所用函数都是SetWindowsHookEx,只是参数不同而已,远程钩子的第4个参数应该设置为0,并把第三个参数指定为安装钩子过程的代码所在的DLL的句柄。

2.全局钩子的运行机理

全局钩子的钩子函数为什么需要放置在DLL才能实现全局监控呢?

因为每个进程都有自身的进程地址空间,对于每个进程来说,就像每个进程独占4G的内存空间,各个进程的代码和数据都输相互分割,互不影响的。所以想编写代码来控制其他进程就必须把代码加载到其他进程空间,才可以实现控制。而动态链接库就可以实现将代码和数据动态加载到其他进程的地址空间中,所以全局钩子需要使用DLL。windows提供的钩子很多,其中一种非常实用,那就是WH_GETMESSAGE这个类型的钩子。它可以很方便地将DLL文件注入到所有基于消息机制的程序中。

在操作系统安装了全局钩子以后,只要进程接收到可以发出钩子的消息后,全局钩子的DLL文件会被操作系统自动或强加地加载到该进程中。由此可见,设置钩子也是一种可以进行DLL注入的方法。

但是有点时候我们只需要对目标进程进行监控,所以我们只需要将我们的钩子挂到指定的进程就行了,那么现在要做的就是如何将DLL注入到指定的进程空间中,而不是将DLL注入到系统正在运行的所有的某一类(例如基于消息的进程)进程的地址空间中。那么我们如何来进行定位呢?这个将会话另外一篇博客来研究,大家也可以思考一下,前面的DLL注入都是使用钩子对DLL进行的注入,后面的讨论我们将不使用钩子来进行DLL的注入了,这涉及到DLL注入技术了。我们这里谈的只是全局钩子的实现机理,所以这里就不在展开了。


3.动态链接库的编写

#include <windows.h>HHOOK g_hMouse=NULL;HHOOK g_hKeyboard=NULL;#pragma data_seg("MySec")HWND g_hWnd=NULL;#pragma data_seg()//#pragma comment(linker,"/section:MySec,RWS")/*HINSTANCE g_hInst;BOOL WINAPI DllMain(  HINSTANCE hinstDLL,  // handle to the DLL module  DWORD fdwReason,     // reason for calling function  LPVOID lpvReserved   // reserved){g_hInst=hinstDLL;}*/LRESULT CALLBACK MouseProc(  int nCode,      // hook code  WPARAM wParam,  // message identifier  LPARAM lParam   // mouse coordinates){return 1;}LRESULT CALLBACK KeyboardProc(  int code,       // hook code  WPARAM wParam,  // virtual-key code  LPARAM lParam   // keystroke-message information){if(VK_F2==wParam){SendMessage(g_hWnd,WM_CLOSE,0,0);UnhookWindowsHookEx(g_hMouse);UnhookWindowsHookEx(g_hKeyboard);}return 1;}void SetHook(HWND hwnd){   g_hWnd=hwnd;   g_hMouse=SetWindowsHookEx(WH_MOUSE,MouseProc,GetModuleHandle("Hook"),0);   g_hKeyboard=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,GetModuleHandle("Hook"),0);}

4.钩子的设置

有了DLL,我们就将DLL导入到我们的程序中,然后我们使用sethook()函数来进行钩子的设置。调用了这个函数那么钩子函数也就设置完毕了,我们设置的键盘钩子和鼠标钩子也就开始工作了,如果进程接收到可以发出钩子的消息后,那么进程就会自动或强加地被导入了我们编写的DLL,通过这样一种DLL注入方法我们将自己的代码导入到了其他的进程中起到了对其他进程的监控和控制的作用。

需要注意的是,在程序中需要有unhook()的操作来解除钩子。




原创粉丝点击