笫八章键盘记录.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
笫八章键盘记录

笫八章:按键记录 概述 到目前为止,我们所创建的钩子和过滤器所能做的仅仅是一些监视和过滤的工作,在本章我们会介绍另一项要进行的工作-按键记录。非常不幸的是,文件操作(记录)需要在passive level 进行.而我们本章创建的键盘记录器可以运行在dispatch level上.因为在dispatch level上进行文件操作会导致操作系统崩溃,所以必须要有一个线程,一个存储数据的介质和一个同步方法来保证正常地操作.。本章包含以下内容: 处理级别 一个键盘记录器 线程与同步 解读按键码 一个实例 测试实例 处理级别 在介绍内核级多线程及其同步的复杂性之前,我们应该先讨论下为什么要进行键盘记录。本书所实现的rootkit是作为一个内核备驱动来实现的,而设备驱动是运行在许多可以限制它们的功能的处理级别上的,下面描述了设备驱动处理级别和在这些处理级别上调用的例程: IRQL = PASSIVE_LEVEL 运行在此级别的例程:DriverEntry,AddDevice, Reinitialize, Unload ,大部分分发函数,驱动创建的线程和工作线程回调。在这个处理级别上没有屏蔽任何中断。 IRQL = APC_LEVEL 运行在此级别的例程:一些分发函数运行在这个处理级别上。在这个处理级别上APC_LEVEL 中断会被屏蔽掉。 IRQL = DISPATCH_LEVEL 运行在此级别的例程:StartIo,,AdapterControl,,AdapterListControl,,ControllerControl,,IoTimer,,Cancel (在等待cancel旋转锁的时候),,DpcForIsr,CustomTimerDpc,和CustomDpc。DISPATCH_LEVEL和APC_LEVEL中断会被屏蔽掉,设备中断,时钟中断和电源故障中断都可以发生在这个处理级别上。 IRQL = DIRQL 运行在此级别的例程:InterruptService 和SynchCritSection 。所有IRQL= DIRQL 的中断都会被屏蔽。设备中断级别高于DIRQL的中断可以和时钟和电源故障中断一起发生。 因为我们在DISPATCH_LEVEL级别上进行键盘按键数据的收集,而文件I/O请求在PAAIVE_LEVEL级别上,所以必须要创建一个运行在PASSIVE_LEVEL级别上的线程来把实际的键盘按键数据写入到磁盘里。 一个键盘记录器 编写一个键盘记录器是学习windows操作系统的一种非常好的方式。前面的过滤器(网络和文件)的例子只是简单地对通信进行过滤,而键盘记录不但要加上复杂的I/O完成例程,还要把信息记录到文件里,在这一步可能会发生一些莫名奇妙的错误.往好的方面想,我们本书里要开发的这个rootkit已经创建了一个新的设备而且能够处理设备I/O,所以一个键盘记录器的基础我们已经有了. 正如前面说过,键盘I/O需要一个完成例程,这是一个能在键盘数据返回到接受按键程序的堆栈前来截获这些数据的回调函数。要接收一个按键,一个上层的驱动必须要下发一个空的IRP然后等待按键,当一个键被按下的时候,IRP已经完成而且按键数据已经返回到栈中,如果我们正在写的是一个实际的驱动程序这是非常棒的,但对一个过滤驱动来说还需要考虑一些其它的问题。 键盘驱动栈的设计需要一个键盘记录器来附加到栈上,然后等待上层驱动发来一个空IRP,在空IRP向下传递之前记录器必须注册自己的回调例程,这样,当被调用的时候,键盘记录器回调函数可以在按键数据返回到创建源IRP的设备前查看这些按键信息,这是对每个要返回到键盘驱动栈的按键(通常是两次:一次是按键按下,另一次是按键弹起)都要做的. 这种IRP的拦截方法在rootkit被卸载的时候会产生一个特殊的问题,当rootkit被卸载的时候,rootkit注册的回调函数会从内存中移除,但是在大多数情况下,这个回调函数已经被一个空的IRP注册了,当下一个按键被按下时这个函数会被调用.这样当下一个按键被按下的时候就很有可能会导致系统崩溃,如果你不熟悉这个术语(崩溃)的话,通常用蓝屏死机(BSOD)来描述这种情况.为了防止出现这种情况,rootkit需要创建自己的IRP, 然后把它们关联到被截获的IRP上,并且用它们来代替截获到的IRP给发送出去.这样在卸载rootkit的时候就可以取消所有pending IRP.图8-1展示了怎么插入一个键盘记录器 8-1 这里的按键记录同样存在有问题.之前提到过,由键盘记录器注册的回调函数运行在DISPATCH特权级上,而文件I/O操作仅仅能在PASSIVE特权级上进行.这就需要由回调函数把键盘数据临时地保存在一个地方,然

文档评论(0)

busuanzi + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档