首页> 中国专利> 一种将多DLL注入目标进程的优化管理方法

一种将多DLL注入目标进程的优化管理方法

摘要

本发明公开了一种将多DLL注入目标进程的优化管理方法,该方法是在内核空间中利用APC机制插入一个APC函数,在将注入执行DLL注入到目标进程中时,另外增加对注入DLL的优化管理,特别对目标进程需要注入多个DLL的情况下,通过统一注入拦截机制,统一注入DLL管理模块,提高目标进程稳定性和拦截函数的整体执行效率。本发明的技术方案具有控制全面、灵活性高的优点,可以注入任意个数的DLL,特别是在存在多注入HookDLL的情况下,可以明显提高目标进程的稳定性和效率;采用注入控制DLL模块(ControlDLL模块),有效地管理了多HookDLL的执行顺序,灵活多变,可以适应多种场所。

著录项

  • 公开/公告号CN106406852A

    专利类型发明专利

  • 公开/公告日2017-02-15

    原文格式PDF

  • 申请/专利权人 北京北信源软件股份有限公司;

    申请/专利号CN201610728521.8

  • 发明设计人 顾德仲;毕永东;程志远;孙毅;

    申请日2016-08-25

  • 分类号G06F9/44;

  • 代理机构北京东正专利代理事务所(普通合伙);

  • 代理人刘瑜冬

  • 地址 100081 北京市海淀区中关村南大街34号中关村科技发展大厦C座1602室

  • 入库时间 2023-06-19 01:32:41

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2019-10-01

    授权

    授权

  • 2017-03-15

    实质审查的生效 IPC(主分类):G06F9/44 申请日:20160825

    实质审查的生效

  • 2017-02-15

    公开

    公开

说明书

技术领域

本发明申请属于计算机操作系统中DLL注入技术,更为具体来说是一种将多DLL注入目标进程的优化管理方法,以实现目标进程注入的高稳定性和高效率。

背景技术

随着WINDOWS应用的飞速发展,WINDOWSAPI编程得到了普及和应用,为了更好地收集一些系统运行时的数据,可以通过HOOKAPI(HOOK Application ProgrammingInterface,具有钩子功能的应用程序编程接口)的方式对系统在应用层的程序进行HOOK(钩子)处理以拦截需要的数据,或者对已有功能进行增强。目前,通过HOOK API拦截需要的数据时,首先需要将编写有可实现功能的DLL(DynamicLinkLibrary,动态链接库)注入到被HOOK的目标进程中。

DLL注入技术的目的是实现应用程序主动跨越进程边界访问其他进程的数据,从而控制目标进程的行为。它的用途很广泛,这主要体现在:(1)你要操纵的对象涉及的数据不在自身进程内;(2)你想对目标进程中的系统函数进行拦截;(3)你想编写一些函数用于增强或增加目标进程功能;(4)隐藏自己的程序(将自己程序的主要功能注入到其他进程运行,本身的进程退出);从以上列举的用途不难看出,DLL注入技术不仅可以用来搞破坏,如果我们使用得当,它将成为我们控制目标进程的一个强大的武器。

目前各大安全厂商所使用的主流DLL注入技术主要分为以下几类:(1)通过DLL劫持,缺点是重启电脑以后才能生效;(2)使用注册表注入DLL,缺点是只能注入那些使用了user32.dll的进程,并且不能动态撤销,只能跟随系统启动和关闭;(3)使用windows挂钩来注入DLL,缺点是只能控制窗口类消息;(4)使用木马DLL来注入DLL,缺点是编程难度大、工作量大;(5)使用导入表注入DLL,缺点是不够灵活,必须先定好注入DLL的名称,写入导入表中;(6)在内核空间中利用APC机制(Asynchronous Procedure Calls,异步过程调用)插入一个APC函数,将注入执行DLL注入到目标进程中,缺点是缺少对多注入DLL注入管理,当存在多个注入DLL,同时需要注入目标进程的情况下,目标进程的稳定性和效率受影响较大。当注入目标进程存在多个注入DLL,而且同时拦截相同API的时候,每个DLL都会拦截目标进程的此个API,增加了系统执行地址的多次跳转,多次拦截严重影响目标进程的执行效率,另外多次的拦截极有可能导致目标进程崩溃。

发明内容

本申请的技术方案要解决的技术问题是提供一种能够及时生效、不受进程类型限制、可以动态加载和撤销、控制全面、注入灵活、且工作量小的将任意数目的DLL注入目标进程的方法和系统。另外高效地管理目标进程中注入DLL的管理,特别提高了注入多DLL的时候,目标进程的稳定性和效率,增加对多注入DLL的统一管理,优化和节省目标进程资源。针对多注入DLL的情况,将拦截动作进行统一的封装和管理,提高目标进程的稳定性和效率,灵活高效。

实现上述发明目的技术方案为:一种将多DLL注入目标进程的优化管理方法,该方法包括步骤如下:(1)设置用于监测操作系统中程序启动的内核DLL注入模块(SysDLL模块),将SysDLL注入模块注册到操作系统中,当有需要注入的目标进程向操作系统请求启动时,操作系统将该请求通知SysDLL注入模块,SysDLL模块获取目标进程的基地址,通过基地址找到保存ShellCode的地址空间,将ShellCode的执行体写入地址空间,这里的操作系统主要是视窗操作系统,目标进程的启动和注入请求的通知采用同步机制实现;(2)通过QueueUserAPC函数,向目标进程的每一个线程都插入APC函数(Asynchronous ProcedureCalls,异步过程调用),该APC函数的过程函数是ShellCode的执行体,该过程函数的参数是注入执行DLL模块(InjectDLL模块)的路径字符串,将InjectDLL模块注入到目标进程导入表中,这里在将InjectDLL模块注入到目标进程导入表之前,目标进程中的线程产生异步中断时,注册的APC函数得到调用,InjectDLL模块被目标进程加载(3)用户通过注入控制DLL模块(ControlDLL模块)向InjectDLL发送要注入目标DLL(HookDLL)的注入和卸载消息,这里的注入目标DLL是多个DLL,InjectDLL模块收到消息后进行统一决策,最终决定加载或者卸载用户要求操作的HookDLL;(4)用户注入的HookDLL模块开始启动拦截操作时,通过调用ControlDLL模块,向InjectDLL模块通知需要拦截的API及针对此API的控制类型;(5)InjectDLL模块根据此HookDLL模块拦截API信息内容,并根据ControlDLL模块对控制类型的优先级别,将HookDLL模块对API的拦截返回地址保存到数据结构表中,并更新到此拦截API的Hook处理表模块中;(6)当目标进程发生了API动作时,InjectDLL模块根据数据结构表,通过拦截API的Hook处理表模块分别将拦截地址信息,根据保存的数据结构表分别传递给各个HookDLL模块进行分析处理;(7)拦截API地址的操作结束后,统一由InjectDLL根据返回系统的API函数执行;上述内核DLL注入模块(SysDLL模块)为内核驱动程序,注入目标DLL模块(HookDLL模块)、注入执行DLL模块(InjectDLL模块)及注入控制DLL模块(ControlDLL模块)均为用户态下的DLL程序。

上述步骤(6)中的Hook处理表模块的形成过程是:针对每个要拦截的API函数,InjectDLL只拦截一次,后面多个其他HookDLL需要拦截此同一个API的时候,InjectDLL通过一个数据结构顺序保存多个HookDLL对此API拦截的返回地址从而形成每个拦截API的Hook处理表模块,在InjectDLL模块根据数据结构表通过拦截API的Hook处理表模块分别将拦截地址信息后,还将地址返回原来的API1Function执行,各个HookDLL模块进行分析处理是HookDLL异步处理,各自的逻辑不受影响。

在完成注入操作实现目的后,如果用户需要卸载某个HookDLL时,用户进程通过ControlDLL模块通知InjectDLL模块卸载某个HookDLL,InjectDLL模块收到后执行卸载操作,并刷新每个API拦截的数据结构表,将此HookDLL从数据结构表中清除。

上述注入、写在管理过程中,ControlDLL模块与InjectDLL模块间通信方式采用的是全局共享内存的方法;被InjectDLL模块注入的目标进程默认为所有非系统关键进程,以防止影响系统正常运行。

本发明的技术方案具有以下优点:首先是具有控制全面、灵活性高等优点,可以注入任意个数的DLL;其次,采用注入执行DLL模块(InjectDLL模块)来拦截目标进程的API函数,相比其他由各个Hook去拦截的方法,在存在多注入HookDLL的情况下,可以明显提高目标进程的稳定性和效率;再次,采用注入控制DLL模块(ControlDLL模块),有效地管理了多HookDLL的执行顺序,灵活多变,可以适应多种场所;另外,此方案可应用于安全桌面技术,能够适应多种常用的操作系统,包括WindowsXP、WindowsServer2003、Windows7、Windows8、Windows10等。极大地提高了目标进程的稳定性和拦截函数执行的效率,应用前景十分广泛。

附图说明

图1是SysDLL模块、InjectDLL模块、ControlDLL模块实现加载多个HookDLL的原理图;

图2是本发明的技术方案实现函数拦截的原理图。

具体实施方式

为更清楚说明本发明技术方案,下面具体进行介绍。

首先设置用于监测操作系统中程序启动的内核DLL注入模块(SysDLL模块),将SysDLL模块注册到操作系统中,当有需要注入的目标进程向操作系统请求启动时,操作系统将该请求通知SysDLL模块,SysDLL模块获取目标进程的基地址,通过基地址找到保存ShellCode的地址空间,将ShellCode的执行体写入地址空间,通过QueueUserAPC函数,向该进程的每一个线程都插入一个APC,每个线程都插入APC可以保证每个进程都可以顺利执行,然后把ShellCode的执行体作为APC函数的过程函数,把注入执行DLL模块(InjectDLL模块)的路径字符串作为过程函数的参数,将InjectDLL模块注入到目标进程导入表中。

用户通过统一提供的注入控制DLL模块(ControlDLL模块)向InjectDLL发送要注入目标DLL(HookDLL)的注入和卸载消息,InjectDLL模块收到消息后进行统一决策,最终决定加载或者卸载用户要求操作的HookDLL。

HookDLL注入目标进程后,对目标进程API函数的拦截,并不分别拦截目标进程的拦截API,而是调用ControlDLL,通知InjectDLL需要拦截目标进程的那个API,由InjectDLL一个模块来拦截,针对每个要拦截的API函数,InjectDLL只拦截一次,后面多个其他HookDLL需要拦截此同一个API的时候,InjectDLL通过一个数据结构顺序保存多个HookDLL对此API拦截的返回地址,形成每个拦截API的Hook处理表模块。

拦截操作功能过程中,InjectDLL模块负责对目标API的拦截,拦截到信息后传递给每个拦截API的Hook处理表模块,API的Hook处理表模块负责传递给每个HookDLL的函数处理地址进行处理。每个HookDLL不进行函数地址的传递,由InjectDLL模块统一传递。

另外,每个HookDLL,将对每个API拦截请求类型,通过ControlDLL模块通知InjectDLL模块,InjectDLL模块根据ControlDLL模块的要求,调整对每个HookDLL对API拦截返回地址的顺序,优化每个拦截API的Hook处理表模块,传递给每个HookDLL函数地址的顺序,提高处理效率。

其具体过程可以细分为如下步骤:

(1)进程向操作系统请求启动;

(2)操作系统收到目标进程启动请求,将该启动请求通知SysDLL模块;

(3)SysDLL模块获取目标进程的基地址,找到可保存ShellCode的地址空间,将ShellCode和相关参数写入该地址空间中;

(4)SysDLL模块通过QueueUserAPC函数插入一个APC,将写入的ShellCode函数作为APC函数的过程函数;

(5)当目标进程中的线程产生异步中断时,注册的APC函数得到调用,InjectDLL模块被加载进入该进程中,完成了InjectDLL的加载注入工作;

(6)用户需要注入自己的HookDLL模块时,通过调用ControlDLL模块,向InjectDLL模块通知用户要注入的HookDLL模块的注入信息;

(7)InjectDLL模块比对此个HookDLL模块的注入信息内容及请求,执行相应的加载或卸载动作;

(8)用户注入的HookDLL模块开始启动拦截操作时,通过调用ControlDLL模块,向InjectDLL模块通知需要拦截的API及针对此API的控制类型;

(9)InjectDLL模块根据此HookDLL模块拦截API信息内容,并且根据ControlDLL模块对控制类型的优先级别,将此HookDLL模块对此API的拦截返回地址保存到一个数据结构表中,更新到此拦截API的Hook处理表模块中;

(10)当目标进程发生了此API动作的时候,InjectDLL模块根据数据结构表,通过此拦截API的Hook处理表模块分别将拦截地址信息,根据保存的数据结构表分别传递给各个HookDLL模块进行分析处理。

(11)拦截API地址的操作结束后,统一由InjectDLL根据返回系统的API函数执行。

如图1是SysDLL模块、InjectDLL模块、ControlDLL模块实现加载多个HookDLL的原理图;在内核空间中利用APC机制插入一个APC函数,将InjectDLL模块注入到目标进程中,用户需要注入各自的HookDLL模块时,不需要各自注入HookDLL模块,而是通过ControlDLL模块通知InjectDLL模块加载各自的HookDLL模块信息,InjectDLL模块将HookDLL加载到目标进程中。InjectDLL已经存在于目标进程中,InjectDLL可以加载任何HookDLL到目标进程中,灵活性高、稳定度高。

图2是本发明的技术方案实现函数拦截的原理图。当用户需要HookDLL模块去拦截某个目标进程的API函数时,不需要各自的HoolDLL模块执行拦截动作,而是通过ControlDLL模块将需要拦截的API函数及控制类型通知InjectDLL模块,对函数的拦截只有InjectDLL去拦截,常规拦截方式分别有各个HookDLL模块分别拦截,对于多DLL注入的情况,多个DLL分别拦截,严重影响了目标函数执行的效率。InjectDLL拦截到API1Function函数执行地址及参数,将拦截到的参数信息传递给HookDLL处理函数地址数据结构表模块,进行处理,根据ControlDLL要求返回执行结果后,根据执行结果决定是拦截此操作、还是传递给API1Function继续执行。

常见的安全厂商拦截常规API信息,并不对结果进行拦截,阻止函数执行。对于这种情况,InjectDLL将获取函数的信息传递给HookDLL拦截的API处理函数地址数据结构表后,及时将地址返回原来的API1Function执行,极大地提高了目标进程执行的效率。InjectDLL将获取函数的信息传递给HookDLL拦截的API处理函数地址数据结构表,顺序地将信息传递给每个HookDLL的处理函数,各个HookDLL异步处理各自的逻辑互不影响。

对于多个HookDLL中,存在拦截到目标进程的某个API,根据自己的检测逻辑,有可能要禁止此API的动作,例如U盘拷贝禁止,如果存在拷贝动作,HookDLL检测到拷贝的路径是U盘,则阻止拷贝。对于这种情况,InjectDLL将获取函数的信息传递给HookDLL拦截的API处理函数地址数据结构表,首先顺序地将信息传递给那些不需要禁止此API的每个HookDLL的处理函数,这部分HookDLL处理各自的逻辑互不影响。然后将此部分信息传递给有可能要禁止此API的各个HookDLL,这部分HookDLL处理各自的逻辑互不影响,并将判断结果反馈给InjectDLL模块,如果存在需要禁止此API的行为,则InjectDLL模块将禁止目标进程继续执行此API,如果没有需要禁止此API的行为,InjectDLL模块将地址返回原来API继续执行。

以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明实质内容上所作的任何修改、等同替换和简单改进等,均应包含在本发明的保护范围之内。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号