驱动加载阻止方法及装置与流程

文档序号:11951539阅读:309来源:国知局
驱动加载阻止方法及装置与流程

本申请涉及通信技术领域,尤其涉及一种驱动加载阻止方法及装置。



背景技术:

随着互联网技术的快速发展,病毒、木马等恶意程序技术层出不穷,部分恶意程序会加载驱动模块来提高自身软件权限,强力删杀毒软件文件,卸载杀毒软件等,降低了用户终端设备的安全。

目前,应用程序主要通过调用NtLoadDriver函数或NtSetSystemInformation函数进行驱动模块的加载,而由应用程序调用上述两个函数,使得恶意程序可以挂钩上述两个函数,在上述两个函数中填充一些恶意程序的驱动模块路径,使得终端设备系统可以对恶意程序的驱动模块进行加载,提高恶意程序的软件权限,降低用户终端设备的安全。



技术实现要素:

本申请旨在至少在一定程度上解决相关技术中的技术问题之一。

为此,本申请的第一个目的在于提出一种驱动加载阻止方法,该方法用于阻止恶意程序的驱动模块的加载,从而避免杀毒软件被恶意程序的驱动模块卸载或删除,提高终端设备的安全。

本申请的第二个目的在于提出一种驱动加载阻止装置。

为达上述目的,本申请第一方面实施例提出了一种驱动加载阻止方法,包括:创建钩子函数,获取所述钩子函数的地址;从系统服务描述符表中预设位置获取模块文件加载函数的地址,存储所述模块文件加载函数的地址;将系统服务描述符表中所述模块文件加载函数的地址替换为所述钩子函数的地址;在接收到终端设备应用程序调用驱动加载函数过程中发送的模块文件加载函数调用指令时,从所述系统服务描述符表中所述预设位置获取所述钩子函数的地址;根据所述钩子函数的地址调用所述钩子函数,获取所述钩子函数的调用结果;若所述钩子函数的调用结果为空,则执行预设的回调函数退出所述驱动加载函数,阻止驱动加载。

本申请实施例的驱动加载阻止方法,通过将系统服务描述符表中模块文件加载函数的地址替换为钩子函数的地址,使得在接收到终端设备应用程序调用驱动加载函数过程中发送的模块文件加载函数调用指令时,从所述系统服务描述符表中所述预设位置获取所述钩子函数的地址;根据所述钩子函数的地址调用所述钩子函数,获取所述钩子函数的调用结果;根据钩子函数的调用结果判断待加载的模块文件是否为恶意程序的驱动模块文件,从而确定是否阻止驱动加载,实现对恶意程序的驱动模块的加载的阻止,避免恶意程序的驱动模块对终端设备上的杀毒软件进行卸载或删除,提高用户终端设备的安全。

为达上述目的,本申请第二方面实施例提出了一种驱动加载阻止装置,包括:创建模块,用于创建钩子函数,获取所述钩子函数的地址;存储模块,用于从系统服务描述符表中预设位置获取模块文件加载函数的地址,存储所述模块文件加载函数的地址;替换模块,用于将系统服务描述符表中所述模块文件加载函数的地址替换为所述钩子函数的地址;获取模块,用于在接收到终端设备应用程序调用驱动加载函数过程中发送的模块文件加载函数调用指令时,从所述系统服务描述符表中所述预设位置获取所述钩子函数的地址;调用模块,用于根据所述钩子函数的地址调用所述钩子函数,获取所述钩子函数的调用结果;执行模块,用于在所述钩子函数的调用结果为空时,执行预设的回调函数退出所述驱动加载函数,阻止驱动加载。

本申请实施例的驱动加载阻止装置,通过将系统服务描述符表中模块文件加载函数的地址替换为钩子函数的地址,使得在接收到终端设备应用程序调用驱动加载函数过程中发送的模块文件加载函数调用指令时,从所述系统服务描述符表中所述预设位置获取所述钩子函数的地址;根据所述钩子函数的地址调用所述钩子函数,获取所述钩子函数的调用结果;根据钩子函数的调用结果判断待加载的模块文件是否为恶意程序的驱动模块文件,从而确定是否阻止驱动加载,实现对恶意程序的驱动模块的加载的阻止,避免恶意程序的驱动模块对终端设备上的杀毒软件进行卸载或删除,提高用户终端设备的安全。

附图说明

本发明上述的和/或附加的方面和优点从下面结合附图对实施例的描述中将变得明显和容易理解,其中:

图1是本申请一个实施例的驱动加载阻止方法的流程图;

图2是本申请另一个实施例的驱动加载阻止方法的流程图;

图3是本申请一个实施例的驱动加载阻止装置的结构示意图;

图4是本申请另一个实施例的驱动加载阻止装置的结构示意图;

图5是本申请另一个实施例的驱动加载阻止装置的结构示意图;

图6是本申请另一个实施例的驱动加载阻止装置的结构示意图。

具体实施方式

下面详细描述本申请的实施例,所述实施例的示例在附图中示出,其中自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附图描述的实施例是示例性的,旨在用于解释本申请,而不能理解为对本申请的限制。

下面参考附图描述本申请实施例的驱动加载阻止方法及装置。

图1是本申请一个实施例的驱动加载阻止方法的流程图。

如图1所示,该驱动加载阻止方法包括:

步骤101,创建钩子函数,获取所述钩子函数的地址。

本发明提供的驱动加载阻止方法的执行主体为驱动加载阻止装置,驱动加载阻止装置具体可以为毒霸等杀毒软件,或者安装有毒霸等杀毒软件的终端设备的操作系统。终端设备可以为手机、平板电脑、笔记本等终端设备。

用户根据自身的需求在终端设备上安装了至少一个应用或程序,其中部分应用或程序可能感染了病毒、木马等恶意程序,为了避免恶意程序加载驱动模块,杀毒软件需要实时检查获取待加载的模块文件,判断待加载的模块文件是否为恶意程序的驱动模块文件;当待加载的模块文件为恶意程序的驱动模块文件时,结束加载过程。

其中,钩子函数具体可以为NewNtCreateSection函数。

步骤102,从系统服务描述符表中预设位置获取模块文件加载函数的地址,存储所述模块文件加载函数的地址。

其中,系统服务描述符表(System Services Descriptor Table,SSDT)用于把ring3的Win32API和ring0的内核API联系起来。系统服务描述符表SSDT并不仅仅只包含一个庞大的地址索引表,它还包含着一些其它有用的信息,诸如地址索引的基地址、服务函数个数等。其中,系统服务描述符表中预先存储了多个函数的地址,以便查询等。

步骤103,将系统服务描述符表中所述模块文件加载函数的地址替换为所述钩子函数的地址。

步骤104,在接收到终端设备应用程序调用驱动加载函数过程中发送的模块文件加载函数调用指令时,从所述系统服务描述符表中所述预设位置获取所述钩子函数的地址。

其中,模块文件加载函数具体可以为NtLoadDriver函数或者NtSetSystemInformation函数。

具体的,本实施例中终端设备加载模块文件的过程具体可以为:应用程序调用NtLoadDriver函数或者NtSetSystemInformation函数;终端设备系统内核层的NtLoadDriver函数或者NtSetSystemInformation函数执行;执行过程中调用钩子函数NewNtCreateSection;然而根据钩子函数的调用结果确定后续过程。

步骤105,根据所述钩子函数的地址调用所述钩子函数,获取所述钩子函数的调用结果。

具体的,驱动加载阻止装置可以根据钩子函数的地址从钩子函数的存储位置获取所述钩子函数,然后调用所述钩子函数,获取所述钩子函数的调用结果。

步骤106,若所述钩子函数的调用结果为空,则执行预设的回调函数退出所述驱动加载函数,阻止驱动加载。

进一步的,所述的方法还包括:若所述钩子函数的调用结果不为空,则根据所述模块文件加载函数的地址调用所述模块文件加载函数,加载所述模块文件。

其中,若钩子函数的调用结果为空,则表示待加载的模块文件为恶意程序的驱动模块文件,需要阻止驱动模块文件的加载;若钩子函数的调用结果不为空,则表示待加载的模块文件为非恶意程序的驱动模块文件或者其他模块文件,可以进行加载。

具体的,若所述钩子函数的调用结果不为空,驱动加载阻止装置恶意根据所述模块文件加载函数的地址获取所述模块文件加载函数,然后调用模块文件加载函数,接着调用终端设备系统内核层的NtMapViewOfSection函数,完成模块文件的加载过程。若所述钩子函数的调用结果为空,驱动加载阻止装置可以执行预设的回调函数退出驱动加载函数,而不执行NtCreateSection函数,实现驱动模块文件打开的失败,相应地应用程序调用驱动加载函数就会失败,这样就阻止了恶意程序的驱动模块的加载。

本申请实施例的驱动加载阻止方法,通过将系统服务描述符表中模块文件加载函数的地址替换为钩子函数的地址,使得在接收到终端设备应用程序调用驱动加载函数过程中发送的模块文件加载函数调用指令时,从所述系统服务描述符表中所述预设位置获取所述钩子函数的地址;根据所述钩子函数的地址调用所述钩子函数,获取所述钩子函数的调用结果;根据钩子函数的调用结果判断待加载的模块文件是否为恶意程序的驱动模块文件,从而确定是否阻止驱动加载,实现对恶意程序的驱动模块的加载的阻止,避免恶意程序的驱动模块对终端设备上的杀毒软件进行卸载或删除,提高用户终端设备的安全。

图2是本申请另一个实施例的驱动加载阻止方法的流程图。

如图2所示,针对图1所示实施例,步骤105具体可以包括:

步骤1051,根据所述钩子函数的地址调用所述钩子函数,获取当前加载的模块文件的执行状态、文件类型以及文件名称。

其中,在钩子函数NewNtCreateSection中,首先可以调用PsGetCurrentProcessId函数获取当前操作的进程标识,根据当前操作的进程标识判断是由谁在加载模块文件,由于钩子函数NewNtCreateSection的调用是由终端设备系统内核层完成的,而系统进程标识为4或者8;因此,若当前操作的进程标识为4或者8,则符合要求;然后,获取SectionPageProtection参数包含的PAGE_EXECUTE值,PAGE_EXECUTE值表示当前加载的模块文件的执行状态;获取AllocationAttributes参数包含的SEC_IMAGE值,SEC_IMAGE值表示当前加载的模块文件的文件类型;然后由文件句柄FileHandle参数为参数,调用ObReferenceObjectByHandle函数获取文件对象指针,这个指针保存的一个包括文件路径的结构,根据该文件路径可以获取当前加载的模块文件的文件名称。

步骤1052,根据所述当前加载的模块文件的执行状态、文件类型以及文件名称确定所述钩子函数的调用结果。

步骤1052具体可以包括:根据所述钩子函数的地址调用所述钩子函数,获取当前加载的模块文件的执行状态、文件类型以及文件名称;根据所述当前加载的模块文件的执行状态、文件类型以及文件名称确定所述钩子函数的调用结果。

具体的,若SectionPageProtection参数包含的PAGE_EXECUTE值表示当前加载的模块文件的执行状态为可执行,且AllocationAttributes参数包含的SEC_IMAGE值表示当前加载的模块文件的文件类型为驱动模块文件,则根据当前加载的模块文件的文件名称查询黑模块列表,判断所述黑模块列表中是否包括有所述当前加载的模块文件的文件名称,若所述黑模块列表中包括有所述当前加载的模块文件的文件名称,则确定当前加载的模块文件的状态为有毒状态,确定所述钩子函数的调用结果为空;若所述黑模块列表中不包括有所述当前加载的模块文件的文件名称,则确定当前加载的模块文件的状态为无毒状态,确定所述钩子函数的调用结果不为空。

另外,驱动加载阻止装置也可以将当前加载的模块文件的文件名称发送给上层文件查询系统,由上层文件查询系统根据当前加载的模块文件的文件名称确定当前加载的模块文件的状态为有毒状态或者无毒状态,然后确定钩子函数的调用结果。

进一步的,若所述当前加载的模块文件的执行状态为不可执行,或者所述文件类型为非驱动模块文件,或者所述当前加载的模块文件的状态为无毒状态,则确定所述钩子函数的调用结果不为空。

本申请实施例的驱动加载阻止方法,通过将系统服务描述符表中模块文件加载函数的地址替换为钩子函数的地址,使得在接收到终端设备应用程序调用驱动加载函数过程中发送的模块文件加载函数调用指令时,从所述系统服务描述符表中所述预设位置获取所述钩子函数的地址;根据所述钩子函数的地址调用所述钩子函数,获取当前加载的模块文件的执行状态、文件类型以及文件名称;根据所述当前加载的模块文件的执行状态、文件类型以及文件名称确定所述钩子函数的调用结果;根据钩子函数的调用结果判断待加载的模块文件是否为恶意程序的驱动模块文件,从而确定是否阻止驱动加载,实现对恶意程序的驱动模块的加载的阻止,避免恶意程序的驱动模块对终端设备上的杀毒软件进行卸载或删除,提高用户终端设备的安全。

为了实现上述实施例,本申请还提出一种驱动加载阻止装置。

图3是本申请一个实施例的驱动加载阻止装置的结构示意图。

如图3所示,该驱动加载阻止装置包括:

创建模块31,用于创建钩子函数,获取所述钩子函数的地址;

存储模块32,用于从系统服务描述符表中预设位置获取模块文件加载函数的地址,存储所述模块文件加载函数的地址;

替换模块33,用于将系统服务描述符表中所述模块文件加载函数的地址替换为所述钩子函数的地址;

获取模块34,用于在接收到终端设备应用程序调用驱动加载函数过程中发送的模块文件加载函数调用指令时,从所述系统服务描述符表中所述预设位置获取所述钩子函数的地址;

调用模块35,用于根据所述钩子函数的地址调用所述钩子函数,获取所述钩子函数的调用结果;

执行模块36,用于在所述钩子函数的调用结果为空时,执行预设的回调函数退出所述驱动加载函数,阻止驱动加载。

本发明提供的驱动加载阻止装置具体可以为毒霸等杀毒软件,或者安装有毒霸等杀毒软件的终端设备的操作系统。终端设备可以为手机、平板电脑、笔记本等终端设备。

用户根据自身的需求在终端设备上安装了至少一个应用或程序,其中部分应用或程序可能感染了病毒、木马等恶意程序,为了避免恶意程序加载驱动模块,杀毒软件需要实时检查获取待加载的模块文件,判断待加载的模块文件是否为恶意程序的驱动模块文件;当待加载的模块文件为恶意程序的驱动模块文件时,结束加载过程。

其中,钩子函数具体可以为NewNtCreateSection函数。系统服务描述符表(System Services Descriptor Table,SSDT)用于把ring3的Win32API和ring0的内核API联系起来。系统服务描述符表SSDT并不仅仅只包含一个庞大的地址索引表,它还包含着一些其它有用的信息,诸如地址索引的基地址、服务函数个数等。其中,系统服务描述符表中预先存储了多个函数的地址,以便查询等。模块文件加载函数具体可以为NtLoadDriver函数或者NtSetSystemInformation函数。

具体的,本实施例中终端设备加载模块文件的过程具体可以为:应用程序调用NtLoadDriver函数或者NtSetSystemInformation函数;终端设备系统内核层的NtLoadDriver函数或者NtSetSystemInformation函数执行;执行过程中调用钩子函数NewNtCreateSection;然而根据钩子函数的调用结果确定后续过程。

进一步的,图4是本申请另一个实施例的驱动加载阻止装置的结构示意图,如图4所示,在图3所示实施例的基础上,所示的驱动加载阻止装置还包括:加载模块37,用于在所述钩子函数的调用结果不为空时,根据所述模块文件加载函数的地址调用所述模块文件加载函数,加载所述模块文件。

其中,若钩子函数的调用结果为空,则表示待加载的模块文件为恶意程序的驱动模块文件,需要阻止驱动模块文件的加载;若钩子函数的调用结果不为空,则表示待加载的模块文件为非恶意程序的驱动模块文件或者其他模块文件,可以进行加载。

具体的,若所述钩子函数的调用结果不为空,驱动加载阻止装置恶意根据所述模块文件加载函数的地址获取所述模块文件加载函数,然后调用模块文件加载函数,接着调用终端设备系统内核层的NtMapViewOfSection函数,完成模块文件的加载过程。若所述钩子函数的调用结果为空,驱动加载阻止装置可以执行预设的回调函数退出驱动加载函数,而不执行NtCreateSection函数,实现驱动模块文件打开的失败,相应地应用程序调用驱动加载函数就会失败,这样就阻止了恶意程序的驱动模块的加载。

本申请实施例的驱动加载阻止装置,通过将系统服务描述符表中模块文件加载函数的地址替换为钩子函数的地址,使得在接收到终端设备应用程序调用驱动加载函数过程中发送的模块文件加载函数调用指令时,从所述系统服务描述符表中所述预设位置获取所述钩子函数的地址;根据所述钩子函数的地址调用所述钩子函数,获取所述钩子函数的调用结果;根据钩子函数的调用结果判断待加载的模块文件是否为恶意程序的驱动模块文件,从而确定是否阻止驱动加载,实现对恶意程序的驱动模块的加载的阻止,避免恶意程序的驱动模块对终端设备上的杀毒软件进行卸载或删除,提高用户终端设备的安全。

图5是本申请另一个实施例的驱动加载阻止装置的结构示意图,如图5所示,在图3所示实施例的基础上,所述调用模块35包括:

获取单元351,用于根据所述钩子函数的地址调用所述钩子函数,获取当前加载的模块文件的执行状态、文件类型以及文件名称;

确定单元352,用于根据所述当前加载的模块文件的执行状态、文件类型以及文件名称确定所述钩子函数的调用结果。

进一步的,图6是本申请另一个实施例的驱动加载阻止装置的结构示意图,如图6所示,在图5所示实施例的基础上,所述确定单元352包括:

判断子单元3521,用于判断所述当前加载的模块文件的执行状态是否为可执行,以及判断所述文件类型是否为驱动模块文件;

查询子单元3522,用于在所述当前加载的模块文件的执行状态为可执行,且所述文件类型为驱动模块文件时,根据所述当前加载的模块文件的文件名称查询预设的黑模块列表,获取所述当前加载的模块文件的状态;

第一确定子单元3523,用于在所述当前加载的模块文件的状态为有毒状态时,确定所述钩子函数的调用结果为空。

其中,在钩子函数NewNtCreateSection中,首先可以调用PsGetCurrentProcessId函数获取当前操作的进程标识,根据当前操作的进程标识判断是由谁在加载模块文件,由于钩子函数NewNtCreateSection的调用是由终端设备系统内核层完成的,而系统进程标识为4或者8;因此,若当前操作的进程标识为4或者8,则符合要求;然后,获取SectionPageProtection参数包含的PAGE_EXECUTE值,PAGE_EXECUTE值表示当前加载的模块文件的执行状态;获取AllocationAttributes参数包含的SEC_IMAGE值,SEC_IMAGE值表示当前加载的模块文件的文件类型;然后由文件句柄FileHandle参数为参数,调用ObReferenceObjectByHandle函数获取文件对象指针,这个指针保存的一个包括文件路径的结构,根据该文件路径可以获取当前加载的模块文件的文件名称。

具体的,若SectionPageProtection参数包含的PAGE_EXECUTE值表示当前加载的模块文件的执行状态为可执行,且AllocationAttributes参数包含的SEC_IMAGE值表示当前加载的模块文件的文件类型为驱动模块文件,则根据当前加载的模块文件的文件名称查询黑模块列表,判断所述黑模块列表中是否包括有所述当前加载的模块文件的文件名称,若所述黑模块列表中包括有所述当前加载的模块文件的文件名称,则确定当前加载的模块文件的状态为有毒状态,确定所述钩子函数的调用结果为空;若所述黑模块列表中不包括有所述当前加载的模块文件的文件名称,则确定当前加载的模块文件的状态为无毒状态,确定所述钩子函数的调用结果不为空。

另外,驱动加载阻止装置也可以将当前加载的模块文件的文件名称发送给上层文件查询系统,由上层文件查询系统根据当前加载的模块文件的文件名称确定当前加载的模块文件的状态为有毒状态或者无毒状态,然后确定钩子函数的调用结果。

进一步的,在上述实施例的基础上,所述确定单元352还包括:

第二确定子单元,用于在所述当前加载的模块文件的执行状态为不可执行,或者所述文件类型为非驱动模块文件,或者所述当前加载的模块文件的状态为无毒状态时,确定所述钩子函数的调用结果不为空。

需要说明的是,前述对驱动加载阻止方法实施例的解释说明也适用于该实施例的驱动加载阻止装置,此处不再赘述。

本申请实施例的驱动加载阻止装置,通过将系统服务描述符表中模块文件加载函数的地址替换为钩子函数的地址,使得在接收到终端设备应用程序调用驱动加载函数过程中发送的模块文件加载函数调用指令时,从所述系统服务描述符表中所述预设位置获取所述钩子函数的地址;根据所述钩子函数的地址调用所述钩子函数,获取当前加载的模块文件的执行状态、文件类型以及文件名称;根据所述当前加载的模块文件的执行状态、文件类型以及文件名称确定所述钩子函数的调用结果;根据钩子函数的调用结果判断待加载的模块文件是否为恶意程序的驱动模块文件,从而确定是否阻止驱动加载,实现对恶意程序的驱动模块的加载的阻止,避免恶意程序的驱动模块对终端设备上的杀毒软件进行卸载或删除,提高用户终端设备的安全。

在本说明书的描述中,参考术语“一个实施例”、“一些实施例”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本申请的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不必须针对的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任一个或多个实施例或示例中以合适的方式结合。此外,在不相互矛盾的情况下,本领域的技术人员可以将本说明书中描述的不同实施例或示例以及不同实施例或示例的特征进行结合和组合。

此外,术语“第一”、“第二”仅用于描述目的,而不能理解为指示或暗示相对重要性或者隐含指明所指示的技术特征的数量。由此,限定有“第一”、“第二”的特征可以明示或者隐含地包括至少一个该特征。在本申请的描述中,“多个”的含义是至少两个,例如两个,三个等,除非另有明确具体的限定。

流程图中或在此以其他方式描述的任何过程或方法描述可以被理解为,表示包括一个或更多个用于实现特定逻辑功能或过程的步骤的可执行指令的代码的模块、片段或部分,并且本申请的优选实施方式的范围包括另外的实现,其中可以不按所示出或讨论的顺序,包括根据所涉及的功能按基本同时的方式或按相反的顺序,来执行功能,这应被本申请的实施例所属技术领域的技术人员所理解。

应当理解,本申请的各部分可以用硬件、软件、固件或它们的组合来实现。在上述实施方式中,多个步骤或方法可以用存储在存储器中且由合适的指令执行系统执行的软件或固件来实现。例如,如果用硬件来实现,和在另一实施方式中一样,可用本领域公知的下列技术中的任一项或他们的组合来实现:具有用于对数据信号实现逻辑功能的逻辑门电路的离散逻辑电路,具有合适的组合逻辑门电路的专用集成电路,可编程门阵列(PGA),现场可编程门阵列(FPGA)等。

本技术领域的普通技术人员可以理解实现上述实施例方法携带的全部或部分步骤是可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,该程序在执行时,包括方法实施例的步骤之一或其组合。

此外,在本申请各个实施例中的各功能单元可以集成在一个第一处理模块中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个模块中。上述集成的模块既可以采用硬件的形式实现,也可以采用软件功能模块的形式实现。所述集成的模块如果以软件功能模块的形式实现并作为独立的产品销售或使用时,也可以存储在一个计算机可读取存储介质中。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1