防注入的方法和装置与流程

文档序号:12600466阅读:423来源:国知局
防注入的方法和装置与流程

本发明涉及信息安全领域,特别是涉及一种防注入的方法和装置。



背景技术:

注入是指以某种方式或通过系统机制把可执行模块强行加载到进程中。常见的注入发生在API(Applicant Programming Interface,应用程序编程接口)的内部,当代码中调用某个系统API时(如SHELL32.dll的特定API),API内部会主动读取注册表特定的位置,检查是否有第三方的DLL(Dynamic Link Library,动态链接库)注册信息,如果存在第三方的DLL信息,API会把这些第三方DLL加载到当前进程中,这个就是一次注入过程。

为了防止注入,传统的方式是避免调用有注入行为的API。然而,采用避免调用的方式,需要清晰知道哪类API内部具有注入行为,对软件开发者要求过高,且出错机会较大;一些核心功能的API,实现功能比较复杂,并且没有替代的API,如果调用这些API则会被注入,容易被攻击者通过注入的DLL进行攻击,安全性低,若不调用这些API,则需要自己实现其相应的功能,代价非常大。



技术实现要素:

基于此,有必要针对传统的避免调用方式防止注入,出错几率大且安全性低的问题,提供一种防注入的方法,能防止出错且安全性高。

此外,还有必要提供一种防注入的装置,能防止出错且安全性高。

一种防注入的方法,包括以下步骤:

获取应用程序编程接口的调用指令;

根据所述调用指令在应用程序编程接口内部读取注册表信息时,进入Hook函数;

通过所述Hook函数读取注册表信息,并根据预设策略获取动态链接库信息;

加载获取的动态链接库信息到当前进程。

一种防注入的装置,包括:

调用模块,用于获取应用程序编程接口的调用指令;

进入模块,用于根据所述调用指令在应用程序编程接口内部读取注册表信息时,进入Hook函数;

获取模块,用于通过所述Hook函数读取注册表信息,并根据预设策略获取动态链接库信息;

加载模块,用于加载获取的动态链接库信息到当前进程。

上述防注入的方法和装置,调用应用程序编程接口时,通过Hook函数读取注册表信息,并按照预设策略获取动态链接库信息,加载动态链接库信息到当前进程中,通过预设策略筛选了动态链接库,而不是直接由应用程序编程接口读取注册表信息获取动态链接库进行加载,不需人工识别,能防止出错,且能加载应用程序编程接口,因筛选过动态链接库,调用应用程序编程接口安全性高。

附图说明

图1A为一个实施例中终端的内部结构示意图;

图1B为一个实施例中服务器的内部结构示意图;

图2为一个实施例中防注入的方法的流程图;

图3为一个实施例中使用上述防注入的方法注入动态链接库的框架示意图;

图4为一个实施例中通过该Hook函数读取注册表信息,并根据预设策略获取动态链接库信息的具体流程图;

图5为一个实施例中防注入的装置的结构框图;

图6为另一个实施例中防注入的装置的结构框图;

图7为注入第三方的DLL的结果示意图;

图8为防止注入第三方的DLL的结果示意图。

具体实施方式

为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。

图1A为一个实施例中终端的内部结构示意图。如图1A所示,该终端包括通过系统总线连接的处理器、存储介质、内存和网络接口、声音采集装置、显示屏、扬声器和输入装置。其中,终端的存储介质存储有操作系统,还包括一种防注入的装置,该防注入的装置用于实现一种防注入的方法。存储介质中还存储有白名单和/或黑名单、动态链接库注入信息的注册表位置等,白名单用于记录允许注入的动态链接库的属性信息,黑名单用于记录不允许注入的动态链接库的属性信息。属性信息可包括DLL(Dynamic Link Library,动态链接库)的路径、DLL的CLSID信息(Class Identity,全局唯一标识符)、DLL的哈希信息等。该处理器用于提供计算和控制能力,支撑整个终端的运行。终端中的内存为存储介质中的防注入的装置的运行提供环境,网络接口用于与服务器进行网络通信,如发送数据请求至服务器,接收服务器返回的数据等。终端的显示屏可以是液晶显示屏或者电子墨水显示屏等,输入装置可以是显示屏上覆盖的触摸层,也可以是终端外壳上设置的按键、轨迹球或触控板,也可以是外接的键盘、触控板或鼠标等。该终端可以是手机、平板电脑或者个人数字助理。本领域技术人员可以理解,图1A中示出的结构,仅仅是与本申请方案相关的部分结构的框图,并不构成对本申请方案所应用于其上的终端的限定,具体的终端可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。

图1B为一个实施例中服务器的内部结构示意图。如图1B所示,该服务器包括通过系统总线连接的处理器、存储介质、内存和网络接口。其中,该服务器的存储介质存储有操作系统、数据库和防注入的装置,数据库中存储有白名单和/或黑名单、动态链接库注入信息的注册表位置等,白名单用于记录允许注入的动态链接库的属性信息,黑名单用于记录不允许注入的动态链接库的属性信息。属性信息可包括DLL(Dynamic Link Library,动态链接库)的路径、DLL的CLSID信息(Class Identity,全局唯一标识符)、DLL的哈希信息等。该防注入的装置用于实现适用于服务器的一种防注入的方法。该服务器的处理器用于提 供计算和控制能力,支撑整个服务器的运行。该服务器的内存为存储介质中的防注入的装置的运行提供环境。该服务器的网络接口用于据以与外部的终端通过网络连接通信,比如接收终端发送的数据请求以及向终端返回压缩后的数据等。服务器可以用独立的服务器或者是多个服务器组成的服务器集群来实现。本领域技术人员可以理解,图1B中示出的结构,仅仅是与本申请方案相关的部分结构的框图,并不构成对本申请方案所应用于其上的服务器的限定,具体的服务器可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。

图2为一个实施例中防注入的方法的流程图。图2中的防注入的方法可应用于终端或服务器上。如图2所示,一种防注入的方法,包括以下步骤:

步骤202,获取应用程序编程接口的调用指令。

具体地,程序调用应用程序编程接口时,产生调用指令。

步骤204,根据该调用指令在应用程序编程接口内部读取注册表信息时,进入Hook函数。

具体地,程序调用API时,API内部会读取注册表信息。读取注册表信息是读取各个注册表位置上的信息。

步骤206,通过该Hook函数读取注册表信息,并根据预设策略获取动态链接库信息。

具体地,Hook函数读取注册表信息后,根据预设策略从注册表信息中获取动态链接库信息。

预设策略可根据需要设定。

在一个实施例中,预设策略可包括白名单和/或黑名单。其中,白名单用于记录允许注入的动态链接库的属性信息,该黑名单用于记录不允许注入的动态链接库的属性信息。属性信息可包括DLL的路径、DLL的CLSID(全局唯一标识符)信息、DLL的哈希信息等中的一种或多种。DLL的路径是指动态链接库所处的位置,例如D:\program files/abc。DLL的CLSID是指windows系统对于不同的应用程序、文件类型、对象等以及各种系统组件分配的一个唯一表示它的ID代码,用于对其身份的标示和其他对象进行区分。

步骤206包括:通过该Hook函数读取注册表信息,并根据白名单和/或黑名单筛选得到允许注入的动态链接库。

具体地,根据白名单筛选出允许加载的动态链接库,根据黑名单删除不允许加载的动态链接库。

在另一个实施例中,预设策略为不允许任何动态链接库注入。步骤206包括:通过该Hook函数读取注册表信息,并根据预设策略获取空信息给应用程序编程接口。

具体地,当预设策略为不允许任何动态链接库注入时,Hook函数返回空信息给API,这样就不会有任何动态链接库被加载。

在另一个实施例中,预设策略可包括动态链接库的数字签名信息。步骤206包括:通过Hook函数读取注册表信息,获取动态链接库信息,从动态链接库信息中筛选出具有数字签名的动态链接库作为允许注入的动态链接库。

具体地,动态链接库信息可包括DLL的路径、DLL的CLSID(全局唯一标识符)信息、DLL的哈希信息等中的一种或多种。

在另一个实施例中,预设策略可包括动态链接库的数字签名信息、白名单和/或黑名单。步骤206包括:通过Hook函数读取注册表信息,获取动态链接库信息,从动态链接库信息中筛选出具有数字签名的动态链接库,再从具有数字签名的动态链接库中按照白名单和/或黑名单筛选得到允许注入的动态链接库。

步骤208,加载获取的动态链接库信息到当前进程。

具体地,获取的动态链接库信息可包括允许注入的动态链接库,或者为空信息。若动态链接库信息为允许注入的动态链接库,则加载获取的动态链接库到当前进程中。若动态链接库信息为空信息,则不加载任何动态链接库。

当前进程是指调用应用程序编程接口的程序运行时所启动的进程。

上述防注入的方法,调用应用程序编程接口时,通过Hook函数读取注册表信息,并按照预设策略获取动态链接库信息,加载动态链接库信息到当前进程中,通过预设策略筛选了动态链接库,而不是直接由应用程序编程接口读取注册表信息获取动态链接库进行加载,不需人工识别,能防止出错,且能加载应 用程序编程接口,因筛选过动态链接库,调用应用程序编程接口安全性高。

图3为一个实施例中使用上述防注入的方法注入动态链接库的框架示意图。如图3所示,注入动态链接库的过程包括:API调用后,(1)API内部读取注册表信息;(2)从Hook函数读取DLL信息;(3)Hook函数读取注册表;(4)获取注册表返回的注册表信息;(5)Hook函数根据返回的注册表信息及预设策略返回DLL信息给API;(6)API加载获取到的DLL到当前进程。

图4为一个实施例中通过该Hook函数读取注册表信息,并根据预设策略获取动态链接库信息的具体流程图。如图4所示,通过该Hook函数读取注册表信息,并根据预设策略获取动态链接库信息步骤包括:

步骤402,通过该Hook函数读取注册表信息,判断读取的注册表位置是否为预先记录的与注入相关的注册表位置,若是,则执行步骤404,若否,执行步骤410。

本实施例中,预先记录动态链接库注入信息的注册表位置。具体地,软件开发者统计出系统中所有保存DLL注入信息的注册表位置,并记录。预先记录的与注入相关的注册表位置即为预先记录的动态链接库注入信息的注册表位置。

步骤404,根据该调用指令分析读取到的动态链接库信息,然后执行步骤406。

步骤406,根据预设策略从读取到的动态链接库信息中剔除不需要注入的动态链接库,然后执行步骤408。

步骤408,获取剩余的动态链接库。

具体地,预设策略可包括数字签名、黑名单、白名单其中一种或两种以上组合。

本实施例中,加载获取的动态链接库信息到当前进程的步骤包括:加载该剩余的动态链接库到当前进程。

步骤410,根据调用指令直接获取动态链接库信息。

具体地,判断出读取的注册表位置不为预先记录的与注入相关的注册表位 置,则根据调用指令直接获取动态链接库信息,后续根据获取的动态链接库信息直接进行加载。

上述通过Hook函数判断读取的注册表位置是否为与注入相关的位置,若是,则分析读取到的DLL信息,根据预设策略筛选能加载的DLL,如此加载的DLL均为信任的DLL,其安全性高,通过Hook函数进行检测判断,方便且准确性高,能防止出错。

图5为一个实施例中防注入的装置的结构框图。图5的防注入的装置的内部模块为对应于图2中防注入的方法所建立的虚拟功能模块,但不限于此功能模块划分。如图5所示,一种防注入的装置,包括调用模块510、进入模块520、获取模块530和加载模块540。其中:

调用模块510用于获取应用程序编程接口的调用指令。

具体地,程序调用应用程序编程接口时,产生调用指令。

进入模块520用于根据该调用指令在应用程序编程接口内部读取注册表信息时,进入Hook函数。

具体地,程序调用API时,API内部会读取注册表信息。读取注册表信息是读取各个注册表位置上的信息。

获取模块530用于通过该Hook函数读取注册表信息,并根据预设策略获取动态链接库信息。

具体地,Hook函数读取注册表信息后,根据预设策略从注册表信息中获取动态链接库信息。预设策略可根据需要设定。

在一个实施例中,预设策略可包括白名单和/或黑名单。其中,白名单用于记录允许注入的动态链接库的属性信息,该黑名单用于记录不允许注入的动态链接库的属性信息。属性信息可包括DLL的路径、DLL的CLSID(全局唯一标识符)信息、DLL的哈希信息等中的一种或多种。DLL的路径是指动态链接库所处的位置,例如D:\program files/abc。DLL的CLSID是指windows系统对于不同的应用程序、文件类型、对象等以及各种系统组件分配的一个唯一表示它的ID代码,用于对其身份的标示和其他对象进行区分。

获取模块530还用于通过该Hook函数读取注册表信息,并根据白名单和/或黑名单筛选得到动态链接库。具体地,根据白名单筛选出允许加载的动态链接库,根据黑名单删除不允许加载的动态链接库。

在另一个实施例中,预设策略为不允许任何动态链接库注入。获取模块530还用于通过该Hook函数读取注册表信息,并根据预设策略获取空信息给应用程序编程接口。

具体地,当预设策略为不允许任何动态链接库注入时,Hook函数返回空信息给API,这样就不会有任何动态链接库被加载。

在另一个实施例中,预设策略可包括动态链接库的数字签名信息。获取模块530还用于通过Hook函数读取注册表信息,获取动态链接库信息,从动态链接库信息中筛选出具有数字签名的动态链接库作为允许注入的动态链接库。

具体地,动态链接库信息可包括DLL的路径、DLL的CLSID(全局唯一标识符)信息、DLL的哈希信息等中的一种或多种。

在另一个实施例中,预设策略可包括动态链接库的数字签名信息、白名单和/或黑名单。获取模块530还用于通过Hook函数读取注册表信息,获取动态链接库信息,从动态链接库信息中筛选出具有数字签名的动态链接库,再从具有数字签名的动态链接库中按照白名单和/或黑名单筛选得到允许注入的动态链接库。

加载模块540用于加载获取的动态链接库信息到当前进程。

具体地,获取的动态链接库信息可包括允许注入的动态链接库,或者为空信息。若动态链接库信息为允许注入的动态链接库,则加载获取的动态链接库到当前进程中。若动态链接库信息为空信息,则不加载任何动态链接库。

当前进程是指调用应用程序编程接口的程序运行时所启动的进程。

上述防注入的装置,调用应用程序编程接口时,通过Hook函数读取注册表信息,并按照预设策略获取动态链接库信息,加载动态链接库信息到当前进程中,通过预设策略筛选了动态链接库,而不是直接由应用程序编程接口读取注册表信息获取动态链接库进行加载,不需人工识别,能防止出错,且能加载应用程序编程接口,因筛选过动态链接库,调用应用程序编程接口安全性高。

在一个实施例中,该获取模块530还用于通过该Hook函数读取注册表信息,判断读取的注册表位置是否为预先记录的与注入相关的注册表位置,若判断出读取的注册表位置为预先记录的与注入相关的注册表位置,则根据该调用指令分析读取到的动态链接库信息,根据预设策略从读取到的动态链接库信息中剔除不需要注入的动态链接库,并获取剩余的动态链接库;以及还用于若判断出读取的注册表位置不为预先记录的与注入相关的注册表位置,则根据调用指令直接获取动态链接库信息。

该加载模块540还用于加载该剩余的动态链接库到当前进程。

上述通过Hook函数判断读取的注册表位置是否为与注入相关的位置,若是,则分析读取到的DLL信息,根据预设策略筛选能加载的DLL,如此加载的DLL均为信任的DLL,其安全性高,通过Hook函数进行检测判断,方便且准确性高,能防止出错。

图6为另一个实施例中防注入的装置的结构框图。如图6所示,一种防注入的装置,除了包括调用模块510、进入模块520、获取模块530和加载模块540,还包括记录模块550。其中:

记录模块550用于预先记录动态链接库注入信息的注册表位置。通过记录动态链接库注入信息的注册表位置方便进行比较判断获取的注册表位置是否为动态链接库注入信息的注册表位置。

为了更加清楚的说明防注入的方法和装置,以电脑管家应用程序为例。因稳定性是软件的基础,软件在运行过程中需要加载系统的模块、软件自身模块以及第三方注入的模块,一般来说,软件自身模块经过软件开发组的测试是相对稳定的,而对于第三方注入的模块,由于种类众多,开发力量悬殊,测试不充分等原因,注入到软件后导致软件工作不正常、崩溃等,对软件的打击是致命的。注入的模块即指动态链接库(DLL)。如图7所示,在未采用防注入的方法之前,电脑管家应用程序启动后对应的进程被注入了相关的软件模块,例如, DLL的名称为TortoiseSVN32.dll,描述为TortoiseSVN shell extension client,公司名称为http://tortoisesvn.net,路径为D:\TortoiseSVN\bin\TortoiseSVN32.dll;DLL的名称为TortoiseStub32.dll,描述为TortoiseSVN shell extension client,公司名称为http://tortoisesvn.net,路径为D:\TortoiseSVN\bin\TortoiseStub32.dll;DLL的名称为libsvn_tsvn32.dll,描述为subversion library dll built for TortoiseSVN shell extension client,公司名称为http://subversion.apache.org/,路径为D:\TortoiseSVN\bin\libsvn_tsvn32.dll等,电脑管家自身所需的软件模块可包括DLL的名称为GdiPlus.dll,描述为Microsoft GDI+,公司名称为Microsoft Corporation,路径为C:\Windows\winsxs\x86_microsoft.windows.gdiplus_6595b64;DLL的名称为comctl32.dll,描述为用户体验控件库,公司名称为Microsoft Corporation,路径为C:\Windows\winsxs\x86_microsoft.windows.commom-controls;DLL的名称为msvcr80.dll,描述为Microsoft C Runtime Library,公司名称为Microsoft Corporation,路径为C:\Windows\winsxs\x86_microsoft.vc80.crt_lfc8b3b9ale8e3等。一旦这些模块内部发生了异常会导致整个管家进程也异常退出,从某个角度来看,攻击者也可以通过注入的DLL,攻击电脑管家。

通过防注入的方法,电脑管家调用API时,API内部读取注册表,进入Hook函数,Hook函数读取注册表信息,筛选剔除第三方的DLL,得到剩余的DLL信息,将剩余的DLL信息返回给API,API加载剩余的DLL到当前电脑管家进程。如图8所示,电脑管家的进程不再注入第三方的DLL模块,只加载系统自身的一些DLL,例如DLL的名称为GdiPlus.dll,描述为Microsoft GDI+,公司名称为Microsoft Corporation;DLL的名称为comctl32.dll,描述为用户体验控件库,公司名称为Microsoft Corporation;DLL的名称为msvcr80.dll,描述为Microsoft C Runtime Library,公司名称为Microsoft Corporation等。如此不但节省了内存,还保证了电脑管家进程的稳定性。

本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于一非易失性计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施 例的流程。其中,所述的存储介质可为磁碟、光盘、只读存储记忆体(Read-Only Memory,ROM)等。

以上所述实施例仅表达了本发明的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对本发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变形和改进,这些都属于本发明的保护范围。因此,本发明专利的保护范围应以所附权利要求为准。

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