开发键盘过滤驱动实现模拟按键过程中遇到的问题

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

如何动态御载键盘过滤驱动

     最近写个键盘过滤驱动,遇到的问题是动态御载后再有按键操作就会蓝屏,看了些资料终于明白了原因,写出来供大家参考,免得后来的朋友再重复这个郁闷的过程。

     要做到动态御载键盘过滤驱动,明白其工作运行的原理是很重要的。首先必须要知道键盘过滤驱动是工作在异步模式下的,这一点很重要。为了得到一个按键操作,首先需要发送一个IRP_MJ_READ到驱动的设备栈,驱动收到这个irp会做什么样的处理呢?它会一直保持这个irp为pending未确定状态,因为其实现在一直没有按键操作,直到一个键被真正的按下,驱动此时就会立刻完成这个irp,并将刚按下的键的相关数据做为该irp的返回值。在该irp带着对应的数据返回后,操作系统将这些值传递给对应的事件系统来处理,然后做什么呢??系统紧接着又会立刻发送一个IRP_MJ_READ请求,等待下次的按键操作,重复以上的步骤。也就是说,任何时候设备栈底都会有一个键盘的IRP_MJ_READ请求处于pending未确定状态。这意味着只有在该irp完成返回,并却新的irp请求还未发送到的时候才会有一个很短暂的时间。由此我们想到,我们按照一般的方式动态御载键盘过滤驱动的时候,基本都是有IRP_MJ_READ请求处于pending未确定状态,而我们却御载了驱动,以后按键的时候需要处理这个irp却找不到对应的驱动当然会蓝屏。

     以上分析了动态御载键盘过滤驱动蓝屏的原因,分析到了中间存在一个短暂的时间栈底是没有irp的,那么让我们想办法来解决它。

     网上一份e文资料显示,只有使用IoAttachDevice挂接/Device/KeyboardClass0(or others)才可以动态御载,而加载到UpperFilters的却不能。以下是该段的原文:

     This problem occurs in most of the keyloggers based on the sysinternals Ctrl2cap model, which has been widely adopted and adapted. It applies to the earlier versions of the filter, which manually attach to /Device/KeyboardClass0 (or others) using IoAttachDevice. (If you install your filter by adding it to the UpperFilters value of HKCR/CCS/Control/Class/{4D36E96B-E325-11CE-BFC1-08002BE10318} key as more recent versions of Ctrl2cap do, you just can't unload: your filter is wedged into the stack for as long as the system is running and can't get out. But if you wedge by IoAttachDevice, unloading is still possible in theory.)。


    让我们再深入分析下蓝屏的原因,栈底有irp为什么我们的驱动御载就会有问题呢?这是由于IRM_MJ_READ是异步的,对于异步的请求,基本上我们会关心这个异步请求的结果,如何得到完成后的数据呢?大家一定想到了,设置完成例程。对,就是这样,由于我们给IRP_MJ_READ设置了完成例程,该irp完成后会调用我们的完成例程,使我们有处理返回数据的机会。在这样的情况下,我们动态御载了键盘过滤驱动,也就是说完成例程已经被我们御载掉了,而以后的再次按键在完成这个irp后会调用这个根本已经不存在了的东东,结果蓝屏就可想而知了。

    那是否是不设置完成例程就不会有问题了呢?答案是肯定的。可是没有完成例程我们就没有办法处理到返回的数据,也就在很大程度上失去了键盘过滤驱动的作用了。如何做到既能设置完成例程来处理数据又可以实现动态的御载呢?这里我们这样想,当有IRP_MJ_READ到来的时候,我不为这个irp设置完成例程,也不将该irp向下传递,而是创建一个我自己的irp,并参考前面的IRP_MJ_READ做对应的设置,然后为我自己的这个irp设置完成例程后将我的irp向下传递,并设置原来的IRP_MJ_READ为pending状态。当有按键操作时,我的irp返回触发为它设置的完成例程,在这里取得返回的数据填充前面的IRP_MJ_READ后将该IRP_MJ_READ完成返回。相当于我们使用了一个代理,而这一切都是透明的。到这里我们实现了完成例程,也就是有了处理数据的机会。下面该说到重点了,那就是这样处理后又如何实现动态的御载呢?

    假设现在我们收到御载的请求,让我们看看当前所有的irp处于何种状态:
(1)一个我们保存的原本的IRP_MJ_READ处于pending,注意它并没向下传递,也未设置完成例程。
(2)一个我们自己构造的irp处于栈底,并注意我们为自己的这个irp设置了完成例程。
基本就这2个irp,由于我们自己的irp有完成例程,所以直接御载会出现和上面一样的情况,导致蓝屏。如何处理呢?这里注意到是我们自己构造的irp,所以我们可以将其取消,这样并不会有太大的影响。可是取消后栈底本来该有的IRP_MJ_READ就没有了,注意到(1),我们不是还有原来的IRP_MJ_READ吗?对,就是将原来的这个IRP_MJ_READ向下传递,这里千万注意,我们自己的驱动马上要御载,所以我们传递原来的IRP_MJ_READ的时候不要给它设置完成例程。向下传递后御载我们的驱动。哈哈,成功!!!

 

   当然,这里还有更简单的办法,使用计数器也可以实现,还简单的多:)
 

键盘过滤驱动之IRP劫持 参考资料:[1] 《Rootkits——Windows内核的安全与防护》[2] 让一切输入都难逃法眼(驱动键盘过滤钩子)本文主要介绍通过劫持IRP(IRP_MJ_READ)实现键盘过滤驱动的基本方法。算是学习总结吧。这里简单地列举了几个需要注意的地方:[1] 由于需要动态卸载驱动程序,所以要挂接KeyboardClass0。[2] 键盘过滤驱动工作在异步模式。为了得到一个按键操作,首先会 阅读详情

相关推荐

Python实现基于DD驱动键盘R键连发功能

本文介绍了使用Python实现基于DD驱动键盘R键连发功能的技术方案。文章首先分析了驱动模拟的必要性,指出传统方法在DirectInput游戏等场景下失效的问题。核心挑战在于区分物理按键模拟按键以避免无限循环。解决方案采用DD驱动加载、物理按键监听、注入检测过滤和连发控制逻辑等模块,通过ctypes加载DD驱动DLL,利用Windows低级键盘钩子检测LLKHF_INJECTED标志位来过滤模拟事件。实现部分展示了DD键码映射、驱动加载和按键模拟的代码实现,为游戏开发和自动化测试提供了可靠的键盘连发功

huanghm88的专栏 181

开发键盘过滤驱动实现模拟按键过程中遇到的问题___续

上次解决了动态加载和御载的问题,这里主要说说模拟按键问题.最开始我采用直接保存IRP_MJ_READ后向下CallDriver()传递,要模拟的时候就填数据后IoComplateRequest完成 保存的irp,这样是可以模拟,不过清理过程处理不好,所以模拟后一段时间就出现了蓝屏,提示好象还不是我驱动的错误,居然是kbdclass驱动里面出了问题,显然是我处理irp出了问题.所以我改成了

rageliu的专栏 3180

USB内核过滤驱动

USB过滤驱动程序,通过USB的PID和VID判断是否是合法U盘。

驱动实现模拟键盘按键

标 题: 驱动实现模拟键盘按键作 者: luocong在ring3中实现模拟键盘按键有N^N种方式,比如SendInput()、keybd_event()……但在驱动中要怎么模拟呢?1、写端口大法#define defI8042_DATA_PORT ((PUCHAR)0x60)#define defI8042

1万+

键盘过滤驱动(修正了动态卸载问题)

在笔者接触驱动到现在以来一以后大半个月的时间,从中让我深深的体会到了万事开头难,以及学习持之以恒的重要性。笔者也是个驱动新人,开始接触驱动的时候看着张帆的《Windows驱动开发技术详解》讲的挺细,对新手来说是个不错的学习资料,但是更重要的还是自己要多动手练习,笔者在学习到同步操作的相关知识的时候,实在是看天书。最后还是放弃了学习本书。再找了本楚狂人的资料学习,感觉本书对新手来说还是比较吃力的,其

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 1505

关于键盘过滤驱动卸载后敲击键盘蓝屏的解决方案

最近在学习驱动开发时,看到了一个键盘过滤驱动的文章,于是尝试跑了下代码,发现代码在跑起来时没有问题,但卸载后任意敲击一个按键都会导致蓝屏,因此尝试寻找解决方法。 ​

Seele_Yes的博客 653

键盘过滤驱动

irp请求会从io管理器中传递到设备栈中依次向下发送,当到达底层真实设备处理完成后,会依次返回,这时如果在设备栈中有我们自己注册的设备,就可以起到一个过滤的功能。键盘过滤驱动就是如此,通过附加到原本存在的设备KeyboardClass0中,这时当发生按键时irp也会返回到我们的设备中,进而实现起响应。

qq_45844442的博客 702

终极指南:如何用Interceptor实现Windows键盘驱动高级模拟

Interceptor C#封装库是一款基于Windows键盘驱动的高级输入模拟工具,能够在受保护区域如Windows登录屏幕甚至游戏中实现精准的键盘模拟鼠标点击。本指南将带你从零开始掌握这一强大工具的使用技巧。 ## 🎯 3分钟快速安装步骤 首先通过Git克隆项目到本地: ```bash git clone https://gitcode.com/gh_mirrors/in/Inter

gitblog_01117的博客 1182

Windows键盘驱动开发实战:Interceptor完整使用指南

在Windows系统开发中,实现可靠的键盘鼠标模拟一直是个技术挑战。Interceptor作为基于Windows键盘驱动的C#封装库,提供了在受保护区域如登录屏幕和游戏中模拟输入的终极解决方案。本文将从零开始,完整讲解这个强大工具的使用方法,帮助你轻松掌握Windows键盘驱动开发技巧。 ## 🚀 环境搭建与项目配置 ### 获取项目源码 首先需要获取Interceptor项目的源码:

gitblog_01159的博客 865

Windows键盘驱动Interceptor完整指南:终极输入模拟解决方案

Interceptor是一个基于Windows键盘驱动的C#封装库,为你提供在受保护区域模拟键盘鼠标输入的终极方案。无论你需要操作Windows登录屏幕、游戏界面,还是其他系统级应用,Interceptor都能完美胜任。 ## 🎯 项目概览与核心价值 Interceptor的核心价值在于它能够绕过常规输入限制,在系统底层进行可靠的键盘鼠标模拟。与传统的SendKeys方法不同,Inter

gitblog_00534的博客 950

Interceptor Windows键盘驱动封装库终极指南:快速上手与实战技巧

Interceptor 是一个强大的 Windows 键盘驱动封装库,专门为 C# 开发者设计,能够模拟键盘按键鼠标点击,甚至在受保护的区域如 Windows 登录屏幕和游戏中也能正常工作。这个库基于 Interception 驱动程序,提供了更高级的 API 来处理键盘鼠标事件。 ## 🚀 快速上手:5分钟搞定环境配置 ### 一键安装技巧 想要快速开始使用 Interceptor?

gitblog_01130的博客 669

如何用Interceptor实现Windows高级输入模拟:终极C键盘驱动封装指南

想要在Windows登录屏幕、游戏保护区域甚至UAC权限界面中实现键盘鼠标模拟吗?Interceptor这个强大的C#键盘驱动封装库正是你需要的解决方案。作为Windows输入模拟的终极工具,Interceptor能够突破传统SendInput()的限制,在受保护的环境中实现可靠的键盘按键鼠标点击模拟。 ## 🚀 快速入门:5分钟搭建Interceptor环境 ### 核心组件准备 首先

gitblog_00074的博客 85

Interceptor:Windows输入模拟驱动库实战指南

Interceptor是一个基于C#的Windows键盘驱动封装库,能够模拟键盘按键鼠标点击操作。这个库的独特之处在于它能够在受保护的区域正常工作,比如Windows登录屏幕和游戏环境中。通过封装底层的Interception驱动程序,Interceptor为.NET开发者提供了更加友好和易用的API接口。 ## 🚀 快速配置指南 ### 环境准备步骤 1. **下载依赖组件**

gitblog_01178的博客 1165
上一篇: 2天前开始学习游戏外挂制作,小有收获,嘿嘿
下一篇: 开发键盘过滤驱动实现模拟按键过程中遇到的问题___续
rageliu
博客等级 码龄21年 253粉丝 33原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值