mfc HackerTools全局钩子
钩子英文名叫Hook,是一种截获windows系统中某应用程序或者所有进程的消息的一种技术。
如在键盘中按下一键,操作系统将收到键按下消息,把消息放入消息队列,然后消息队列对消息进行派发,发给相应的应用程序,经过应用程序处理后发给操作系统,操作系统再调用相应的应用程序的创建的窗口过程。
SetWindowsHookEx安装一个应用程序定义的钩子过程,并把创建的钩子过程放在钩子链中,可以安装多个钩子,多个钩子就形成了钩子链,最后安装的钩子总是在最前面。
LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam);形参含义并不是都一样的,不同钩子过程形参表示的意义不一样。
BOOL UnhookWindowsHookEx(HHOOK hhk);此API的功能是把SetWindowsHookEx创建的钩子从钩子链中移除。形参是SetWindowsHookEx返回的钩子句柄。
全局钩子必须在DLL上实现,钩子过程不能在本进程代码中实现,所以先得写一个DLL。
#include "stdafx.h" extern HMODULE g_hDllMoudle; //dll的句柄 //共享内存 #pragma data_seg("mydata") //创建一个名为mydata的数据段 HHOOK g_hHook = NULL; #pragma data_seg() #pragma comment(linker,"/SECTION:mydata,RWS") //把mydata数据段设置为可读可写可共享 extern "C" _declspec(dllexport) //钩子回调函数 LRESULT GetMsgProc(int code, WPARAM wParam, LPARAM lParam) { MessageBoxA(0, "弹窗", "你中毒了", 0); return CallNextHookEx(g_hHook, code, wParam, lParam); } extern "C" _declspec(dllexport) //设置全局钩子 BOOL SetGlobalHook() { g_hHook = SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC)GetMsgProc, g_hDllMoudle, 0); if (g_hHook==NULL) { return FALSE; } return TRUE; } extern "C" _declspec(dllexport) //卸载全局钩子 BOOL UnSetGlobalHook() { if (g_hHook) { UnhookWindowsHookEx(g_hHook); } return TRUE; }
调用DLL中的钩子
void CInject::SetGlobalHook() { //定义函数指针和函数指针变量 typedef BOOL(*typedef_SetGlobalHook)(); typedef_SetGlobalHook fnSetGlobalHook = NULL; //获取DLL加载基址 m_hDll = LoadLibrary(m_Edit); if (m_hDll) { m_TipMsg += L"DLL加载成功\r\n"; } else { m_TipMsg += L"DLL加载失败\r\n"; } //获取函数地址 给函数指针变量赋值 fnSetGlobalHook = (typedef_SetGlobalHook)GetProcAddress(m_hDll, "SetGlobalHook"); if (fnSetGlobalHook) { m_TipMsg += L"加载函数地址成功\r\n"; } else { m_TipMsg += L"加载函数地址失败\r\n"; } //设置全局钩子 BOOL bRet = fnSetGlobalHook(); if (bRet) { m_TipMsg += L"设置全局钩子成功 开始无限弹框\r\n"; } else { m_TipMsg += L"设置全局钩子失败\r\n"; } UpdateData(FALSE); }