钩子英文名叫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); }

最新文章

  1. PV、EV、AC、BAC、EAC、ETC等计算公式含义
  2. cookie手工注入
  3. VPS/服务器优化网络、加速方法总结与参考
  4. Listbox与Listbox with key的区别
  5. 关于Windows Phone平台音乐播放的的技术调研
  6. [bzoj 1027][JSOI2007]合金(解析几何+最小环)
  7. Core Java Volume I — 4.6. Object Construction
  8. Heap Only Tuples (HOT)
  9. Thread类详解
  10. JS操作Radio与Select
  11. [转载]AOP面向方面编程
  12. C++ 嵌套类使用(二)
  13. c语言学习之基础知识点介绍(十一):字符串的介绍、使用
  14. UVa 10397 Connect the Campus
  15. VC编程 快捷键增加的几种方式
  16. 读书笔记 effective c++ Item 29 为异常安全的代码而努力
  17. python多进程之间的通信:消息队列Queue
  18. Help Jimmy ~poj-1661 基础DP
  19. 如何在苹果笔记本上装win7系统
  20. mysql数据库NO CONNECTION问题分析以及解决方案

热门文章

  1. [002] - JavaSE面试题(二):基本数据类型与访问修饰符
  2. Mybatis order by 动态传参出现的一个小bug
  3. PAT乙级:1066 图像过滤 (15分)
  4. 在 Golang 中实现一个简单的Http中间件
  5. etcd学习(4)-centos7中部署etcd
  6. WebAssembly正逐渐成为FaaS的主力
  7. lis分析之一一批处理(任务)如何连接数据库的
  8. Prometheus + Alertmanager 实现企微告警
  9. QT: 如何移动和缩放一个无边框窗口
  10. JS的FileSaver在Chrome上保存失败