WQXNETQIQI
驱动大牛
驱动大牛
  • 注册日期2006-06-12
  • 最后登录2010-10-26
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望1076点
  • 贡献值0点
  • 好评度895点
  • 原创分1分
  • 专家分0分
阅读:2032回复:0

[恢复]对键盘过滤驱动动态御载时蓝屏的深入分析以及可行的解决方案(1)

楼主#
更多 发布于:2007-01-02 21:24
  这是在 2006年12月16日 22:54:07 GMT 检索到的 http://bbs.driverdevelop.com/job.php?rd_previous-1-fid-16-tid-120995-fpage--goto-next.html 的 G o o g l e 缓存内容。
G o o g l e 已先预览各网页,拍下网页的快照存档。
这网页可能有更新的版本,请按此查看最新版。
本缓存网页可能引用了已经不存在的图片。单击此处,只查看缓存文本。
请使用网址 http://www.google.com/search?&q=cache:pNUrwwv9ZEwJ:bbs.driverdevelop.com/job.php%3Frd_previous-1-fid-16-tid-120995-fpage--goto-next.html+%E5%AF%B9%E9%94%AE%E7%9B%98%E8%BF%87%E6%BB%A4%E9%A9%B1%E5%8A%A8%E5%8A%A8%E6%80%81%E5%BE%A1%E8%BD%BD%E6%97%B6%E8%93%9D%E5%B1%8F%E7%9A%84%E6%B7%B1%E5%85%A5%E5%88%86%E6%9E%90%E4%BB%A5%E5%8F%8A%E5%8F%AF%E8%A1%8C%E7%9A%84%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88(1)&hl=zh-CN&gl=cn&ct=clnk&cd=1 链接此页或将其做成书签。


Google 和网页作者无关,不对网页的内容负责。
这些搜索字词都已标明如下:  对  键盘  过滤  驱  动  动态  御  载  时  蓝  屏  深入  分析  以及  可行  解决  方案  1  
 
 

--------------------------------------------------------------------------------
  
 
控制面板 | 短消息 | 搜索 | 会员 | 帮助 | 社区 | 首页 | 无图版  
 

   密码忘了...怎么办?邮件收不到....
欢迎使用驱网身份认证服务。
发送 ARCK#UserName#Password 到 93891152 进行身份认证。
认证后可以用手机直接取回密码。


 驱动程序开发网技术社区 -> Kernel Mode discussion and Soft Driver -> 对键盘过滤驱动动态御载时蓝屏的深入分析以及可行的解决方案(1) 转到动态网页  
 

    
--> 本页主题: 对键盘过滤驱动动态御载时蓝屏的深入分析以及可行的解决方案(1) 加为IE收藏 | 收藏主题 | 上一主题 | 下一主题  
rageliu
 


 
级别: 驱动小牛
精华: 0
发帖: 205
威望: 217 点
积分: 60 分
贡献值: 0 点
注册时间:2006-06-01
        

对键盘过滤驱动动态御载时蓝屏的深入分析以及可行的解决方案(1)

如何动态御载键盘过滤驱动(参考一份e文资料+我自己的理解)

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

  要做到动态御载键盘过滤驱动,明白其工作运行的原理是很重要的。首先必须要知道键盘过滤驱动是工作在异步模式下的,这一点很重要。为了得到一个按键操作,首先需要发送一个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后会调用这个根本已经不存在了的东东,结果蓝屏就可想而知了。

  这篇深入分析了动态御载键盘过滤驱动蓝屏的原因,让大家理解了本质的东西,如果大家觉得这篇文章还有些作用,我会继续补上后面的分析及可行的解决方案.
 
驱网网上商城-开发板,开发资料光盘
 
潜心修炼DDK  
[楼 主] Posted:2006-11-24 09:26|  
 
 
wowocock


 

 
 
级别: 驱动老牛
精华: 1
发帖: 4155
威望: 566 点
积分: 5587 分
贡献值: 1 点
注册时间:2002-04-08
        



恩,对,基本就是这个原因,解决也很简单,设置个计数器,在READ里计数器++,在READ COMPLTER里计数器--;在卸载之前,先DETACH,然后再设置循环等待,到计数器为0在UNLOAD,一般你在DETACH后再按一个键即可.
 
高速无限下载文件,请申请vip会员
 
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠  
[1 楼] Posted:2006-11-24 09:38|  
 
 
rageliu
 


 
级别: 驱动小牛
精华: 0
发帖: 205
威望: 217 点
积分: 60 分
贡献值: 0 点
注册时间:2006-06-01
        



呵呵,谢谢老大提点.

老大,你实现了模拟按键了吗?我正研究这个东东,快指点指点啊
 
高速无限下载文件,请申请vip会员
 
潜心修炼DDK  
[2 楼] Posted:2006-11-24 09:45|  
 
 
wowocock


 

 
 
级别: 驱动老牛
精华: 1
发帖: 4155
威望: 566 点
积分: 5587 分
贡献值: 1 点
注册时间:2002-04-08
        



不研究键盘很久了,现在对键盘方面的了解和BC差不多,如果你有什么好的想法,也请提出来,方便大家学习,讨论,呵呵.
 
高速无限下载文件,请申请vip会员
 
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠  
[3 楼] Posted:2006-11-24 09:49|  
 
 
rageliu
 


 
级别: 驱动小牛
精华: 0
发帖: 205
威望: 217 点
积分: 60 分
贡献值: 0 点
注册时间:2006-06-01
        



既然一直有IRP_MJ_READ在栈底,我觉得需要取消这个irp,自己返回需要模拟的键的值,也只有个想法,还要研究研究,不知道有没有实现了的人给点提示
 
驱网网上商城-开发板,开发资料光盘
 
潜心修炼DDK  
[4 楼] Posted:2006-11-24 13:30|  
 
 
zzzevazzz


 


 
级别: 驱动小牛
精华: 0
发帖: 104
威望: 102 点
积分: 1022 分
贡献值: 0 点
注册时间:2002-12-27
        



一般的模拟按键,都是在Windows消息机制上做文章,只能骗骗应用程序,要骗过滤驱动就得更底层。
中断级的键盘记录在获取ScanCode之后都要把数据重新写回到键盘输出寄存器,以便真正的中断服务能正常处理中断。
同样的办法,应该也可以用来模拟按键,让IRP包返回。
WRITE_PORT_UCHAR(0x64, 0xD2);
WRITE_PORT_UCHAR(0x60, ScanCode);
 
高速无限下载文件,请申请vip会员
 
签名档字数限制居然只有30字节!  
[5 楼] Posted:2006-11-24 13:39|  
 
 
zaley


 


 
级别: 驱动牛犊
精华: 1
发帖: 80
威望: 81 点
积分: 801 分
贡献值: 0 点
注册时间:2004-07-09
        



写端口对于USB键盘无效,只要将pending的IRP完成就可模拟键盘鼠标消息
 
高速无限下载文件,请申请vip会员
 
[6 楼] Posted:2006-11-24 15:02|  
 
 
rageliu
 


 
级别: 驱动小牛
精华: 0
发帖: 205
威望: 217 点
积分: 60 分
贡献值: 0 点
注册时间:2006-06-01
        



楼上的,能说详细点吗??
pending的irp已经向下传递到了栈底,我要如何处理呢?
 
驱网网上商城-开发板,开发资料光盘
 
潜心修炼DDK  
[7 楼] Posted:2006-11-24 21:42|  
 
 

  快速跳至 >> 初学者入门  |- c/c++入门(含vc使用)  |- InnoSetup 中文讨论区  |- 黑客反汇编之 asm2c  |- Keil C 使用  |- 电子技术基础  |- ABC初学者  |- 驱动及应用程序安装程序制作 >> 安全技术  |- 反流氓、反木马和rootkit  |- 特洛伊之木马故乡  |- 网络安全技术  |- 病毒技术分析 >> 阅读与交流  |- windows 源码解读  |- 书评 >> 各取所需  |- 求职专区  |- 合作开发  |- 供需信息 >> 驱动开发  |- 每周话题  |- vista & x64 驱动程序  |- WDF 学习与研究  |- Kernel Mode discussion and Soft Driver  |- USB驱动开发  |- 非USB硬件驱动开发  |- 图形设备驱动版(打印、扫描、显示...驱动)  |- Mac 驱动开发  |- NDIS网络接口开发  |- LINUX&UNIX核心开发  |- 开发工具使用  |- (IEEE1394)FireWire  |- 文件系统(过滤)驱动程序开发  |- 软件工程在驱动开发中的应用  |- 总结、原创区 >> 硬件开发  |- DSP & PLD &FPGA  |- 硬件设计  |- FirmWare  |- 集成电路设计(IC) >> SNMP网管  |- SNMP网管软件开发 >> 嵌入式系统及掌上设备  |- 嵌入式系统开发  |- Wince 程序开发  |- VxWorks >> 程序人生  |- 疯狂灌水  |- 新闻,要闻,花边  |- IT新闻  |- 情感小屋  |- I love English  |- 程序人生  |- 志宁自语  |- MP3 & FLASH 共享  |- 艺术&帖图区  |- 漂流一族 >> 其它事务  |- 用户留言  |- 软件使用与交流 >> 公司黑白名单  |- 白名单  |- 黑名单 >> 合作网站技术支持论坛  |- 驱动开发网在线商城  |- syser debugger  |- S1系列PCI开发板、FPGA开发板支持  |- PLX PCI 开发板支持  |- DriverStudio 技术支持  

 驱动程序开发网技术社区 -> Kernel Mode discussion and Soft Driver
    

快速发帖 顶端
 
内容:
HTML 代码不可用

使用签名
Wind Code自动转换

[查看帖子长度]  标题:  
表情:        
      

     按 Ctrl+Enter 直接提交    


 


Powered by PHPWind v4.3.2 Code ? 2003-05 PHPWind
This is html template view this page faster

You can contact us
驱动开发者 呵呵
游客

返回顶部