一种基于设备驱动派遣函数hook的安全测试方法转让专利

申请号 : CN202111512038.3

文献号 : CN114386044B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 黄钟陈肖李恺巫忠跃朱楚为张洋

申请人 : 中国电子科技集团公司第三十研究所

摘要 :

本发明提供一种基于设备驱动派遣函数hook的安全测试方法,包括:在内核模块中枚举所有通用接口设备的设备名、设备对象以及驱动对象;客户端模块枚举所有通用接口设备的设备名列表,选择一个待测设备名发送给内核模块;内核模块检索对应的设备以及驱动对象,对驱动对象进行hook;客户端模块向内核模块发送测试指令;内核模块收到测试指令后,待主机与设备通信后,拦截主机与设备之间的IRP;hook函数根据测试指令构造不同的测试数据,执行旁路通信数据、数据篡改测试、重放攻击测试或模糊测试;内核模块每次捕获并处理通信数据后,客户端模块相应的读取测试数据。本发明实现了针对Windows操作系统下通用接口设备的安全测试方法。

权利要求 :

1.一种基于设备驱动派遣函数hook的安全测试方法,其特征在于,包括如下步骤:S1、在内核模块中枚举当前主机所有通用接口设备的设备名、设备对象以及驱动对象,保存设备名与设备对象的关系列表,初始化_event事件和_semaphore信号量,初始化一个数据链表用于保存数据;

S2、在客户端模块中枚举当前主机上所有通用接口设备的设备名列表,在设备名列表中选择一个待测设备名,发送给内核模块;

S3、内核模块根据待测设备名检索对应的设备对象以及驱动对象,然后对驱动对象进行hook,替换驱动对象所有的派遣函数为自定义的hook函数;

S4、客户端模块从数据旁路测试、数据篡改测试、重放攻击测试和模糊测试中选择一种测试方法,向内核模块发送该次测试的测试指令和测试数据,初始化一个读线程,准备从内核模块中读取测试数据;

S5、内核模块收到测试指令后,使客户端模块读线程进入等待状态,等待主机与通用接口设备之间的通信,准备旁路通信数据;

S6、主机与通用接口设备开始通信之后,产生了一个IRP,即I/O请求数据包,hook函数从IRP中旁路通信数据,将通信数据保存在一个数据节点中,并设置该IRP的完成例程;

S7、hook函数根据客户端模块发送的测试指令及原始数据,构造不同的测试数据,执行后续的数据篡改测试、重放攻击测试或模糊测试;

S8、内核模块每捕获并处理一次主机与通用接口设备的通信数据都会将数据节点插入到数据链表中,通过改变_semaphore信号量状态使客户端模块读线程转入工作状态,在数据链表中读取该次测试的通信数据;

S9、客户端模块向内核模块发送测试停止指令,内核模块接收到测试停止指令后即重置_event事件和_semaphore信号量,并根据I/O请求数据包的状态取消或完成当前I/O请求数据包,清空数据链表,停止测试功能。

2.根据权利要求1所述的基于设备驱动派遣函数hook的安全测试方法,其特征在于,步骤S3中对驱动对象进行hook的处理过程包括:S3‑1、内核模块枚举该驱动对象下的所有设备对象;

S3‑2、保存当前被测设备的设备对象和驱动对象的信息记录;

S3‑3、循环调用InterlockedExchangePointer函数,将驱动对象中的派遣函数全部替换为自定义的hook函数,并保存原有的派遣函数和驱动对象。

3.根据权利要求1所述的基于设备驱动派遣函数hook的安全测试方法,其特征在于,步骤S6中旁路通信数据的执行流程如下:S6‑1、调用IoGetCurrentIrpStackLocation函数获取IRP的栈单元地址;

S6‑2、根据IRP的数据缓冲区状态从中读取主机与通用接口设备之间的通信数据:若Irp‑>MdlAddress字段不为空,则执行步骤S6‑3;

若Irp‑>AssociatedIrp.SystemBuffer字段不为空,则执行步骤S6‑4;

若Irp‑>UserBuffer字段不为空,则执行步骤S6‑5;

S6‑3、调用MnGetSystemAddressForMdlSafe函数得到被Mdl所描述的物理地址的内核虚拟地址,从该内核虚拟地址中获取交互数据;

S6‑4、从Irp‑>AssociatedIrp.SystemBuffer地址中获取交互数据;

S6‑5、从Irp‑>UserBuffer地址中获取交互数据;

S6‑6、从IRP中获取当前的包括主功能码、次功能码和请求状态在内的字段数据;将获取的通信数据保存在一个数据节点中;

S6‑7、调用IoSkipCurrentIrpStackLocation函数把当前IRP的栈单元地址设置为上一层的IRP栈;

S6‑8、调用IoSetCompletionRoutine函数设置IRP的完成例程,从而在IRP完成时执行步骤S6‑1至S6‑6,获取返回的通信数据;

S6‑9、调用IoSetNextIrpStackLocation函数把当前的IRP栈单元地址设置为下一层的IRP栈。

4.根据权利要求1所述的基于设备驱动派遣函数hook的安全测试方法,其特征在于,步骤S7中数据篡改测试的执行流程如下:S7‑1‑1、执行旁路通信数据中的步骤S6‑1至S6‑9,改变_semaphore信号量使得客户端模块获得主机与设备之间的通信数据;

S7‑1‑2、初始化_filterEvent事件,调用KeWaitForSingleObject函数等待事件进入激活态,阻塞主机与设备之间的通信;

S7‑1‑3、客户端模块对旁路数据进行篡改,将篡改后的数据发送给内核模块,内核模块接收到篡改数据后,若Irp‑>MdlAddress字段不为空,则执行S7‑1‑4;若Irp‑>AssociatedIrp.SystemBuffer字段不为空,则执行S7‑1‑5;

S7‑1‑4、调用MnGetSystemAddressForMdlSafe函数,得到被Mdl所描述的物理地址的内核虚拟地址,向该内核虚拟地址中写入篡改数据;

S7‑1‑5、向Irp‑>AssociatedIrp.SystemBuffer地址中写入篡改数据;

S7‑1‑6、将_filterEvent事件设置为激活态,恢复当前工作进程的工作状态,调用步骤S3‑3保存的驱动对象原有的派遣函数,发送篡改后的IRP。

5.根据权利要求1所述的基于设备驱动派遣函数hook的安全测试方法,其特征在于,步骤S7中重放攻击测试的执行流程如下:S7‑2‑1、执行步骤S7‑1‑1至S7‑1‑2的数据旁路和阻塞流程,客户端模块获得待重放的数据后,设置重放次数和重放时间间隔,将参数发送给内核模块;

S7‑2‑2:内核模块根据IRP主功能码创建IRP,若主功能码为IRP_MJ_READ或IRP_MJ_WRITE,执行S7‑2‑3;若主功能码为IRP_MJ_INTERNAL_DEVICE_CONTROL,执行S7‑2‑4;

S7‑2‑3、调用IoBuildsynchronousFsdRequest创建一个同步IRP,该IRP数据缓冲区的数据设置为待重放的数据;

S7‑2‑4、调用IoBuildDeviceIoControlRequest创建一个同步IRP,该IRP数据缓冲区的数据设置为待重放的数据;

S7‑2‑5、调用IoSetCompletionRoutine注册一个IRP的完成例程;

S7‑2‑6、调用IoGetNextIrpStackLocation获取下一层驱动的IRP栈;

S7‑2‑7、调用IoCallDriver将IRP发送给指定的通用接口设备;

S7‑2‑8、调用KeQueryTickCount函数计算当前运行时间,使工作进程等待设置的重放时间间隔;

S7‑2‑9、根据设置的重放次数重复执行步骤S7‑2‑2至S7‑2‑8。

6.根据权利要求1所述的基于设备驱动派遣函数hook的安全测试方法,其特征在于,步骤S7中模糊测试的执行流程如下:S7‑3‑1、根据打上标签的测试数据,内核模块按照规则依次生成大量的模糊测试数据;

S7‑3‑2、对模糊测试数据,调用IoBuildAsynchronousFsdRequest函数创建一个异步IRP,该IRP的数据缓冲区的数据设置为待测试数据;

S7‑3‑3、调用IoSetCompletionRoutine注册一个IRP的完成例程;

S7‑3‑4、调用IoGetNextIrpStackLocation获取下一层驱动的IRP栈;

S7‑3‑5、调用IoCallDriver将IRP发送指定通用接口设备;

S7‑3‑6、对生成的每一个模糊测试数据,重复执行步骤S7‑3‑2至S7‑3‑5。

说明书 :

一种基于设备驱动派遣函数hook的安全测试方法

技术领域

[0001] 本发明涉及安全测试技术领域,具体而言,涉及一种基于设备驱动派遣函数hook的安全测试方法。

背景技术

[0002] 随着信息化技术的发展,在Windows操作系统上,基于USB、PCI‑E等计算机通用接口的硬件设备呈现多样化的发展态势,其应用场景包括了数据安全存储、数据加解密、身份认证等。这类设备在Windows操作系统中开始工作后,其设备接口、服务端口以及通信过程都暴露在计算机环境之中,如果主机受到攻击,相应的设备信息和通信信息可能会被窃取或控制,使得设备面临着信息泄漏、数据篡改、非授权控制等多种安全威胁。针对Windows操作系统下通用接口设备存在的安全风险,需要采用有效的安全测试方法予以验证,从而为设备的安全评估提供技术指导和评价方法。
[0003] 然而,现有的安全测试方法中,针对Windows操作系统下通用接口设备的测试软件通常采用挂载过滤驱动的方法,存在着功能单一、缺乏主动探测能力、测试深度不足等问题。如USBtrace软件可以捕获Windows主机与USB设备之间的通讯数据,但无法对设备进行主动性的测试,测试对象也局限于USB接口的设备;BusHound软件可以旁路主机与设备之间的通信数据、发送简单的总线命令,但是无法模拟设备交互流程,缺乏端口探测、重放攻击、模糊测试等多层次的测试手段,无法实现对主机与设备之间完整数据流程的覆盖。

发明内容

[0004] 本发明旨在针对现有的安全测试方法的不足,提供一种基于设备驱动派遣函数hook的安全测试方法,以实现对Windows操作系统下通用接口设备的数据旁路测试、数据篡改测试、重放攻击测试以及模糊测试等安全检测。
[0005] 本发明提供的一种基于设备驱动派遣函数hook的安全测试方法,包括如下步骤:
[0006] S1、在内核模块中枚举当前主机所有通用接口设备的设备名、设备对象以及驱动对象,保存设备名与设备对象的关系列表,初始化_event事件和_semaphore信号量,初始化一个数据链表用于保存数据;
[0007] S2、在客户端模块中枚举当前主机上所有通用接口设备的设备名列表,在设备名列表中选择一个待测设备名,发送给内核模块;
[0008] S3、内核模块根据待测设备名检索对应的设备对象以及驱动对象,然后对驱动对象进行hook,替换驱动对象所有的派遣函数为自定义的hook函数;
[0009] S4、客户端模块从数据旁路测试、数据篡改测试、重放攻击测试和模糊测试中选择一种测试方法,向内核模块发送该次测试的测试指令和测试数据,初始化一个读线程,准备从内核模块中读取测试数据;
[0010] S5、内核模块收到测试指令后,使客户端模块读线程进入等待状态,等待主机与通用接口设备之间的通信,准备旁路通信数据;
[0011] S6、主机与通用接口设备开始通信之后,产生了一个IRP,即I/O请求数据包,hook函数从IRP中旁路通信数据,将通信数据保存在一个数据节点中,并设置该IRP的完成例程;
[0012] S7、hook函数根据客户端模块发送的测试指令及原始数据,构造不同的测试数据,执行后续的数据篡改测试、重放攻击测试或模糊测试;
[0013] S8、内核模块每捕获并处理一次主机与通用接口设备的通信数据都会将数据节点插入到数据链表中,通过改变_semaphore信号量状态使客户端模块读线程转入工作状态,在数据链表中读取该次测试的通信数据;
[0014] S9、客户端模块向内核模块发送测试停止指令,内核模块接收到测试停止指令后即重置_event事件和_semaphore信号量,并根据I/O请求数据包的状态取消或完成当前I/O请求数据包,清空数据链表,停止测试功能。
[0015] 在一些优选方案中,步骤S3中对驱动对象进行hook的处理过程包括:
[0016] S3‑1、内核模块枚举该驱动对象下的所有设备对象;
[0017] S3‑2、保存当前被测设备的设备对象和驱动对象的信息记录;
[0018] S3‑3、循环调用InterlockedExchangePointer函数,将驱动对象中的派遣函数全部替换为自定义的hook函数,并保存原有的派遣函数和驱动对象。
[0019] 在一些优选方案中,步骤S6中旁路通信数据的执行流程如下:
[0020] S6‑1、调用IoGetCurrentIrpStackLocation函数获取IRP的栈单元地址;
[0021] S6‑2、根据IRP的数据缓冲区状态从中读取主机与通用接口设备之间的通信数据:
[0022] 若Irp‑>MdlAddress字段不为空,则执行步骤S6‑3;
[0023] 若Irp‑>AssociatedIrp.SystemBuffer字段不为空,则执行步骤S6‑4;
[0024] 若Irp‑>UserBuffer字段不为空,则执行步骤S6‑5;
[0025] S6‑3、调用MnGetSystemAddressForMdlSafe函数得到被Mdl所描述的物理地址的内核虚拟地址,从该内核虚拟地址中获取交互数据;
[0026] S6‑4、从Irp‑>AssociatedIrp.SystemBuffer地址中获取交互数据;
[0027] S6‑5、从Irp‑>UserBuffer地址中获取交互数据;
[0028] S6‑6、从IRP中获取当前的包括主功能码、次功能码和请求状态在内的通信数据;将获取的通信数据保存在一个数据节点中;
[0029] S6‑7、调用IoSkipCurrentIrpStackLocation函数把当前IRP的栈单元地址设置为上一层的IRP栈;
[0030] S6‑8、调用IoSetCompletionRoutine函数设置IRP的完成例程,从而在IRP完成时执行步骤S6‑1至S6‑6,获取返回的通信数据;
[0031] S6‑9、调用IoSetNextIrpStackLocation函数把当前的IRP栈单元地址设置为下一层的IRP栈。
[0032] 在一些优选方案中,步骤S7中数据篡改测试的执行流程如下:
[0033] S7‑1‑1、执行旁路通信数据中的步骤S6‑1至S6‑9,改变_semaphore信号量使得客户端模块获得主机与设备之间的通信数据;
[0034] S7‑1‑2、初始化_filterEvent事件,调用KeWaitForSingleObject函数等待事件进入激活态,阻塞主机与设备之间的通信;
[0035] S7‑1‑3、客户端对旁路数据进行篡改,将篡改后的数据发送给内核模块,内核模块接收到篡改数据后,若Irp‑>MdlAddress字段不为空,则执行S7‑1‑4;若Irp‑>AssociatedIrp.SystemBuffer字段不为空,则执行S7‑1‑5;
[0036] S7‑1‑4、调用MnGetSystemAddressForMdlSafe函数,得到被Mdl所描述的物理地址的内核虚拟地址,向该内核虚拟地址中写入篡改数据;
[0037] S7‑1‑5、向Irp‑>AssociatedIrp.SystemBuffer地址中写入篡改数据;
[0038] S7‑1‑6、将_filterEvent事件设置为激活态,恢复当前工作进程的工作状态,调用步骤S3‑3保存的驱动对象原有的派遣函数,发送篡改后的IRP。
[0039] 在一些优选方案中,步骤S7中重放攻击测试的执行流程如下:
[0040] S7‑2‑1、执行步骤S7‑1‑1至S7‑1‑2的数据旁路和阻塞流程,客户端模块获得待重放的数据后,设置重放次数和重放时间间隔,将参数发送给内核模块;
[0041] S7‑2‑2、内核模块根据IRP主功能码创建IRP,若主功能码为IRP_MJ_READ或IRP_MJ_WRITE,执行S7‑2‑3;若主功能码为IRP_MJ_INTERNAL_DEVICE_CONTROL,执行S7‑2‑4;
[0042] S7‑2‑3、调用IoBuildsynchronousFsdRequest创建一个同步IRP,该IRP数据缓冲区的数据设置为待重放的数据;
[0043] S7‑2‑4、调用IoBuildDeviceIoControlRequest创建一个同步IRP,该IRP数据缓冲区的数据设置为待重放的数据;
[0044] S7‑2‑5、调用IoSetCompletionRoutine注册一个IRP的完成例程;
[0045] S7‑2‑6、调用IoGetNextIrpStackLocation获取下一层驱动的IRP栈;
[0046] S7‑2‑7、调用IoCallDriver将IRP发送给指定通用接口设备;
[0047] S7‑2‑8、调用KeQueryTickCount函数计算当前运行时间,使工作进程等待设置的重放时间间隔;
[0048] S7‑2‑9、根据设置的重放次数重复执行步骤S7‑2‑2至S7‑2‑8。
[0049] 在一些优选方案中,步骤S7中模糊测试的执行流程如下:
[0050] S7‑3‑1、根据打上标签的测试数据,内核模块按照规则依次生成大量的模糊测试数据;
[0051] S7‑3‑2、对模糊测试数据,调用IoBuildAsynchronousFsdRequest函数创建一个异步IRP,该IRP的数据缓冲区的数据设置为待测试数据;
[0052] S7‑3‑3、调用IoSetCompletionRoutine注册一个IRP的完成例程;
[0053] S7‑3‑4、调用IoGetNextIrpStackLocation获取下一层驱动的IRP栈;
[0054] S7‑3‑5、调用IoCallDriver将IRP发送给指定的通用接口设备;
[0055] S7‑3‑6、对生成的每一个模糊测试数据,重复执行步骤S7‑3‑2至S7‑3‑5。
[0056] 综上所述,由于采用了上述技术方案,本发明的有益效果是:
[0057] 1、本发明能够实现对Windows操作系统下通用接口设备的数据旁路测试、数据篡改测试、重放攻击测试以及模糊测试等安全检测,对通用接口设备的安全状态实现了全面的评估。
[0058] 2、本发明具备主动探测能力,能够对被测通用接口设备实施数据篡改测试、重放攻击测试以及模糊测试等主动安全测试手法,能够有效探测设备存在的隐藏端口及安全风险。
[0059] 3、本发明具备深度测试能力,能够对主机与设备完整通信流程中的某个节点进行测试,测试流程与通用接口设备的实际运行情况紧密结合。

附图说明

[0060] 为了更清楚地说明本发明实施例的技术方案,下面将对实施例中的附图作简单地介绍,应当理解,以下附图仅示出了本发明的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。
[0061] 图1为本发明实施例的基于设备驱动派遣函数hook的安全测试方法的总体流程图。
[0062] 图2为本发明实施例的基于设备驱动派遣函数hook的安全测试方法中对驱动对象进行hook的流程图。
[0063] 图3为本发明实施例的基于设备驱动派遣函数hook的安全测试方法中数据旁路测试的流程图。
[0064] 图4为本发明实施例的基于设备驱动派遣函数hook的安全测试方法中数据篡改测试的流程图。
[0065] 图5为本发明实施例的基于设备驱动派遣函数hook的安全测试方法中重放攻击测试的流程图。
[0066] 图6为本发明实施例的基于设备驱动派遣函数hook的安全测试方法中模糊测试的流程图。

具体实施方式

[0067] 为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本发明实施例的组件可以以各种不同的配置来布置和设计。
[0068] 因此,以下对在附图中提供的本发明的实施例的详细描述并非旨在限制要求保护的本发明的范围,而是仅仅表示本发明的选定实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0069] 实施例:
[0070] 如图1所示,本实施例提出一种基于设备驱动派遣函数hook的安全测试方法,包括如下步骤:
[0071] S1、在内核模块中枚举当前主机所有通用接口设备的设备名、设备对象以及驱动对象,保存设备名与设备对象的关系列表,初始化_event事件和_semaphore信号量,初始化一个数据链表用于保存数据;
[0072] S2、在客户端模块中枚举当前主机上所有通用接口设备的设备名列表,在设备名列表中选择一个待测设备名,发送给内核模块;
[0073] S3、内核模块根据待测设备名检索对应的设备对象以及驱动对象,然后对驱动对象进行hook,替换驱动对象所有的派遣函数为自定义的hook函数;
[0074] 如图2所示,对驱动对象进行hook的处理过程包括:
[0075] S3‑1、内核模块枚举该驱动对象下的所有设备对象;
[0076] S3‑2、保存当前被测设备的设备对象和驱动对象的信息记录;
[0077] S3‑3、循环调用InterlockedExchangePointer函数,将驱动对象中的派遣函数全部替换为自定义的hook函数,并保存原有的派遣函数和驱动对象。
[0078] S4、客户端模块从数据旁路测试、数据篡改测试、重放攻击测试和模糊测试中选择一种测试方法,向内核模块发送该次测试的测试指令和测试数据,初始化一个读线程,准备从内核模块中读取测试数据;
[0079] S5、内核模块收到测试指令后,使客户端模块读线程进入等待状态,等待主机与通用接口设备之间的通信,准备旁路通信数据;
[0080] S6、主机与通用接口设备开始通信之后,产生了一个IRP,即I/O请求数据包,hook函数从IRP中旁路通信数据,将通信数据保存在一个数据节点中,并设置该IRP的完成例程;
[0081] 如图3所示,步骤S6执行旁路通信数据的具体流程如下:
[0082] S6‑1、调用IoGetCurrentIrpStackLocation函数获取IRP的栈单元地址;
[0083] S6‑2、根据IRP的数据缓冲区状态从中读取主机与通用接口设备之间的通信数据:
[0084] 若Irp‑>MdlAddress字段不为空,则执行步骤S6‑3;
[0085] 若Irp‑>AssociatedIrp.SystemBuffer字段不为空,则执行步骤S6‑4;
[0086] 若Irp‑>UserBuffer字段不为空,则执行步骤S6‑5;
[0087] S6‑3、调用MnGetSystemAddressForMdlSafe函数得到被Mdl所描述的物理地址的内核虚拟地址,从该内核虚拟地址中获取交互数据;
[0088] S6‑4、从Irp‑>AssociatedIrp.SystemBuffer地址中获取交互数据;
[0089] S6‑5、从Irp‑>UserBuffer地址中获取交互数据;
[0090] S6‑6、从IRP中获取当前的包括主功能码、次功能码和请求状态在内的字段数据;将获取的通信数据保存在一个数据节点中;
[0091] S6‑7、调用IoSkipCurrentIrpStackLocation函数把当前IRP的栈单元地址设置为上一层的IRP栈;
[0092] S6‑8、调用IoSetCompletionRoutine函数设置IRP的完成例程(IoCompletion例程),从而在IRP完成时执行步骤S6‑1至S6‑6,获取返回的通信数据;
[0093] S6‑9、调用IoSetNextIrpStackLocation函数把当前的IRP栈单元地址设置为下一层的IRP栈。
[0094] S7、hook函数根据客户端模块发送下来的测试指令及原始数据,构造不同的测试数据,执行后续的数据篡改测试、重放攻击测试或模糊测试;其中的数据篡改测试、重放攻击测试或模糊测试的执行流程具体如下:
[0095] (1)数据篡改测试,如图4所示:
[0096] S7‑1‑1、执行旁路通信数据中的步骤S6‑1至S6‑9,改变_semaphore信号量使得客户端模块获得主机与设备之间的通信数据;
[0097] S7‑1‑2、初始化_filterEvent事件,调用KeWaitForSingleObject函数等待事件进入激活态,阻塞主机与设备之间的通信;
[0098] S7‑1‑3、客户端模块对旁路数据进行篡改,将篡改后的数据发送给内核模块,内核模块接收到篡改数据后,若Irp‑>MdlAddress字段不为空,则执行S7‑1‑4;若Irp‑>AssociatedIrp.SystemBuffer字段不为空,则执行S7‑1‑5;
[0099] S7‑1‑4、调用MnGetSystemAddressForMdlSafe函数,得到被Mdl所描述的物理地址的内核虚拟地址,向该内核虚拟地址中写入篡改数据;
[0100] S7‑1‑5、向Irp‑>AssociatedIrp.SystemBuffer地址中写入篡改数据;
[0101] S7‑1‑6、将_filterEvent事件设置为激活态,恢复当前工作进程的工作状态,调用步骤S3‑3保存的驱动对象原有的派遣函数,发送篡改后的IRP。
[0102] (2)重放攻击测试,如图5所示:
[0103] S7‑2‑1、执行步骤S7‑1‑1至S7‑1‑2的数据旁路和阻塞流程,客户端模块获得待重放的数据后,设置重放次数和重放时间间隔,将参数发送给内核模块;
[0104] S7‑2‑2、内核模块根据IRP主功能码创建IRP,若主功能码为IRP_MJ_READ或IRP_MJ_WRITE,执行S7‑2‑3;若主功能码为IRP_MJ_INTERNAL_DEVICE_CONTROL,执行S7‑2‑4;
[0105] S7‑2‑3、调用IoBuildsynchronousFsdRequest创建一个同步IRP,该IRP数据缓冲区的数据设置为待重放的数据;
[0106] S7‑2‑4、调用IoBuildDeviceIoControlRequest创建一个同步IRP,该IRP数据缓冲区的数据设置为待重放的数据;
[0107] S7‑2‑5、调用IoSetCompletionRoutine注册一个IRP的完成例程;
[0108] S7‑2‑6、调用IoGetNextIrpStackLocation获取下一层驱动的IRP栈;
[0109] S7‑2‑7、调用IoCallDriver将IRP发送给指定通用接口设备;
[0110] S7‑2‑8、调用KeQueryTickCount函数计算当前运行时间,使工作进程等待设置的重放时间间隔;
[0111] S7‑2‑9、根据设置的重放次数重复执行步骤S7‑2‑2至S7‑2‑8。
[0112] (3)模糊测试,如图6所示:
[0113] S7‑3‑1、根据打上标签的测试数据,内核模块按照规则依次生成大量的模糊测试数据;
[0114] S7‑3‑2、对模糊测试数据,调用IoBuildAsynchronousFsdRequest函数创建一个异步IRP,该IRP的数据缓冲区的数据设置为待测试数据;
[0115] S7‑3‑3、调用IoSetCompletionRoutine注册一个IRP的完成例程;
[0116] S7‑3‑4、调用IoGetNextIrpStackLocation获取下一层驱动的IRP栈;
[0117] S7‑3‑5、调用IoCallDriver将IRP发送给指定的通用接口设备;
[0118] S7‑3‑6、对生成的每一个模糊测试数据,重复执行步骤S7‑3‑2至S7‑3‑5。
[0119] S8、内核模块每捕获并处理一次主机与通用接口设备的通信数据都会将数据节点插入到数据链表中,通过改变_semaphore信号量状态使客户端模块读线程转入工作状态,在数据链表中读取该次测试的通信数据;
[0120] S9、客户端模块向内核模块发送测试停止指令,内核模块接收到测试停止指令后即重置_event事件和_semaphore信号量,根据I/O请求数据包的状态取消或完成当前I/O请求数据包,清空数据链表,停止测试功能。
[0121] 以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。