您好、欢迎来到现金彩票网!
当前位置:老k棋牌 > 分层实施拦截 >

一种防止底层驱动拦截消息的方法

发布时间:2019-06-19 13:21 来源:未知 编辑:admin

  【专利摘要】本发明公开了一种防止底层驱动拦截消息的方法,涉及计算机【技术领域】。所述方法包括,将查找到的系统键盘驱动的设备对象与创建的键盘过滤驱动的设备对象链接并加入设备驱动链中;修改硬件消息中的所述键盘过滤驱动的设备对象对应的堆栈单元,并设置完成函数,以及将硬件消息发送给系统键盘驱动;通过上述修改,当所述完成函数被调用时,则所述键盘过滤驱动对所述硬件消息中的数据进行加密,然后将硬件消息返回给系统。本发明提供的方法能够让承载键盘输入数据的硬件消息跳过底层的恶意驱动,从而达到防拦截和保证键盘输入安全的目的。

  [0001] 本发明涉及计算机【技术领域】,尤其涉及一种防止底层驱动拦截消息的方法。

  [0002] 随着计算机技术的不断发展,对信息安全的要求也越来越高,而越来越多的针对 键盘输入环节的拦截技术使得计算机的信息安全技术面临严峻考验。针对键盘输入的拦截 技术分为应用层拦截和驱动层拦截,驱动层较应用层更底层,也更先拦截到键盘输入。

  [0003] 由于Windows的驱动架构是分层处理的,驱动架构中的系统键盘驱动为Windows 系统自带,驱动架构中的第三方键盘过滤驱动和系统键盘驱动之间可能会存在其他恶意驱 动,这样驱动架构中位于底层的其他驱动会先于其上层的键盘过滤驱动获得硬件消息(专 业术语叫IRP),为了防止位于底层的恶意的其他驱动对位于其上层的键盘过滤驱动与位于 其底层的系统键盘驱动之间传递的IRP进行拦截和篡改,目前现有技术中广泛使用的防拦 截方法是通过加密技术使得底层的恶意驱动对IRP的拦截和篡改失败。但目前这种防拦截 方法在加密信息被泄露的情况下是无法达到预期效果的。因此,发明一种让IRP跳过底层 驱动,以达到防止底层驱动拦截这一目的的防拦截方法是发明人亟待解决的问题。

  [0004] 为解决现有技术中存在的问题,本发明提出了一种通过跳过底层驱动实现的防止 底层驱动拦截消息的方法。

  [0005] 本发明采用的技术方案如下:一种防止底层驱动拦截消息的方法,包括步骤A至 步骤C :

  [0006] 步骤A :当键盘过滤驱动被系统加载时,所述键盘过滤驱动执行:查找到系统键盘 驱动的设备对象,创建键盘过滤驱动的设备对象,分配设备扩展内存来存储系统键盘驱动 的设备对象指针,将创建的所述键盘过滤驱动的设备对象与所述系统键盘驱动的设备对象 进行链接并加入驱动设备链中;

  [0007] 步骤B :当所述驱动设备链中的所述键盘过滤驱动收到硬件消息时,所述键盘过 滤驱动执行:根据所述硬件消息找到所述键盘过滤驱动的设备对象对应的堆栈单元,将找 到的堆栈单元的信息拷贝到下一层驱动的设备对象对应的堆栈单元中,并在所述下一层驱 动的设备对象对应的堆栈单元中设置完成函数,然后根据所述设备扩展内存中的所述系统 键盘驱动的设备对象指针找到系统键盘驱动的设备对象,发送所述硬件消息给所述系统键 盘驱动的设备对象;

  [0008] 步骤C :当所述完成函数被调用时,所述键盘过滤驱动执行:对所述硬件消息中的 数据进行加密,然后将硬件消息返回给系统。

  [0011] 步骤a2 :根据所述声明函数返回的键盘驱动对象指针获取键盘驱动对象,解析所 述键盘驱动对象,获取键盘驱动对象的第一个设备对象指针作为当前设备对象指针;

  [0012] 步骤a3 :判断当前设备对象指针是否为空,是则结束,否则执行步骤a4 ;

  [0015] 步骤a6 :判断上层设备对象指针是否为空,是则执行步骤a7,否则执行步骤a8 ;

  [0016] 步骤a7 :解析所述键盘驱动对象,获取键盘驱动对象的下一个设备对象指针作为 当前设备对象指针,返回执行步骤a3,

  [0017] 步骤a8 :根据上层设备对象指针获取上层设备对象,并将上层设备对象作为当前 设备对象,解析当前设备对象对应的驱动对象,获取驱动名称;

  [0018] 步骤a9 :判断获取到的驱动名称是否为预设驱动名,是则执行步骤alO,否则返回 执行步骤a5 ;

  [0019] 步骤alO :将当前设备对象记录为系统键盘驱动的设备对象。

  [0020] 所述步骤alO之后还包括:判断所述系统键盘驱动的设备对象指针是否为空,是 则返回执行步骤a7,否则执行步骤A中所述创建键盘过滤驱动的设备对象,分配设备扩展 内存来存储系统键盘驱动的设备对象指针。

  [0021] 上述步骤A所述将创建的所述键盘过滤驱动的设备对象与所述系统键盘驱动的 设备对象进行链接并加入驱动设备链中,具体为:调用IoAttachDeviceToDeviceStack将 创建好的所述键盘过滤驱动的设备对象与所述系统键盘驱动的设备对象进行链接,然后将 创建好的所述键盘过滤驱动的设备对象加入驱动设备链中。

  [0022] 上述步骤B之前还包括:系统创建硬件消息,发送所述硬件消息到所述驱动设 备链;所述步骤B与所述步骤C之间还包括所述系统键盘驱动将接收到的所述硬件消息 加入队列;当系统收到用户按键输入数据时,系统调用所述系统键盘驱动,将所述用户 按键输入数据传给所述系统键盘驱动,所述系统键盘驱动从所述队列中获取所述硬件消 息,将所述用户按键输入数据填充到所述硬件消息中,系统遍历所述硬件消息对应的堆 栈找到设置了所述完成函数的堆栈单元,并调用该堆栈单元中的所述完成函数。所述系 统遍历所述硬件消息对应的堆栈找到设置了所述完成函数的堆栈单元,具体为系统调用 IoCompleteRequest查找到设置了所述完成函数的堆栈单元。

  [0023] 上述步骤B所述根据所述硬件消息找到所述键盘过滤驱动的设备对象对应的堆 栈单元,将找到的堆栈单元的信息拷贝到下一层驱动的设备对象对应的堆栈单元中,并在 所述下一层驱动的设备对象对应的堆栈单元中设置完成函数,具体为:

  [0024] 步骤bl :根据所述硬件消息中包含的指针参数获取所述硬件消息对应的堆栈和 键盘过滤驱动的设备对象对应的堆栈单元;

  [0025] 步骤b2 :调用IoCopyCurrentlrpStackLocationToNext将所述键盘过滤驱动的设 备对象对应的堆栈单元的信息拷贝到下一层驱动的设备对象对应的堆栈单元中;

  [0028] 上述步骤B所述发送所述硬件消息给所述系统键盘驱动的设备对象具体为:将所 述系统键盘驱动的设备对象指针和所述硬件消息作为传入参数,调用IoCallDriver将所 述硬件消息发送给所述系统键盘驱动的设备对象。

  [0029] 本发明的有益效果是:即便Windows的驱动架构中在键盘过滤驱动的下方有若干 恶意驱动进行拦截,使用本发明的技术,这些恶意驱动都将被跳过,使得恶意驱动无法参与 其中工作,从而保证键盘输入的安全操作。

  [0030] 图1是本发明实施例1提供的一种防止底层驱动拦截消息的方法的初始化阶段的 流程图;

  [0031] 图2是本发明实施例1提供的一种防止底层驱动拦截消息的方法的修改IRP对应 的堆栈阶段的流程图;

  [0032] 图3是本发明实施例1提供的一种防止底层驱动拦截消息的方法的处理IRP阶段 的流程图。

  [0033] 为使本发明的目的、技术方案和优点更加清楚,下面将结合附图和具体实施例对 本发明作进一步地详细描述。

  [0034] 本发明提供的实施例是基于Windows的驱动架构实现的,Windows的驱动架构是 分层处理的,系统键盘驱动为Windows系统自带,名称为预设驱动名,例如预设驱动名为 Kbdclass或i8042prt。在Windows的驱动架构中驱动设备链从上至下分层有键盘过滤驱 动、一个或多个其他底层驱动、系统键盘驱动。

  [0036] 本实施例1提供的一种防止底层驱动拦截消息的方法,主要包括三个阶段,分别 为:

  [0038] 系统加载键盘过滤驱动,所述键盘过滤驱动执行以下操作:查找到系统键盘驱动 的设备对象,创建键盘过滤驱动的设备对象,分配设备扩展内存来存储系统键盘驱动的设 备对象指针,将创建的键盘过滤驱动的设备对象与系统键盘驱动的设备对象进行链接并加 入驱动设备链中。

  [0039] 本发明实施例中提及的所述系统是指计算机操作系统,例如,Windows操作系统。

  [0041] 当系统收到按键触发时,系统创建IRP,发送IRP到驱动设备链,当驱动设备链中 的键盘过滤驱动接收到所述IRP时,执行以下操作:将IRP中的所述键盘过滤驱动的设备对 象对应的堆栈单元的信息拷贝到下一层驱动的设备对象对应的堆栈单元中,并在所述下一 层驱动对应的堆栈单元中设置完成函数,然后根据扩展内存中的系统键盘驱动的设备对象 指针找到系统键盘驱动的设备对象,发送IRP给系统键盘驱动的设备对象,所述系统键盘 驱动将接收到的IRP加入队列。

  [0043] 当系统收到用户按键输入数据时,系统调用所述系统键盘驱动将所述用户按键输 入数据传给所述系统键盘驱动,所述系统键盘驱动从所述队列中获取所述IRP,将所述用户 按键输入数据填充到所述IRP中,然后系统遍历所述IRP对应的堆栈找到设置了所述完成 函数的当前堆栈单元,并调用所述完成函数;当所述完成函数被调用时,所述键盘过滤驱动 执行以下操作:对所述IRP中的用户输入数据加密后将所述IRP返回给系统。

  [0044] 从上述过程可明显看出,其他底层驱动并未参与工作,从而达到跳过其他底层驱 动,将加密操作后的IRP直接返回给系统的目的。

  [0045] 本实施例提供一种防止底层驱动拦截消息的方法的初始化阶段的具体过程,如图 1所示,包括:

  [0047] 具体的,本发明提供的方法可适用于USB和PS2两种键盘,若是USB键盘,则本步 骤查找的是Kbdhid,若是PS2键盘,则本步骤查找的是i8042prt。

  [0049] 步骤102 :根据所述声明函数的返回值判断键盘驱动对象指针是否为空,是则返 回失败,结束,否则执行步骤103 ;

  [0050] 本实施例中优选的,判断返回值是否为NULL,是则表示键盘驱动对象指针为空,返 回失败,结束,否则返回值为键盘驱动对象指针,执行步骤103。

  [0051] 步骤103 :根据键盘驱动对象指针获取键盘驱动对象,解析键盘驱动对象,获取键 盘驱动对象的第一个设备对象指针作为当前设备对象指针;

  [0052] 本实施例中具体的,驱动对象、设备对象的形态都是以结构体的方式存储在系统 内存中的,例如,本步骤获取的是Kbdhid驱动对象,其结构体如下:

  1. 一种防止底层驱动拦截消息的方法,其特征是: 步骤A :当键盘过滤驱动被系统加载时,所述键盘过滤驱动执行:查找到系统键盘驱动 的设备对象,创建键盘过滤驱动的设备对象,分配设备扩展内存来存储系统键盘驱动的设 备对象指针,将创建的所述键盘过滤驱动的设备对象与所述系统键盘驱动的设备对象进行 链接并加入驱动设备链中; 步骤B :当所述驱动设备链中的所述键盘过滤驱动收到硬件消息时,所述键盘过滤驱 动执行:根据所述硬件消息找到所述键盘过滤驱动的设备对象对应的堆栈单元,将找到的 堆栈单元的信息拷贝到下一层驱动的设备对象对应的堆栈单元中,并在所述下一层驱动的 设备对象对应的堆栈单元中设置完成函数,然后根据所述设备扩展内存中的所述系统键盘 驱动的设备对象指针找到系统键盘驱动的设备对象,发送所述硬件消息给所述系统键盘驱 动的设备对象; 步骤C :当所述完成函数被调用时,所述键盘过滤驱动执行:对所述硬件消息中的数据 进行加密,然后将硬件消息返回给系统。

  2. 根据权利要求1所述的方法,其特征是:所述查找到系统键盘驱动的设备对象的具 体过程为: 步骤al :调用声明函数查找键盘驱动对象; 步骤a2 :根据所述声明函数返回的键盘驱动对象指针获取键盘驱动对象,解析所述键 盘驱动对象,获取键盘驱动对象的第一个设备对象指针作为当前设备对象指针; 步骤a3 :判断当前设备对象指针是否为空,是则结束,否则执行步骤a4 ; 步骤a4 :根据当前设备对象指针获取当前设备对象; 步骤a5 :从当前设备对象中获取上层设备对象指针; 步骤a6 :判断上层设备对象指针是否为空,是则执行步骤a7,否则执行步骤a8 ; 步骤a7 :解析所述键盘驱动对象,获取键盘驱动对象的下一个设备对象指针作为当前 设备对象指针,返回执行步骤a3, 步骤a8 :根据上层设备对象指针获取上层设备对象,并将上层设备对象作为当前设备 对象,解析当前设备对象对应的驱动对象,获取驱动名称; 步骤a9 :判断获取到的驱动名称是否为预设驱动名,是则执行步骤alO,否则返回执行 步骤a5 ; 步骤alO :将当前设备对象记录为系统键盘驱动的设备对象。

  3. 根据权利要求2所述的方法,其特征是:所述步骤alO之后还包括:判断所述系统键 盘驱动的设备对象指针是否为空,是则返回执行步骤a7,否则执行步骤A中所述创建键盘 过滤驱动的设备对象,分配设备扩展内存来存储系统键盘驱动的设备对象指针。

  4. 根据权利要求1所述的方法,其特征是:所述将创建的所述键盘过滤驱动的设 备对象与所述系统键盘驱动的设备对象进行链接并加入驱动设备链中,具体为:调用 IoAttachDeviceToDeviceStack将创建好的所述键盘过滤驱动的设备对象与所述系统键盘 驱动的设备对象进行链接,然后将创建好的所述键盘过滤驱动的设备对象加入驱动设备链 中。

  5. 根据权利要求1所述的方法,其特征是:所述步骤B之前还包括:系统创建硬件消 息,发送所述硬件消息到所述驱动设备链; 所述步骤B与所述步骤C之间还包括所述系统键盘驱动将接收到的所述硬件消息加入 队列;当系统收到用户按键输入数据时,系统调用所述系统键盘驱动,将所述用户按键输入 数据传给所述系统键盘驱动,所述系统键盘驱动从所述队列中获取所述硬件消息,将所述 用户按键输入数据填充到所述硬件消息中,系统遍历所述硬件消息对应的堆栈找到设置了 所述完成函数的堆栈单元,并调用该堆栈单元中的所述完成函数。

  6. 根据权利要求1所述的方法,其特征是:所述根据所述硬件消息找到所述键盘过滤 驱动的设备对象对应的堆栈单元,将找到的堆栈单元的信息拷贝到下一层驱动的设备对象 对应的堆栈单元中,并在所述下一层驱动的设备对象对应的堆栈单元中设置完成函数,具 体为: 步骤bl :根据所述硬件消息中包含的指针参数获取所述硬件消息对应的堆栈和键盘 过滤驱动的设备对象对应的堆栈单元; 步骤b2 :调用IoCopyCurrentlrpStackLocationToNext将所述键盘过滤驱动的设备对 象对应的堆栈单元的信息拷贝到下一层驱动的设备对象对应的堆栈单元中; 步骤b3 :调用IoSetCompletionRoutine在所述下一层驱动的设备对象对应的堆栈单 元中设置完成函数。

  7. 根据权利要求6所述的方法,其特征是:所述堆栈单元的信息包括用于读取所述硬 件消息的参数。

  8. 根据权利要求1所述的方法,其特征是:所述发送所述硬件消息给所述系统键盘驱 动的设备对象具体为:将所述系统键盘驱动的设备对象指针和所述硬件消息作为传入参 数,调用IoCallDriver将所述硬件消息发送给所述系统键盘驱动的设备对象。

  9. 根据权利要求5所述的方法,其特征是:所述系统遍历所述硬件消息对应的堆栈找 到设置了所述完成函数的堆栈单元,具体为系统调用IoCompleteRequest查找到设置了所 述完成函数的堆栈单元。

  10. 根据权利要求5所述的方法,其特征是:所述分配设备扩展内存来存储系统键盘驱 动的设备对象指针之后还包括系统将系统键盘驱动的设备对象引用计数加1,所述系统创 建硬件消息之前还包括判断系统键盘驱动的设备对象引用计数是否大于1,是则创建所述 硬件消息,否则结束。

  11. 根据权利要求10所述的方法,其特征是:所述将系统键盘驱动的设备对象引用计 数加1具体为通过调用ObReferenceObjectByPointer实现。

http://howlertech.com/fencengshishilanjie/45.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有