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

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

Info

Publication number
CN114386044A
CN114386044A CN202111512038.3A CN202111512038A CN114386044A CN 114386044 A CN114386044 A CN 114386044A CN 202111512038 A CN202111512038 A CN 202111512038A CN 114386044 A CN114386044 A CN 114386044A
Authority
CN
China
Prior art keywords
data
irp
test
function
calling
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
CN202111512038.3A
Other languages
English (en)
Other versions
CN114386044B (zh
Inventor
黄钟
陈肖
李恺
巫忠跃
朱楚为
张洋
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
CETC 30 Research Institute
Original Assignee
CETC 30 Research Institute
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by CETC 30 Research Institute filed Critical CETC 30 Research Institute
Priority to CN202111512038.3A priority Critical patent/CN114386044B/zh
Publication of CN114386044A publication Critical patent/CN114386044A/zh
Application granted granted Critical
Publication of CN114386044B publication Critical patent/CN114386044B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/50Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
    • G06F21/57Certifying or maintaining trusted computer platforms, e.g. secure boots or power-downs, version controls, system software checks, secure updates or assessing vulnerabilities
    • G06F21/577Assessing vulnerabilities and evaluating computer system security

Landscapes

  • Engineering & Computer Science (AREA)
  • Computer Hardware Design (AREA)
  • Computer Security & Cryptography (AREA)
  • General Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Computing Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Computer And Data Communications (AREA)

Abstract

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

Description

一种基于设备驱动派遣函数hook的安全测试方法
技术领域
本发明涉及安全测试技术领域,具体而言,涉及一种基于设备驱动派遣函数hook的安全测试方法。
背景技术
随着信息化技术的发展,在Windows操作系统上,基于USB、PCI-E等计算机通用接口的硬件设备呈现多样化的发展态势,其应用场景包括了数据安全存储、数据加解密、身份认证等。这类设备在Windows操作系统中开始工作后,其设备接口、服务端口以及通信过程都暴露在计算机环境之中,如果主机受到攻击,相应的设备信息和通信信息可能会被窃取或控制,使得设备面临着信息泄漏、数据篡改、非授权控制等多种安全威胁。针对Windows操作系统下通用接口设备存在的安全风险,需要采用有效的安全测试方法予以验证,从而为设备的安全评估提供技术指导和评价方法。
然而,现有的安全测试方法中,针对Windows操作系统下通用接口设备的测试软件通常采用挂载过滤驱动的方法,存在着功能单一、缺乏主动探测能力、测试深度不足等问题。如USBtrace软件可以捕获Windows主机与USB设备之间的通讯数据,但无法对设备进行主动性的测试,测试对象也局限于USB接口的设备;BusHound软件可以旁路主机与设备之间的通信数据、发送简单的总线命令,但是无法模拟设备交互流程,缺乏端口探测、重放攻击、模糊测试等多层次的测试手段,无法实现对主机与设备之间完整数据流程的覆盖。
发明内容
本发明旨在针对现有的安全测试方法的不足,提供一种基于设备驱动派遣函数hook的安全测试方法,以实现对Windows操作系统下通用接口设备的数据旁路测试、数据篡改测试、重放攻击测试以及模糊测试等安全检测。
本发明提供的一种基于设备驱动派遣函数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请求数据包,清空数据链表,停止测试功能。
在一些优选方案中,步骤S3中对驱动对象进行hook的处理过程包括:
S3-1、内核模块枚举该驱动对象下的所有设备对象;
S3-2、保存当前被测设备的设备对象和驱动对象的信息记录;
S3-3、循环调用InterlockedExchangePointer函数,将驱动对象中的派遣函数全部替换为自定义的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栈。
在一些优选方案中,步骤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。
在一些优选方案中,步骤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。
在一些优选方案中,步骤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。
综上所述,由于采用了上述技术方案,本发明的有益效果是:
1、本发明能够实现对Windows操作系统下通用接口设备的数据旁路测试、数据篡改测试、重放攻击测试以及模糊测试等安全检测,对通用接口设备的安全状态实现了全面的评估。
2、本发明具备主动探测能力,能够对被测通用接口设备实施数据篡改测试、重放攻击测试以及模糊测试等主动安全测试手法,能够有效探测设备存在的隐藏端口及安全风险。
3、本发明具备深度测试能力,能够对主机与设备完整通信流程中的某个节点进行测试,测试流程与通用接口设备的实际运行情况紧密结合。
附图说明
为了更清楚地说明本发明实施例的技术方案,下面将对实施例中的附图作简单地介绍,应当理解,以下附图仅示出了本发明的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。
图1为本发明实施例的基于设备驱动派遣函数hook的安全测试方法的总体流程图。
图2为本发明实施例的基于设备驱动派遣函数hook的安全测试方法中对驱动对象进行hook的流程图。
图3为本发明实施例的基于设备驱动派遣函数hook的安全测试方法中数据旁路测试的流程图。
图4为本发明实施例的基于设备驱动派遣函数hook的安全测试方法中数据篡改测试的流程图。
图5为本发明实施例的基于设备驱动派遣函数hook的安全测试方法中重放攻击测试的流程图。
图6为本发明实施例的基于设备驱动派遣函数hook的安全测试方法中模糊测试的流程图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本发明实施例的组件可以以各种不同的配置来布置和设计。
因此,以下对在附图中提供的本发明的实施例的详细描述并非旨在限制要求保护的本发明的范围,而是仅仅表示本发明的选定实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
实施例:
如图1所示,本实施例提出一种基于设备驱动派遣函数hook的安全测试方法,包括如下步骤:
S1、在内核模块中枚举当前主机所有通用接口设备的设备名、设备对象以及驱动对象,保存设备名与设备对象的关系列表,初始化_event事件和_semaphore信号量,初始化一个数据链表用于保存数据;
S2、在客户端模块中枚举当前主机上所有通用接口设备的设备名列表,在设备名列表中选择一个待测设备名,发送给内核模块;
S3、内核模块根据待测设备名检索对应的设备对象以及驱动对象,然后对驱动对象进行hook,替换驱动对象所有的派遣函数为自定义的hook函数;
如图2所示,对驱动对象进行hook的处理过程包括:
S3-1、内核模块枚举该驱动对象下的所有设备对象;
S3-2、保存当前被测设备的设备对象和驱动对象的信息记录;
S3-3、循环调用InterlockedExchangePointer函数,将驱动对象中的派遣函数全部替换为自定义的hook函数,并保存原有的派遣函数和驱动对象。
S4、客户端模块从数据旁路测试、数据篡改测试、重放攻击测试和模糊测试中选择一种测试方法,向内核模块发送该次测试的测试指令和测试数据,初始化一个读线程,准备从内核模块中读取测试数据;
S5、内核模块收到测试指令后,使客户端模块读线程进入等待状态,等待主机与通用接口设备之间的通信,准备旁路通信数据;
S6、主机与通用接口设备开始通信之后,产生了一个IRP,即I/O请求数据包,hook函数从IRP中旁路通信数据,将通信数据保存在一个数据节点中,并设置该IRP的完成例程;
如图3所示,步骤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的完成例程(IoCompletion例程),从而在IRP完成时执行步骤S6-1至S6-6,获取返回的通信数据;
S6-9、调用IoSetNextIrpStackLocation函数把当前的IRP栈单元地址设置为下一层的IRP栈。
S7、hook函数根据客户端模块发送下来的测试指令及原始数据,构造不同的测试数据,执行后续的数据篡改测试、重放攻击测试或模糊测试;其中的数据篡改测试、重放攻击测试或模糊测试的执行流程具体如下:
(1)数据篡改测试,如图4所示:
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。
(2)重放攻击测试,如图5所示:
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。
(3)模糊测试,如图6所示:
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。
S8、内核模块每捕获并处理一次主机与通用接口设备的通信数据都会将数据节点插入到数据链表中,通过改变_semaphore信号量状态使客户端模块读线程转入工作状态,在数据链表中读取该次测试的通信数据;
S9、客户端模块向内核模块发送测试停止指令,内核模块接收到测试停止指令后即重置_event事件和_semaphore信号量,根据I/O请求数据包的状态取消或完成当前I/O请求数据包,清空数据链表,停止测试功能。
以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

Claims (6)

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。
CN202111512038.3A 2021-12-07 2021-12-07 一种基于设备驱动派遣函数hook的安全测试方法 Active CN114386044B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202111512038.3A CN114386044B (zh) 2021-12-07 2021-12-07 一种基于设备驱动派遣函数hook的安全测试方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202111512038.3A CN114386044B (zh) 2021-12-07 2021-12-07 一种基于设备驱动派遣函数hook的安全测试方法

Publications (2)

Publication Number Publication Date
CN114386044A true CN114386044A (zh) 2022-04-22
CN114386044B CN114386044B (zh) 2023-01-31

Family

ID=81196575

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202111512038.3A Active CN114386044B (zh) 2021-12-07 2021-12-07 一种基于设备驱动派遣函数hook的安全测试方法

Country Status (1)

Country Link
CN (1) CN114386044B (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN115599645A (zh) * 2022-10-13 2023-01-13 安芯网盾(北京)科技有限公司(Cn) 一种linux驱动模块稳定性测试方法及装置

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN104063633A (zh) * 2014-04-29 2014-09-24 航天恒星科技有限公司 一种基于过滤驱动的安全审计系统
CN110221867A (zh) * 2019-05-31 2019-09-10 湖北三江航天万峰科技发展有限公司 一种xp系统下脉冲i/o功能卡通信驱动系统及方法
CN112052045A (zh) * 2020-08-31 2020-12-08 郑州信大捷安信息技术股份有限公司 一种基于IRP hook的设备控制方法及系统

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN104063633A (zh) * 2014-04-29 2014-09-24 航天恒星科技有限公司 一种基于过滤驱动的安全审计系统
CN110221867A (zh) * 2019-05-31 2019-09-10 湖北三江航天万峰科技发展有限公司 一种xp系统下脉冲i/o功能卡通信驱动系统及方法
CN112052045A (zh) * 2020-08-31 2020-12-08 郑州信大捷安信息技术股份有限公司 一种基于IRP hook的设备控制方法及系统

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN115599645A (zh) * 2022-10-13 2023-01-13 安芯网盾(北京)科技有限公司(Cn) 一种linux驱动模块稳定性测试方法及装置
CN115599645B (zh) * 2022-10-13 2023-05-02 安芯网盾(北京)科技有限公司 一种linux驱动模块稳定性测试方法及装置

Also Published As

Publication number Publication date
CN114386044B (zh) 2023-01-31

Similar Documents

Publication Publication Date Title
CN110162977B (zh) 一种Android车载终端系统漏洞检测系统及方法
CN106778104B (zh) 一种应用程序的反调试方法和系统
CN111291384B (zh) 漏洞扫描方法、装置及电子设备
CN112463581B (zh) 一种对分布式系统进行模糊测试的方法及系统
CN114386044B (zh) 一种基于设备驱动派遣函数hook的安全测试方法
CN110457220A (zh) 基于安卓系统的模拟器检测方法、智能终端及存储介质
CN112765028B (zh) 基于群控机制的Android应用程序测试方法及系统
CN109214171A (zh) 一种软件的检测方法、装置、设备及介质
CN106845170A (zh) 一种反调试方法和系统
CN113051034A (zh) 一种基于kprobes的容器访问控制方法与系统
US7062753B1 (en) Method and apparatus for automated software unit testing
CN111814119B (zh) 一种反调试的方法
CN112199273A (zh) 一种虚拟机压力/性能测试方法及系统
CN113656291B (zh) 软件脚本引擎动态调用方法
CN115495363A (zh) 一种软件测试方法、电子设备及可读存储介质
CN111797016B (zh) 应用程序的测试方法、设备、存储介质及装置
CN111143851B (zh) 适用于操作系统内核对象地址泄露的检测方法及系统
CN113190836A (zh) 一种基于本地命令执行的web攻击行为检测方法及系统
CN107808088A (zh) 一种指纹录入方法、装置、计算机装置、可读存储介质
JP2002538532A (ja) Icカードのアプリケーションに対するアクセス保護装置
CN101777102A (zh) 一种对内核的安全审计方法和系统
CN113852623B (zh) 一种病毒工控行为检测方法及装置
CN113609487B (zh) 通过静态分析检测后门代码的方法
CN111274585B (zh) 一种Web应用越权漏洞检测方法、装置、设备和介质
CN116166521A (zh) 一种应用测试方法、装置、电子设备及存储介质

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant