【发明授权】一种将多DLL注入目标进程的优化管理方法_北京北信源软件股份有限公司_201610728521.8 

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

申请日:2016-08-25

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

公开(公告)日:2019-10-01

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

公开(公告)号:CN106406852B

代理人:刘瑜冬

主分类号:G06F9/445(20180101)

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

分类号:G06F9/445(20180101);G06F9/448(20180101)

优先权:

专利状态码:有效-授权

法律状态:2019.10.01#授权;2017.03.15#实质审查的生效;2017.02.15#公开

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

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

全文数据:一种将多DLL注入目标进程的优化管理方法技术领域本发明申请属于计算机操作系统中DLL注入技术,更为具体来说是一种将多DLL注入目标进程的优化管理方法,以实现目标进程注入的高稳定性和高效率。背景技术随着WINDOWS应用的飞速发展,WINDOWSAPI编程得到了普及和应用,为了更好地收集一些系统运行时的数据,可以通过HOOKAPIHOOKApplicationProgrammingInterface,具有钩子功能的应用程序编程接口的方式对系统在应用层的程序进行HOOK钩子处理以拦截需要的数据,或者对已有功能进行增强。目前,通过HOOKAPI拦截需要的数据时,首先需要将编写有可实现功能的DLLDynamicLinkLibrary,动态链接库注入到被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机制AsynchronousProcedureCalls,异步过程调用插入一个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函数AsynchronousProcedureCalls,异步过程调用,该APC函数的过程函数是ShellCode的执行体,该过程函数的参数是注入执行DLL模块InjectDLL模块的路径字符串,将InjectDLL模块注入到目标进程导入表中,这里在将InjectDLL模块注入到目标进程导入表之前,目标进程中的线程产生异步中断时,注册的APC函数得到调用,InjectDLL模块被目标进程加载3用户通过注入控制DLL模块ControlDLL模块向InjectDLL发送要注入目标DLLHookDLL的注入和卸载消息,这里的注入目标DLL是多个DLL,InjectDLL模块收到消息后进行统一决策,最终决定加载或者卸载用户要求操作的HookDLL;4用户注入的HookDLL模块开始启动拦截操作时,通过调用ControlDLL模块,向InjectDLL模块通知需要拦截的API及针对此API的控制类型;5InjectDLL模块根据此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发送要注入目标DLLHookDLL的注入和卸载消息,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模块;3SysDLL模块获取目标进程的基地址,找到可保存ShellCode的地址空间,将ShellCode和相关参数写入该地址空间中;4SysDLL模块通过QueueUserAPC函数插入一个APC,将写入的ShellCode函数作为APC函数的过程函数;5当目标进程中的线程产生异步中断时,注册的APC函数得到调用,InjectDLL模块被加载进入该进程中,完成了InjectDLL的加载注入工作;6用户需要注入自己的HookDLL模块时,通过调用ControlDLL模块,向InjectDLL模块通知用户要注入的HookDLL模块的注入信息;7InjectDLL模块比对此个HookDLL模块的注入信息内容及请求,执行相应的加载或卸载动作;8用户注入的HookDLL模块开始启动拦截操作时,通过调用ControlDLL模块,向InjectDLL模块通知需要拦截的API及针对此API的控制类型;9InjectDLL模块根据此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继续执行。以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明实质内容上所作的任何修改、等同替换和简单改进等,均应包含在本发明的保护范围之内。

权利要求:1.一种将多DLL注入目标进程的优化管理方法,其特征在于,该方法包括步骤如下:1设置用于监测操作系统程序启动的SysDLL注入模块,将SysDLL注入模块注册到操作系统中,当有需要注入的目标进程向操作系统请求启动时,操作系统将该请求通知SysDLL注入模块,SysDLL注入模块获取目标进程的基地址,通过基地址找到保存ShellCode的地址空间,将ShellCode的执行体写入地址空间;2通过异步过程调用函数即QueueUserAPC函数向目标进程的每一个线程都插入APC函数,该APC函数的过程函数是ShellCode的执行体,该过程函数的参数是注入执行的InjectDLL模块的路径字符串,将InjectDLL模块注入到目标进程导入表中;3用户通过注入控制的ControlDLL模块向InjectDLL模块发送要注入目标HookDLL模块的注入和卸载消息,InjectDLL模块收到消息后进行统一决策,最终决定加载或者卸载用户要求操作的HookDLL模块;4用户注入的HookDLL模块开始启动拦截操作时,通过调用ControlDLL模块向InjectDLL模块通知需要拦截的API及针对此API的控制类型;5InjectDLL模块根据HookDLL模块拦截的API信息内容,并根据ControlDLL模块对控制类型的优先级别,将HookDLL模块对API的拦截返回地址保存到数据结构表中,并更新到此拦截API的Hook处理表模块中;6当目标进程发生了API动作时,InjectDLL模块根据数据结构表,通过拦截API的Hook处理表模块将拦截地址信息分别传递给各个HookDLL模块进行分析处理;7拦截API地址的操作结束后,统一由InjectDLL模块根据返回系统的API函数执行;上述SysDLL注入模块为内核驱动程序,HookDLL模块、InjectDLL模块及ControlDLL模块均为用户态下的DLL程序。2.根据权利要求1所述的将多DLL注入目标进程的优化管理方法,其特征在于,该方法的应用环境为视窗操作系统。3.根据权利要求1所述的将多DLL注入目标进程的优化管理方法,其特征在于,步骤1中目标进程的启动和注入请求通知采用同步机制实现。4.根据权利要求1所述的将多DLL注入目标进程的优化管理方法,其特征在于,步骤2中在将InjectDLL模块注入到目标进程导入表之前,目标进程中的线程产生异步中断时,注册的APC函数得到调用,InjectDLL模块被目标进程加载。5.根据权利要求1所述的将多DLL注入目标进程的优化管理方法,其特征在于,步骤3中注入目标DLL是一个或多个DLL。6.根据权利要求1所述的将多DLL注入目标进程的优化管理方法,其特征在于,步骤6中的Hook处理表模块的形成过程是:针对每个要拦截的API函数,InjectDLL模块只拦截一次,后面多个其他HookDLL模块需要拦截此同一个API的时候,InjectDLL模块通过一个数据结构顺序保存多个HookDLL模块对此API拦截的返回地址从而形成每个拦截API的Hook处理表模块。7.根据权利要求1所述的将多DLL注入目标进程的优化管理方法,其特征在于,步骤6在InjectDLL模块根据数据结构表通过拦截API的Hook处理表模块将拦截地址信息分别返回API1Function执行。8.根据权利要求1所述的将多DLL注入目标进程的优化管理方法,其特征在于,步骤6中的各个HookDLL模块进行分析处理是HookDLL模块的异步处理,各自的逻辑不受影响。9.根据权利要求1所述的将多DLL注入目标进程的优化管理方法,其特征在于,用户需要卸载某个HookDLL模块时,用户进程通过ControlDLL模块通知InjectDLL模块卸载某个HookDLL模块,InjectDLL模块收到后执行卸载操作,并刷新每个API拦截的数据结构表,将此HookDLL模块从数据结构表中清除。10.根据权利要求1所述的将多DLL注入目标进程的优化管理方法,其特征在于,ControlDLL模块与InjectDLL模块间通信方式采用的是全局共享内存的方法;被InjectDLL模块注入的目标进程默认为所有非系统关键进程,以防止影响系统正常运行。

百度查询: 北京北信源软件股份有限公司 一种将多DLL注入目标进程的优化管理方法

vip会员权益升级
价格优惠/年费监控/专利管家/定制微网站 关闭