Windows事件驱动的媒介是消息,而消息的传递则存在破绽。

一、What should I do?

监听notepad键盘输入,并存入文件“input.txt",而且用户不能察觉出来(即notepad正常回显字符)。

二、程序思路

  • 利用Windows消息钩取机制,向Windows系统注册一个消息钩子,该钩子存在于自己编写的dll中,一旦监听到来自notepad的键盘消息就将其存入文件。
  • 值得一提的是,这里还顺便向所有发生键盘消息的进程注入了自己的dll文件。

三、关键语句实现

整个程序的关键就是这个包含了消息钩子过程的dll文件的编写,然后主程序调用此dll文件中的消息钩子完成键盘监听。

Hookdll:
我这里主要谈谈回调函数KeyboardProc,也就是钩子的处理逻辑。
回调函数是在消息发生时操作系统调用的一种用户自定义函数,它负责告诉操作系统怎样处理消息,当然这里只针对键盘消息。

先说说参数:ncode指示按键状态,wParam存放虚拟键值,lParam对键盘状态进行位标识。

程序逻辑是这样的:当ncode大于等于0且lParam最高位为1时,用户有按键动作,这时我们调用GetModuleFileNameA函数获取发出此键盘消息进程的绝对路径,然后经过一个_tcsrchr函数定位到此进程可执行文件名,若可执行文件名等于”notepad++.exe"(我这里采用了宏定义DEF_PROCESS_NAME),则将此按键消息写入notepad文件路径下的“input.txt",而且并不截取消息,保证了notepad的正常处理(这里指字符回显)。
简单的Windows消息钩取
这里对挂钩和卸钩的动作进行封装,分别在HookStart和HookStop函数中,方便外部程序调用。一旦HookStart函数启动,便开始监听notepad键盘消息;一旦HookStop函数启动,则停止键盘监听,并会销毁注入其他进程的Hookdll.dll。
简单的Windows消息钩取

TestHook:
这里要做的事情很简单,调用前面dll中的两个函数完成键盘监听。
简单的Windows消息钩取
要注意的事情有:64位的钩子钩取64位的消息,32位的钩子钩取32位的消息。如果你的程序有卡死现象,那十有八九就是这个问题了。
另外,有兴趣的同学可以参考【韩】李承远的《****核心原理》一书,类似完整代码可以在书中找到。

四、运行结果截图

运行成功,尽管这里钩取的消息全都是大写的。
简单的Windows消息钩取

相关文章: