https://bbs.pediy.com/thread-178926.htm
普通模式调用SendMessage、PostMessage,增强模式调用keybd_event,mouse_event、 SendInput发送键盘鼠标消息。只要HOOK 内核层的NtUserPostThreadMessage、NtUserPostMessage、NtUserMessageCall、NtUserSendInput这几个API,并在其中判断发送的目的地址是否为我们要保护的进程就行了。附件中代码使用Hook KiFastCallEntry的方式Hook NtUserPostThreadMessage、NtUserPostMessage、NtUserMessageCall、NtUserSendInput这几个内核API。
比较常用的方式,很多游戏辅助用的就是这种方式。因为是操作类驱动中的函数,所以能同时兼容PS/2和USB的键盘鼠标模拟,被按键精灵、游戏辅助广泛使用。它直接调用KeyboardClassServiceCallback、MouseClassServiceCallback。这两个函数是Windows键盘鼠标端口驱动(Kbdhid.sys、i8042prt.sys、mouclass.sys、mouhid.sys)在获得键盘鼠标硬件输入后往上传递给类驱动(Kbdclass.sys、mouclass.sys)的两个回调函数。
若是键盘鼠标类驱动和端口驱动中有层过滤驱动(eaps2kbd),则需回溯多个栈帧(ebp+n)查找系统的键盘鼠标端口驱动。附件中代码使用Call Hook替换键盘鼠标回调。kbdclass.sys驱动中KeyboardClassServiceCallback函数的反汇编代码如下:
原文地址:https://www.cnblogs.com/enych/p/12216581.html