一种拦截动态库注入的方法.pdf

上传人:奻奴 文档编号:6031208 上传时间:2019-04-03 格式:PDF 页数:10 大小:640.32KB
返回 下载 相关 举报
摘要
申请专利号:

CN201610785500.X

申请日:

2016.08.30

公开号:

CN106446671A

公开日:

2017.02.22

当前法律状态:

实审

有效性:

审中

法律详情:

实质审查的生效IPC(主分类):G06F 21/52申请日:20160830|||公开

IPC分类号:

G06F21/52(2013.01)I; G06F21/55(2013.01)I

主分类号:

G06F21/52

申请人:

上海二三四五网络科技有限公司

发明人:

潘巍

地址:

200137 上海市浦东新区杨高北路528号14幢3A35室

优先权:

专利代理机构:

北京德恒律师事务所 11306

代理人:

张建山

PDF下载: PDF下载
内容摘要

本发明提供一种拦截动态库注入的方法,包括监测本程序进程中的目标函数;以及,前置处理如下步骤:若所述目标函数被系统动态库调用、且传入外部动态库的文件名与预置文件名匹配,则拒绝调用所述目标函数。通过本发明提供的技术方案,可以防止外部程序将含有可执行代码的外部动态库注入至本程序进程中。

权利要求书

1.一种拦截动态库注入的方法,适于防止外部程序将含有可执行代码的外部动态库注
入至本程序进程,其特征在于,包括:
监测本程序进程中的目标函数;以及,前置处理如下步骤:
若所述目标函数被系统动态库调用、且传入外部动态库的文件名与预置文件名匹配,
则拒绝调用所述目标函数。
2.如权利要求1所述拦截动态库注入的方法,其特征在于,还包括:
对所述目标函数进行挂钩,或者,在所述本程序进程中对所述目标函数进行挂钩;
所述监测本程序进程中的目标函数包括:
若所述目标函数被调用,则当调用消息到达后、在调用所述目标函数前,优先执行所述
前置处理。
3.如权利要求1所述拦截动态库注入的方法,其特征在于,还包括:
若所述目标函数的调用位置位于所述系统动态库的地址,则所述目标函数被系统动态
库调用。
4.如权利要求1所述拦截动态库注入的方法,其特征在于,还包括:
获取所述系统动态库在本程序中的地址范围及所述目标函数的返回地址。
5.如权利要求4所述拦截动态库注入的方法,其特征在于,所述获取所述系统动态库在
本程序中的地址范围包括:使用GetModuleHandle系列函数获取;
获取所述目标函数的返回地址包括:使用ReturnAddress函数获取。
6.如权利要求1所述拦截动态库注入的方法,其特征在于,还包括:
写入所需要拦截的动态库文件名作为所述预置文件名。
7.如权利要求1所述拦截动态库注入的方法,其特征在于,所述目标函数是在本程序进
程中被所述系统动态库调用函数主动调用、并适于加载所述外部动态库的。
8.如权利要求7所述拦截动态库注入的方法,其特征在于,所述调用函数为
ClientLoadLibrary,所述目标函数为LoadLibraryExW。
9.如权利要求1所述拦截动态库注入的方法,其特征在于,还包括:
在拒绝调用所述目标函数后继续运行本程序。
10.如权利要求1所述拦截动态库注入的方法,其特征在于,还包括:
若所述目标函数并非被系统动态库调用和/或传入外部动态库的文件名与预置文件名
不一致,则将调用所述目标函数的请求传递至操作系统。

说明书

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

技术领域

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

背景技术

动态库注入是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
示出的流程图为可循环执行,直至本程序停止运行。

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

一种拦截动态库注入的方法.pdf_第1页
第1页 / 共10页
一种拦截动态库注入的方法.pdf_第2页
第2页 / 共10页
一种拦截动态库注入的方法.pdf_第3页
第3页 / 共10页
点击查看更多>>
资源描述

《一种拦截动态库注入的方法.pdf》由会员分享,可在线阅读,更多相关《一种拦截动态库注入的方法.pdf(10页珍藏版)》请在专利查询网上搜索。

本发明提供一种拦截动态库注入的方法,包括监测本程序进程中的目标函数;以及,前置处理如下步骤:若所述目标函数被系统动态库调用、且传入外部动态库的文件名与预置文件名匹配,则拒绝调用所述目标函数。通过本发明提供的技术方案,可以防止外部程序将含有可执行代码的外部动态库注入至本程序进程中。。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 >


copyright@ 2017-2020 zhuanlichaxun.net网站版权所有
经营许可证编号:粤ICP备2021068784号-1