一种拦截动态库注入的方法与流程

文档序号:12272058阅读:517来源:国知局
一种拦截动态库注入的方法与流程

本发明涉及计算机技术领域,特别涉及一种拦截动态库注入的方法。



背景技术:

动态库注入是windows操作系统提供的一种编程机制,允许一个应用程序A把一段代码注入到另外一个应用程序B中去执行,用来实现一定的功能。但是这样可能会造成应用程序B运行不稳定,甚至出现崩溃。例如,一些杀毒软件程序会向操作系统中其他进程注入动态库,执行一些代码,其中就包含kswebshield.dll这个动态库,这个库中包含一些代码,会导致被注入的应用程序程序运行不稳定,经常崩溃。

拦截动态库注入的目的就是为了防止自身程序遭到其它程序的注入而导致的一系列不稳定问题。当动态库尝试加载到当前进程的时候,主动取消操作。现有技术中并没有提供一种实现拦截动态库注入的方法。



技术实现要素:

本发明技术方案解决的技术问题为,如何有效拦截动态库注入。

为了解决上述技术问题,本发明提供了一种实现拦截动态库注入的方法,适于防止外部程序将含有可执行代码的外部动态库注入至本程序进程,包括;

监测本程序进程中的目标函数;以及,前置处理如下步骤;

若所述目标函数被系统动态库调用、且传入外部动态库的文件名与预置文件名匹配,则拒绝调用所述目标函数。

优选地,还包括对所述目标函数进行挂钩,或者,在所述本程序进程中对所述目标函数进行挂钩;

所述监测本程序进程中的目标函数包括若所述目标函数被调用,则当调用消息到达后、在调用所述目标函数前,优先执行所述前置处理。

优选地,还包括若所述目标函数的调用位置位于所述系统动态库的地址,则所述目标函数被系统动态库调用。

优选地,还包括获取所述系统动态库在本程序中的地址范围及所述目标函数的返回地址。

优选地,所述获取所述系统动态库在本程序中的地址范围包括:使用GetModuleHandle系列函数获取;

获取所述目标函数的返回地址包括:使用ReturnAddress函数获取。

优选地,还包括写入所需要拦截的动态库文件名作为所述预置文件名。

优选地,所述目标函数是在本程序进程中被所述系统动态库调用函数主动调用、并适于加载所述外部动态库的。

优选地,所述调用函数为ClientLoadLibrary,所述目标函数为LoadLibraryExW。

优选地,还包括在拒绝调用所述目标函数后继续运行本程序。

优选地,还包括若所述目标函数并非被系统动态库调用和/或传入外部动态库的文件名与预置文件名不一致,则将调用所述目标函数的请求传递至操作系统。

本发明技术方案的有益效果至少包括:

本发明技术方案通过对目标函数挂钩(API Hook技术),从本程序进程中识别出需要拦截的动态库,然后通过拒绝调用目标函数来实现对外部动态库的拦截。

本发明通过预置需要拦截的动态库的方式,使拦截方案更有目的性,在有效拦截有害动库态的基础上,并不阻碍对系统正常运行所需的动态库的加载,保持本程序的正常运行。

附图说明

通过阅读参照以下附图对非限制性实施例所作的详细描述,本发明的其他特征、目的和优点将会变得更明显:

图1示出根据本发明的第一实施例的,一种拦截动态库注入的方法流程图;

图2示出根据本发明的动态库注入的流程概要图;

图3示出根据本发明的第一实施例的一个变化例的,一种拦截动态库注入的方法流程图;

图4示出根据本发明的第二实施例的,一种拦截动态库注入的方法流程图;

图5示出根据本发明的第三实施例的,一种拦截动态库注入的方法流程图;

图6示出根据本发明的第四实施例的,一种拦截动态库注入的方法流程图。

具体实施方式

为了更好的使本发明的技术方案清晰的表示出来,下面结合附图对本发明作进一步说明。

图1示出根据本发明的第一实施例的,一种拦截动态库注入的方法流程图。如上所述,本发明主要应用于Windows操作系统上,但不排除适用在其他操作系统上,如Android OS、Mac OS等,本领域技术人员理解这样的控制过程具有重要意义,以杀毒软件和浏览器举例说明,杀毒软件会向Windows操作系统中其他进程注入动态库,执行一些代码。本领域技术人员理解,这个库中包含一些代码,会导致被注入的应用程序程序运行不稳定,经常崩溃。在实际运行过程中,所述杀毒软件程序向所述浏览器注入动态库,为了让描述具有通用性,在下文中我们以程序A.exe代表杀毒软件(也可代表任意其他程序),动态库C.dll代表需要注入的动态库(也可以是其他任意.dll文件),函数xyz()是所述动态库C.dll中的一段代码,程序B.exe代表浏览器(也可以是其他任意程序,如浏览器、视屏播放器等)。Windows操作系统提供了一种动态库注入的机制,使用Windows API:SetWindowsHook或SetWindowsHookEx两个函数,可以使所述程序A.exe把所述动态库C.dll载入到所述程序B.exe中,并且执行所述动态库C.dll中包含的所述函数xyz()(这种情况下是被动的,非自愿的),如图2示出的动态库注入的流程概要图,具体如下:

1.所述程序A.exe提供一个所述动态库C.dll,其中所述C.dll中包含一个需要注入的所述函数xyz();

2.所述程序A.exe获得所述程序B.exe的一个线程ID(可以理解为所述程序B.exe的一个资源的标识符),然后调用所述Windows API,并传入参数线程ID和函数xyz()的地址;

3.所述程序B.exe执行到特定过程时,即需要实现某项功能时,Windows操作系统就会在当前程序中加载所述动态库C.dll,并且调用所述函数xyz()。

本发明技术方案就是为了解决如何阻止所述程序A.exe将所述函数xyz()注入到需要保护的程序B.exe中的技术问题。具体地,如图1示出的具体步骤如下:

首先进入步骤S101,本程序运行,本程序就是本发明技术方案所需要保护程序。

然后进入步骤S102,监测本程序进程中的目标函数。所述目标函数即用来调取外部动态库的函数。

进一步地,所述目标函数是在本程序进程中被所述系统动态库调用函数主动调用、并适于加载所述外部动态库的。在实际操作过程中,当应用程序要加载一个动态库并使用其中的功能时,首先要把动态库加载到程序的内存空间中,而完成这一步调取任务所使用的工具即为所述目标函数。例如,本领域技术人员理解,在Windows操作系统下,所述目标函数由Kernel32.dll提供的LoadLibraryExW或LoadLibraryExA函数。

然后执行步骤S103,系统动态库调用所述目标函数。在本程序进程中,当需要加载动态库时,所述目标函数就会被所述系统动态库调用,所述系统动态库即为含有调取所述目标函数的工具的动态数据库,例如,本领域技术人员理解,在Windows操作系统下,所述系统动态库即为User32.dll,所述包含一个功能函数ClientLoadLibrary,所述功能函数ClientLoadLibrary用来实现Windows本身提供的动态库注入机制,但只能由所述User32.dll使用,不提供给外面的第三方动态库使用。

然后进入步骤S104,判断所述外部动态库的文件名与所述预置文件名是否匹配。所述外部动态库即为不属于所述系统提供的动态库,所述外部动态库是即将为所述目标函数调取的目标动态库,所述调取过程如图2示出的动态库注入的流程。所文件名即以.dll为后缀的动态库名,所述预置文件名即预先写入的、需要拦截的动态库文件名。所述匹配,即检测所述传入外部动态库的文件名与所述预置文件名是否相同,若相同,则断定所述传入外部动态库为需要拦截的动态库。需要强调的是,例如,本领域技术人员理解,在Windows操作系统下,所述步骤S103的操作原理是:在正常情况下,所述User32.dll是Windows操作系统的组件,绝无可能命令所述目标函数(LoadLibraryExW或LoadLibraryExA)调用外部动态库中的函数,出现这种情况基本可以断定外部动态库是被注入到本程序中的。

然后执行步骤S105,若匹配,则拒绝调用所述目标函数。所述匹配,即所述传入外部动态库为需要拦截的动态库,这时,所述目标函数就会拒绝调用所述外部动态库。

进一步地,图3示出根据本发明的第一实施例的一个变化例的,一种拦截动态库注入的方法流程图。图3基于图1,在执行步骤S304,拒绝调用所述目标函数后,继续运行本程序。本发明技术方案的宗旨是为了保证所述本程序运行稳定,从而拦截所述目标函数调取预置的所述外部动态库的函数。因此,在拦截之后,还是要正常运行所述本程序,从而不影响本程序的功能实现。同时,若再次出现调用目标函数的指令,本发明提供的技术方案仍能够继续保持对本程序的保护。

图4示出根据本发明的第二实施例的,一种拦截动态库注入的方法流程图。图4基于图1,区别之处在于:通过前置步骤S4021对所述目标函数进行挂钩,以监测所述目标函数,所述挂钩即使用钩子改变所述目标函数的原有功能,具体地,例如,本领域技术人员理解,在Windows操作系统下,所述钩子是Windows消息处理机制的一个平台,应用程序可以在所述平台上面设置子程以监视窗口的目标消息,并且所监视的窗口可以是其他进程所创建的。钩子机制允许应用程序截获Windows消息或特定事件,即当目标消息到达后,在目标窗口处理函数之前处理它。

结合第二实施例,使用API Hook技术进行挂钩,所述API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源代码,或理解内部工作机制的细节。具体地,通过系统调用,把所述钩子挂入所述目标函数,每当特定的消息发出,在没有到达目的窗口前,所述钩子程序就先捕获该消息,亦即所述钩子函数先得到控制权。其中最后装载的钩子最先获得消息。本发明使用的一种钩子为INLINE Hook或IAT Hook,所述INLINE Hook即内联的函数钩子,它可以直接修改要挂钩的目标函数的代码,来实现函数流程的跳转到预先设置的一个函数里,所述预先设置的函数可以执行判断所述传入外部动态库的文件名与所述预置文件名是否匹配;所述IAT Hook即为导入表函数钩子,通过修改X.exe或者X.dll的导入表来实现函数流程的跳转到预先设置的一个函数里,所述预先设置的函数可以执行判断所述传入外部动态库的文件名与所述预置文件名是否匹配。

进一步地,第二实施例的一个变化例,与第二实施例的改进之处在于,在所述本程序进程中对所述目标函数进行挂钩。即在本程序进中,则对目标函数进行挂钩,并不预先对所述目标函数进行挂钩,这样,根据本发明技术方案的程序更有目的性,灵活执行拦截任务,同时又不会给系统运行造成负担。。

图5示出根据本发明的第三实施例的,一种拦截动态库注入的方法流程图。图5基于图1,区别在于,包括步骤S503,判断所述目标函数的调用置位是否位于所述系统动态库的地址;若是,则执行步骤S504,判断所述传入外部的文件名与所述预置文件名是否匹配。具体地,需要强调的是,本发明确定的技术方案通过监测目标函数的行为找出需要拦截的外部动态库,在所述外部动态库注入到本程序的路径中设置拦截。所述目标函数的调用位置是指目标函数调取外部动态库的位置,动态库就是一个系列功能的集合。例如,本领技术人员理解,在Windows操作系统下,要再屏幕上创建一个窗口,那么程序员可以调用User32.dll中提供的CreateWindow函数来实现,这里的CreateWindow就是User32.dll提供的用于创建窗口的函数名字。所述本程序需要加载一个动态库并使用其中的功能时,首先需要调用所述目标函数,所述目标函数是工具函数,实现调取其他动态库中函数的功能。通常情况下,所述目标函数在系统动态库里面调取某个函数,所述函数必然属于该系统动态库,而本发明的技术方案是要防止所述目标函数通过系统动态库调取到外部动态库中的函数。在明确前述思路后,实现拦截之前,首先要判断所述目标函数的返回地址是否出自系统动态库,如果出自系统动态库,则接下来判断所述被传入的外部动态库的文件名与所述预置文件名是否匹配,这样才能明确最终需要拦截的外部动态库,防止误操作。

进一步地,获取所述系统动态库在本程序中的地址范围及所述目标函数的返回地址。这一步提供了一种判断方法,即在步骤S503的基础上明确如何判断所述目标函数的返回地址是否出自所述系统动态库。具体地,首先需要获取所述系统动态库在本程序中的地址范围,然后获取所述目标函数的返回地址,所述返回地址即是从子程序返回后,主程序继续执行的指令地址称为″返回地址″.返回地址就是主程序中CALL指令后面一条指令的地址。例如,本领域技术人员理解,在Windows操作系统下,所述系统动态库(如User32.d11)在本程序中的地址范围,如0x600000~0x900000,而所述返回地址的落在了0x600000~0x900000之间时,即证明所述目标函数将要从所述系统动态数据库中调取函数;若所述返回地址落在0x600000~0x900000之外时,则证明所述目标函数并非将要从所述系统动态库中调取函数。

进一步地,所述获取所述系统动态库在本程序中的地址范围包括:使用GetModuleHandle系列函数获取,获取所述目标函数的返回地址包括:使用ReturnAddress函数获取。这一步提供了两种工具,用于获取系统动态库在本程序中的地址范围和目标函数的返回地址。具体地,本领域技术人员理解,在Windows操作系统下,所述GetModuleHandle系列函数包括GetModuleHandle和GetModuleHandleEx,这个函数是由所述Kenerl32.dll提供的函数,用来获得一个动态库的句柄,所述句柄就是编程语言中用来一个物件的标识,要操作一个动态库必须先得到库的所述句柄。_ReturnAddress()是微软的C++运行时,动态库提供的一个编程接口,用来得到当前函数的返回地址,也就是调用这个函数的某个位置。需要说明的是,理论上存在其它的方法去获得这个返回地址,但是没有相关的替换函数。

结合上一步,在拦截之前,判断所述目标函数是否将要从需要被拦截的外部动态库的函数的方法具体为:例如,本领域技术人员理解,在Windows操作系统下,首先获得要判断的所述系统动态库(如user32.dll)在本程序中的地址范围,如0x600000~0x900000,这可以通过一些Windows API,GetModuleHandle等系列函数获得。在当前被调用的目标函数中使用windows系统提供的API,_ReturnAddress()获得当前函数的返回地址x,判断x是否在上面的所述系统动态库在本程序的范围之内,如果是则说明所述目标函数是被要判断的所述系统动态库(如user32.dll)调用的,然后进行判断所述外部动态库的文件名与所述预置文件名是否匹配,如匹配,则拒绝调用所述目标函数。

图6示出根据本发明的第四实施例,一种拦截动态库注入的方法流程图。为了进一步保证本程序的运行,在拦截过程中加入如下步骤:

步骤603,若所述目标函数并非被系统动态库调用,则将调用所述目标函数的请求传递至操作系统,保证所述本程序需要的功能通过所述目标函数实现。

步骤604,若传入外部动态库的文件与预置文件名不一致则将调用所述目标函数的请求传递至操作系统,保证所述本程序需要的功能通过所述目标函数实现。

需要说明的是本发明提供的技术方案持续的为本程序的运行提供保护。所以图6示出的流程图为可循环执行,直至本程序停止运行。

以上对本发明的具体实施例进行了描述。需要理解的是,本发明并不局限于上述特定实施方式,本领域技术人员可以在权利要求的范围内做出各种变形或修改,这并不影响本发明的实质内容。

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