hook(钩子)

来源:互联网 发布:计算机二级考试编程题 编辑:程序博客网 时间:2024/06/11 12:49

                                                         Hook

钩子[以下简称Hook]是应用程序在Microsoft Windows 消息处理过程中设置的用来监控消息流并且处理系统中尚未到达目的窗口的某一类型消息过程的机制。如果Hook过程在应用程序中实现,若应用程序不是当前窗口时,该Hook就不起作用;如果HookDLL中实现,程序在运行中动态调用它,它能实时对系统进行监控。根据需要,我们采用的是在DLL中实现Hook的方式[关于HOOK更详细的资料请查阅资料]

VC中新建一Win32 Dynamic-Link Library 工程,工程名为KBLock添加hook.h头文件,内容如下:

#ifdef FIRSTLIBAPI

#else

#define FIRSTLIBAPI extern "C" __declspec(dllimport)

#endif

 

#include <windows.h>

FIRSTLIBAPI BOOL InstallHook();

FIRSTLIBAPI BOOL UnInstallHook(); 

    

     然后添加hook.cpp文件,内容如下:

#define FIRSTLIBAPI extern "C" __declspec(dllexport)

#include "hook.h"

HHOOK hhkHook=NULL;                      //定义钩子句柄

HINSTANCE hInstance=NULL;                  //程序实例

LRESULT CALLBACK HookProc(int nCode,WPARAM wParam,LPARAM lParam)

{

         if (nCode < 0)    

                   return CallNextHookEx(hhkHook,nCode,wParam,lParam);

         if (nCode != HC_ACTION)

                   return CallNextHookEx(hhkHook,nCode,wParam,lParam);

         //给出提示:键盘已经被锁定,要进行判断,看是否已有提示窗口,否则会弹个没完

         if (!FindWindow(0, "KeyBoard Locked"))      

                   MessageBox(0,"键盘已经锁定!!!","KeyBoard Locked",MB_OK);

return 1;   //没有return CallNextHookEx(hhkHook,nCode,wParam,lParam)则不会把消息

//传递下去,所以我们的键盘就不起作用了

}

 

//导出函数:启动键盘锁定

BOOL InstallHook()

{

         if(!(hhkHook=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)HookProc,hInstance,0)))

                   return FALSE;

         return TRUE;

}

 

//导出函数:解除键盘锁定

BOOL UnInstallHook()

{

         return UnhookWindowsHookEx(hhkHook);

}

 

//下面的DLLMain相当于Win32程序中的WinMain函数,是入口点

BOOL APIENTRY DllMain( HANDLE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)

{

    switch (ul_reason_for_call)

         {

         case DLL_PROCESS_ATTACH:

         case DLL_THREAD_ATTACH:

         case DLL_THREAD_DETACH:

         case DLL_PROCESS_DETACH:

                   break;

    }

         hInstance=(HINSTANCE)hModule;          //得到DLL实例

    return TRUE;

}

 

DLL方面的工作已经完成,这样我们就可以在程序中调用它了。

建一基于Dialog的工程,在其中加入一个按钮:“hook/unhook”,并添加相应的处理函数:(这里没有加入出错处理的代码)

void CHookexeDlg::OnButtonHook()

{

         // TODO: Add your control notification handler code here

         typedef BOOL (CALLBACK *LOADHOOK)();   

         typedef BOOL (CALLBACK *UNLOADHOOK)();

         HINSTANCE hDLL=NULL;

         LOADHOOK loadhook;

         UNLOADHOOK unloadhook;

        

         hDLL=::LoadLibrary((LPCTSTR)"hookdll");       //加载DLL

         loadhook=(LOADHOOK)::GetProcAddress(hDLL,"InstallHook");

         unloadhook=(UNLOADHOOK)::GetProcAddress(hDLL,"UnInstallHook");

        

         static bool sign = true;

         if(sign)

                   loadhook();

         else

                   unloadhook();

 

         sign = !sign;

}

 
原创粉丝点击