已经4个月没有写过博客了,笔者如今已经回到学校,终于可以继续更了。

消息钩子

Windows操纵系统向用户提供GUI,它以事件驱动方式工作。在Windows操作系统中借助鼠标、键盘,选择菜单、按钮,以及移动鼠标、改变窗口大小与位置都是事件。发生一个事件时,OS会把事先定义好的消息发送给相应的应用程序,应用程序分析收到的消息后执行相应的动作。敲击键盘时,消息会从OS发送到应用程序。而消息钩子就是在这中间偷看信息。

SetWindowsHookEx()

使用SetWindowsHookEx() API可以轻松实现钩子,SetWindowsHookEx()定义如下

1

2

3

4

5

6HHOOK SetWindowsHookEx(){

int idHook, // hook type

HOOKPROC lpfn, // hook procedure

HINSTANCE hMod, // hook procedure所属的DLL句柄

DWORD dwThreadId // 想要挂在的线程ID

}

hook procedure 是由操作系统调用的回调函数。安装消息钩子时,hook procedure需要存在于某个dll内部,且该dll的instance handle即是hMod。若dwThreadId参数设置为0,则安装的钩子为全局钩子,会影响到运行中的所有进程。

使用SetWindowsHookEx()设置钩子之后,在某个进程中生成指定消息时,操作系统会将相关的dll强制注入相应进程,然后调用注册钩子的过程。注入进程时用户几乎不需要做什么,非常方便。

一个键盘消息钩子的demo

编写两个pe文件:HookMain.exe与KeyHook.dll,当在notepad输入时,拦截消息。HookMain是最先加载KeyHook.dll并安装键盘钩子的程序。HookMain.exe加载KeyHook.dll文件后使用SetWindowsHookEx()安装键盘钩子(KeyboardProc)。若其他进程中发生键盘输入事件,OS就会强制将KeyHook.dll加载到相应进程内存,然后调用KeyboardProc()函数。由于OS会将KeyHook.dll强制加载到发生键盘输入事件的所有进程,所以消息钩子技术常常被用作一种dll注入技术。

HookMain.cpp源码1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33#include "windows.h"

#include

#define DLL_NAME "KeyHook.dll"

#define HOOKSTART "HookStart"

#define HOOKSTOP "HookStop"

using Func_HOOK = void(*)();

int main()

{

HMODULE hDLL = NULL;

Func_HOOK HookStart = NULL;

Func_HOOK HookStop = NULL;

char ch = 0;

// 加载KeyHook.dll

hDLL = LoadLibraryA(DLL_NAME);

// 获取导出函数地址

HookStart = (Func_HOOK)GetProcAddress(hDLL, HOOKSTART);

HookStop = (Func_HOOK)GetProcAddress(hDLL, HOOKSTOP);

// 开始钩取

HookStart();

printf("press q to quit\n");;

while (getchar() != 'q');

// 终止钩取

HookStop();

// 卸载KeyHook.dll

FreeLibrary(hDLL);

}

KeyHook.cpp源码1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59#include "windows.h"

#include

#define PROCESS_NAME "notepad.exe"

HINSTANCE g_hInstance = NULL;

HHOOK g_hHook = NULL;

HWND g_hWnd = NULL;

BOOL APIENTRY DllMain( HMODULE hModule,

DWORD ul_reason_for_call,

LPVOID lpReserved

)

{

switch (ul_reason_for_call)

{

case DLL_PROCESS_ATTACH:

g_hInstance = hModule;

break;

case DLL_PROCESS_DETACH:

break;

}

return TRUE;

}

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

{

char szPath[MAX_PATH] = { 0, };

char* p = NULL;

if (nCode >= 0)

{

if (!(lParam & 0x80000000)) // 释放键盘按键

{

GetModuleFileNameA(NULL, szPath, MAX_PATH);

p = strrchr(szPath, '\\');

// 比较当前进程名,若为notepad.exe,则不传递消息给下一个钩子

if (!_stricmp(p + 1, PROCESS_NAME))

{

return 1;

}

}

}

// 若非notepad.exe,则调用CallNextHookEx()函数,将消息传递给下一个钩子

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

}

extern "C"

{

__declspec(dllexport) void HookStart()

{

g_hHook = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, g_hInstance, 0);

}

__declspec(dllexport) void HookStop()

{

if (g_hHook)

{

UnhookWindowsHookEx(g_hHook);

g_hHook = NULL;

}

}

}

笔者使用win10,vs2019测试成功。需要注意两点:

vs编译时需使用和notepad.exe相同的位数,也就是如果notepad是32位,就编译32位,notepad是64位就编译64位。

关闭输入法。

vs2019键盘钩子_Windows消息钩子相关推荐

  1. Win64 驱动内核编程-28.枚举消息钩子

    枚举消息钩子 简单粘贴点百度的解释,科普下消息钩子: 钩子是WINDOWS中消息处理机制的一个要点,通过安装各种钩子,应用程序能够设置相应的子例程来监视系统里的消息传递以及在这些消息到达目标窗口程序之 ...

  2. 关于Windows消息钩子的理解与测试项目

    前奏 近来一直在自学Windows Hook相关的知识,已经尝试多种注入方式.尤其对消息钩子方式很感兴趣,因为看到Spy++能够截获系统中绝大多数应用的消息流,就很想知道它的工作原理,打算制作属于自己 ...

  3. 消息钩子与定时器(VC_Win32)

    目录 消息钩子 定时器 (本章节中例子都是用 VS2005 编译调试的) 消息钩子 [概述][相关函数][编写消息钩子] 概述 钩子过程 操作系统在传递消息时,将我们感兴趣的消息先传递给HOOK过程, ...

  4. 安装全局消息钩子实现dll窗体程序注入

    说明{      通过设置全局消息钩子来实现dll注入,然后窗体有相关消息请求的时候就会自动加载注入dll, 然后在入口处做处理就可以了.注入方式简单很多,比代码注入和lsp等注入都简单,就不解释了. ...

  5. 飞鸽传书最新C++源码:这两个消息钩子

    飞鸽传书最新C++源码:这两个消息钩子的 飞鸽传书 最新源码钩子函数极其相似就不分开说明,只说明一个消息钩子子程的流程.2.排除密码框.3.如果不是密码框,则钩子函数中对键盘消息进行记录,特别处理wm ...

  6. 计算机病毒对消息钩子的利用与对抗

    作 者: dncwbc 时 间: 2011-10-07,23:57:15 链 接: http://bbs.pediy.com/showthread.php?t=141059 一.消息钩子的概念     ...

  7. Windows 反消息钩子(1)

    消息钩子在Windows编程中有着非常广泛的应用,它可以任意拦截Windows系统,这个以消息为驱动的系统中的绝大多数消息类型.一方面这给编程者带来了巨大的灵活性,另一方面也埋下了巨大隐患,大多数窃密 ...

  8. windows中使用钩子拦截消息

    一.前 言 众所周知,Windows程式的运行是依靠发生的事件来驱动.换句话说,程式不断等待一个消息的发生,然后对这个消息的类型进行判断,再做适当的处理.处理完此次消息后又回到等待状态.从上面对Win ...

  9. 消息钩子使用教程(转)

    基本概念钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的.当消息到达后,在目标窗口处理函数之前处理它 ...

  10. windows消息处理过程及消息钩子

    应用层发消息: 发送消息过程 SendMessage(user32.dll)->SendMessageWorker,先检查有没有hook消息钩子,有的话调用CsSendMessage,进入消息钩 ...

最新文章

  1. JQuery Autocomplete实战
  2. 给定一个最多包含40亿个随机排列的32位整数的顺序文件,找出一个不在文件中的32位整数
  3. 局域网速度变慢的故障分析
  4. 160 - 45 Dope2112.2
  5. CSS word-wrap强制换行截断长字符串
  6. GAN 的渐进式训练方法 PI-REC:手绘草稿迅速重建为完整图像...
  7. HDU4536+DFS
  8. Deepin安装和设置Kodi,实现手机APP投屏和IPTV功能
  9. json模块的转义dump 和反转义 loap
  10. c语言给数组整体赋值,c语言给数组赋值有哪些形式
  11. 学生信息管理系统可行性研究报告
  12. VSCode自定义网络背景皮肤
  13. QT 代码行统计工具
  14. 计算机显示器有几个接口,电脑显示器的接口有几种?有哪些区别又要如何挑选呢?长知识了!...
  15. 这个开源项目绝绝子,一键生成好玩的矢量风格头像!
  16. git 国外镜像下载慢的解决方案
  17. 正确使用pageX、pageY、offsetLeft、offsetTop
  18. 2021-09-29 每天几个LCEDA小知识——如何修改元器件封装
  19. MissileDatcom 导弹气动计算
  20. “华为起诉美国”事件进展:美国联邦法院给美国政府发传票

热门文章

  1. vue 高德地图使用热力图
  2. 【亲测可行】如何使用Xshell连接服务器(删除服务器,调节终端字号)
  3. 傅立叶变换、拉普拉斯变换、Z变换的联系
  4. 希腊数字matlab,latex 希腊数字
  5. 一、二线城市 IT 公司大盘点!建议收藏
  6. F-droid 源码片段(二)下载模块整理
  7. no phone android,NoPhoneSpam | F-Droid - Free and Open Source Android App Repository
  8. Vivado的下载和安装
  9. 倾斜摄影——3维建模软件PhotoScan教程(附安装包+教学视频)
  10. VOC2007数据集的下载和解压