一种注入动态链接库文件的方法、装置及电子设备的制造方法

文档序号:10593873阅读:460来源:国知局
一种注入动态链接库文件的方法、装置及电子设备的制造方法【专利摘要】本发明的实施例公开一种注入动态链接库文件的方法、装置及电子设备,涉及文件注入技术,能够提升动态链接库文件注入的成功率。方法包括:依据接收的动态链接库文件加载请求分配进程,调用加载模块回调函数;解析加载模块回调函数,依据所述加载模块回调函数的参数获取通用导入表地址;读取通用导入表地址对应的通用导入表,从动态链接库文件加载请求包含的动态链接库文件中,提取未存储在通用导入表中的动态链接库文件;将提取的动态链接库文件写入所述通用导入表,生成更新通用表,写入至所述进程的内存空间;在所述内存空间中加载所述更新通用表中的动态链接库文件。本发明适用于对易被拦截的安全类动态链接库文件进行注入。【专利说明】一种注入动态链接库文件的方法、装置及电子设备
技术领域
[0001]本发明涉及文件注入技术,尤其涉及一种注入动态链接库文件的方法、装置及电子设备。【
背景技术
】[0002]随着计算机通信以及互联网技术的不断发展,电子设备的应用越来越普遍,例如,智能移动电话、个人数字助理、掌上电脑、笔记本电脑得到了越来越广泛的应用,电子设备中安装的应用程序(APP,Applicat1n)也越来越多,在Windows操作系统中,由于大量应用程序并不是一个完整的可执行(PE,PortableExecutable)文件,可以被分割成一个或多个相对独立的动态链接库(DLL,DynamicLinkLibrary)文件,其中,DLL文件又可称之为DLL模块,以导入表的方式放置于Windows操作系统中,并在导入表中填充该DLL文件的导出函数的地址,当执行应用程序的一个或多个应用功能(加载)时,相应的进程可以通过调用导入表,通过枚举导入表中的每一DLL文件,调用windowsLoadLibrary函数或windowsCreateRemoteThread函数完成DLL文件的自加载(注入)或远程注入。[0003]但随着应用程序提供的应用功能的不断增多,一些恶意应用程序通过捆绑在恶意应用程序中的病毒或木马,可以对用户正常的应用程序的应用功能进行恶意拦截或阻止其加载,从而给操作系统或用户带来不便以及潜在的隐患。例如,由于现有技术是通过调用windowsLoadLibrary函数或windowsCreateRemoteThread函数完成DLL文件的注入,因而,恶意应用程序通过钩住(Hook)windowsLoadLibrary函数或windowsCreateRemoteThread函数,从而在应用程序通过自加载方法(调用windowsLoadLibrary函数)或远程注入方法(调用windowsCreateRemoteThread函数)注入恶意应用程序设定的例如安全防护DLL文件、文件修复DLL文件、病毒查杀DLL文件等DLL文件时,由预先设置的钩住函数进行处理,通过返回拒绝,从而导致应用程序的DLL文件无法被注入,DLL文件的注入成功率较低,使得应用程序对应该DLL文件的应用功能失效。不仅使得电子设备失去或关闭防御病毒入侵的功能,导致用户电子设备的安全性下降,给电子设备的使用带来安全隐患,还会造成用户的物质和财富损失。目前,还没有一种有效的DLL文件注入方法,能够有效避免由于恶意应用程序的拦截而导致DLL文件无法加载的情况。因而,需要一种注入DLL文件的方法,可以采取相应的措施,保障正常应用程序的DLL文件加载不被恶意应用程序拦截,以增强电子设备操作系统的安全性。注入DLL文件的方法的技术方案如下:【
发明内容】[0004]有鉴于此,本发明实施例提供一种注入动态链接库文件的方法、装置及电子设备,能够保障应用程序的动态链接库文件加载,提升动态连接库文件的注入成功率,以解决现有的注入动态链接库文件的方法易被拦截,不能加载动态链接库文件的问题。[0005]第一方面,本发明实施例提供一种注入动态链接库文件的方法,包括:[0006]依据接收的动态链接库文件加载请求分配进程,调用记录有所述进程的加载模块回调函数;[0007]解析所述加载模块回调函数,依据所述加载模块回调函数的参数获取通用导入表地址;[0008]读取所述通用导入表地址对应的通用导入表,从所述动态链接库文件加载请求包含的动态链接库文件中,提取未存储在所述通用导入表中的动态链接库文件;[0009]将提取的动态链接库文件写入所述通用导入表,生成更新通用表,写入至所述进程的内存空间;[0010]在所述内存空间中加载所述更新通用表中的动态链接库文件。[0011]结合第一方面,在第一方面的第一种实施方式中,所述依据所述第二参数以及第三参数获取通用导入表地址包括:[0012]获取所述加载模块回调函数的参数中的进程句柄;[0013]获取所述加载模块回调函数的参数中的进程映像地址;[0014]提取所述进程映像地址中的所述进程的映射基地址;[0015]依据所述进程句柄以及所述进程的映射基地址,获取通用导入表地址。[0016]结合第一方面,在第一方面的第二种实施方式中,在所述提取未存储在所述通用导入表中的动态链接库文件之后,将提取的动态链接库文件写入所述通用导入表之前,所述方法还包括:[0017]记录提取的动态链接库文件数;[0018]依据所述通用导入表中一节点占用的存储空间,计算所述提取的动态链接库文件数与所述存储空间的乘积,得到待申请空间;[0019]调用内存分配内核函数,在所述进程的内存空间上为所述更新通用表申请包含所述待申请空间以及通用导入表空间的更新通用表空间。[0020]结合第一方面的第二种实施方式,在第一方面的第三种实施方式中,所述将提取的动态链接库文件写入所述通用导入表,生成更新通用表,写入至所述进程的内存空间包括:[0021]在所述更新通用表的所述待申请空间中,将所述提取的动态链接库文件对应的数据依序填充至结构为映像输入描述的形实转换程序节点上;[0022]在所述更新通用表的所述通用导入表空间中,将所述通用导入表中动态链接库文件对应的数据依序填充至结构为映像输入描述的形实转换程序节点上,得到更新通用表。[0023]结合第一方面,在第一方面的第四种实施方式中,在所述依据接收的动态链接库文件加载请求分配进程之前,所述方法还包括:[0024]调用影像修改设置内核函数注册所述加载模块回调函数。[0025]结合第一方面、第一方面的第一种至第四种任一实施方式,在第一方面的第五种实施方式中,在所述内存空间中加载所述更新通用表中的动态链接库文件之后,所述方法还包括:[0026]利用所述更新通用表替换所述通用导入表并利用所述更新通用表地址替换所述通用导入表地址;[0027]在所述进程退出运行时,调用预先设置的进程创建退出回调函数,调用所述通用导入表替换所述更新通用表,利用所述通用导入表地址替换所述更新通用表地址。[0028]结合第一方面的第五种实施方式,在第一方面的第六种实施方式中,调用创建进程通知设置内核函数注入所述进程创建退出回调函数。[0029]第二方面,本发明实施例提供一种注入动态链接库文件的装置,包括:回调函数调用模块、参数解析模块、文件提取模块、更新模块以及文件加载模块,其中,[0030]回调函数调用模块,用于依据接收的动态链接库文件加载请求分配进程,调用记录有所述进程的加载模块回调函数;[0031]参数解析模块,用于解析所述加载模块回调函数,依据所述加载模块回调函数的参数获取通用导入表地址;[0032]文件提取模块,用于读取所述通用导入表地址对应的通用导入表,从所述动态链接库文件加载请求包含的动态链接库文件中,提取未存储在所述通用导入表中的动态链接库文件;[0033]更新模块,用于将提取的动态链接库文件写入所述通用导入表,生成更新通用表,写入至所述进程的内存空间;[0034]文件加载模块,用于在所述内存空间中加载所述更新通用表中的动态链接库文件。[0035]结合第二方面,在第二方面的第一种实施方式中,所述参数解析模块包括:函数解析单元、进程句柄获取单元、进程映像地址获取单元、基地址提取单元以及导入表地址获取单元,其中,[0036]函数解析单元,用于解析所述加载模块回调函数;[0037]进程句柄获取单元,用于获取所述加载模块回调函数的参数中的进程句柄;[0038]进程映像地址获取单元,用于获取所述加载模块回调函数的参数中的进程映像地址;[0039]基地址提取单元,用于提取所述进程映像地址中的所述进程的映射基地址;[0040]导入表地址获取单元,用于依据所述进程句柄以及所述进程的映射基地址,获取通用导入表地址。[0041]结合第二方面,在第二方面的第二种实施方式中,所述装置还包括:记录模块以及内存申请模块,其中,[0042]记录模块,用于记录提取的动态链接库文件数;[0043]内存计算模块,用于依据所述通用导入表中一节点占用的存储空间,计算所述提取的动态链接库文件数与所述存储空间的乘积,得到待申请空间;[0044]内存申请模块,用于调用内存分配内核函数,在所述进程的内存空间上为所述更新通用表申请包含所述待申请空间以及通用导入表空间的更新通用表空间。[0045]结合第二方面的第二种实施方式,在第二方面的第三种实施方式中,所述更新模块包括:第一填充单元以及第二填充单元,其中,[0046]第一填充单元,用于在所述更新通用表的所述待申请空间中,将所述提取的动态链接库文件对应的数据依序填充至结构为映像输入描述的形实转换程序节点上;[0047]第二填充单元,用于在所述更新通用表的所述通用导入表空间中,将所述通用导入表中动态链接库文件对应的数据依序填充至结构为映像输入描述的形实转换程序节点上,得到更新通用表。[0048]结合第二方面,在第二方面的第四种实施方式中,所述装置还包括:[0049]注册模块,用于调用影像修改设置内核函数注册所述加载模块回调函数。[0050]结合第二方面、第二方面的第一种至第四种任一实施方式,在第二方面的第五种实施方式中,所述装置还包括:替换模块以及退出处理模块,其中,[0051]替换模块,用于利用所述更新通用表替换所述通用导入表并利用所述更新通用表地址替换所述通用导入表地址;[0052]退出处理模块,用于在所述进程退出运行时,调用预先设置的进程创建退出回调函数,调用所述通用导入表替换所述更新通用表,利用所述通用导入表地址替换所述更新通用表地址。[0053]结合第二方面的第五种实施方式,在第二方面的第六种实施方式中,调用创建进程通知设置内核函数注入所述进程创建退出回调函数。[0054]第三方面,本发明实施例提供一种电子设备,所述电子设备包括:壳体、处理器、存储器、电路板和电源电路,其中,电路板安置在壳体围成的空间内部,处理器和存储器设置在电路板上;电源电路,用于为上述电子设备的各个电路或器件供电;存储器用于存储可执行程序代码;处理器通过读取存储器中存储的可执行程序代码来运行与可执行程序代码对应的程序,用于执行前述任一所述的注入动态链接库文件的方法。[0055]本发明实施例提供的一种注入动态链接库文件的方法、装置及电子设备,通过依据接收的动态链接库文件加载请求分配进程,调用记录有所述进程的加载模块回调函数;解析所述加载模块回调函数,依据所述加载模块回调函数的参数获取通用导入表地址;读取所述通用导入表地址对应的通用导入表,从所述动态链接库文件加载请求包含的动态链接库文件中,提取未存储在所述通用导入表中的动态链接库文件;将提取的动态链接库文件写入所述通用导入表,生成更新通用表,写入至所述进程的内存空间;在所述内存空间中加载所述更新通用表中的动态链接库文件。能够保障应用程序的动态链接库文件加载,提升动态连接库文件的注入成功率,以解决现有的注入动态链接库文件的方法易被拦截,不能加载动态链接库文件的问题。【附图说明】[0056]为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其它的附图。[0057]图1为本发明的实施例一注入动态链接库文件的方法流程示意图;[0058]图2为通用导入表结构不意图;[0059]图3为更新导入表结构示意图;[0060]图4为本发明实施例二注入动态链接库文件的方法流程示意图;[0061]图5为本发明实施例三注入动态链接库文件的方法流程示意图;[0062]图6为本发明实施例四注入动态链接库文件的方法流程示意图;[0063]图7为本发明实施例五注入动态链接库文件的装置结构示意图;[0064]图8为本发明电子设备一个实施例的结构不意图。【具体实施方式】[0065]下面结合附图对本发明实施例进行详细描述。[0066]应当明确,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其它实施例,都属于本发明保护的范围。[0067]实施例一[0068]图1为本发明的实施例一注入动态链接库文件的方法流程示意图,如图1所示,本实施例的方法可以包括:[0069]步骤101,依据接收的动态链接库文件加载请求分配进程,调用记录有所述进程的加载模块回调函数;[0070]本实施例中,针对现有通过调用windowsLoadLibrary函数或windowsCreateRemoteThread函数完成DLL文件注入实现DLL文件加载,容易被一些应用程序拦截的技术问题,提供一种新的在windows内核层实现的DLL文件注入以及加载方法,以解决应用程序钩住windowsLoadLibrary函数以及windowsCreateRemoteThread函数的问题。[0071]本实施例中,操作系统接收动态链接库文件加载请求,在所述动态链接库文件加载请求中,包含有一个或多个待加载的DLL文件信息,操作系统依据动态链接库文件加载请求分配进程。[0072]步骤102,解析所述加载模块回调函数,依据所述加载模块回调函数的参数获取通用导入表地址;[0073]本实施例中,在加载模块回调函数中,第二个参数(第二参数)用于记录进程句柄,第三个参数(第三参数)用于记录进程映像地址(ImageInfo),依据第二参数和第三参数获取通用导入表地址。其中,[0074]进程映像地址为一结构地址,保存有进程的映射基地址(ImageBase),利用进程的映射基地址(ImageBase)以及进程句柄,就可得到PE文件格式的任意数据,例如,可以得到通用导入表地址(ImportDesc)。在通用导入表地址(ImportDesc)对应的通用导入表中,存储有DLL文件的名称、导出函数以及DLL文件数等信息,通用导入表地址(ImportDesc)是指向通用导入表中所有DLL文件的首地址。[0075]本实施例中,设置在通用导入表中,存储应用程序不愿进行拦截或攻击的DLL文件,因而,即使通过调用windowsLoadLibrary函数或windowsCreateRemoteThread函数完成DLL文件注入及加载后,应用程序通过钩住所述windowsLoadLibrary函数或windowsCreateRemoteThread函数,也可以避免重要的DLL文件加载被拦截。[0076]作为一可选实施例,依据第二参数以及第三参数获取通用导入表地址包括:[0077]获取所述加载模块回调函数的第二参数中的进程句柄;[0078]获取所述加载模块回调函数的第三参数中的进程映像地址;[0079]提取所述进程映像地址中的所述进程的映射基地址;[0080]依据所述进程句柄以及所述进程的映射基地址,获取通用导入表地址。[0081]步骤103,读取所述通用导入表地址对应的通用导入表,从所述动态链接库文件加载请求包含的动态链接库文件中,提取未存储在所述通用导入表中的动态链接库文件;[0082]本实施例中,如果电子设备需要运行应用程序中的特定DLL文件,例如,安全防护DLL文件、文件修复DLL文件、病毒查杀DLL文件等易被应用程序攻击的DLL文件时,通过在发起的动态链接库文件加载请求中包含相应的DLL文件,加载模块回调函数通过比对动态链接库文件加载请求中包含的DLL文件以及通用导入表中的动态链接库文件,得到未存储在所述通用导入表中的动态链接库文件。[0083]本实施例中,通用导入表包含有一个或多个形实转换程序(Thunk)节点,为一DLL文件的节点,每一Thunk节点对应一DLL文件。[0084]图2为通用导入表结构不意图。参见图2,包括多个Thunk,依据从通用导入表顶部至底部的顺序,分别记为:Thunkl、Thunk2、Thunk3、…、Thunkn。[0085]本实施例中,一Thunk节点的结构大小为一頂AGEJMPORT_DESCRIPTOR结构大小,乘以通用导入表包含的Thunk节点数,可以得到通用导入表在内存空间的大小。[0086]步骤104,将提取的动态链接库文件写入所述通用导入表,生成更新通用表,写入至所述进程的内存空间;[0087]本实施例中,作为一可选实施例,将提取的动态链接库文件写入所述通用导入表,生成更新通用表,写入至所述进程的内存空间包括:[0088]All,在所述更新通用表的待申请空间中,将所述提取的动态链接库文件对应的数据依序填充至结构为映像输入描述(IMAGEJMP0RT_DESCRIPT0R)的Thunk上;[0089]本实施例中,动态链接库文件对应的数据包括:动态链接库文件名称、导出函数以及动态链接库文件基地址等信息。即在通用导入表顶部,构建对应所述提取的动态链接库文件数的空Thunk节点,然后,将每一提取的动态链接库文件的填充数据至对应的空Thunk节点中。[0090]A12,在所述更新通用表的通用导入表空间中,将所述通用导入表中动态链接库文件对应的数据依序填充至结构为IMAGEJMP0RT_DESCRIPT0R的Thunk上,得到更新通用表。[0091]图3为更新导入表结构示意图。参见图3,在图2的基础上,还包含有提取的动态链接库文件对应的Thunk,例如,MyDLLThunk。[0092]步骤105,在所述内存空间中加载所述更新通用表中的动态链接库文件。[0093]本实施例注入动态链接库文件的方法,通过依据接收的动态链接库文件加载请求分配进程,调用记录有所述进程的加载模块回调函数;解析所述加载模块回调函数,依据所述加载模块回调函数的参数获取通用导入表地址;读取所述通用导入表地址对应的通用导入表,从所述动态链接库文件加载请求包含的动态链接库文件中,提取未存储在所述通用导入表中的动态链接库文件;将提取的动态链接库文件写入所述通用导入表,生成更新通用表,写入至所述进程的内存空间;在所述内存空间中加载所述更新通用表中的动态链接库文件。这样,提出新的动态链接库注入方法,无需调用windowsLoadLibrary函数或windowsCreateRemoteThread函数完成DLL文件注入实现DLL文件加载,而是在内核层利用加载模块回调函数实现动态链接库文件的注入,有利于动态链接库的加载不被预先设置的应用程序拦截,有助保障正常应用程序的DLL文件加载,有利于维护操作系统安全,增强电子设备操作系统的安全性,从而能够/解决现有电子设备操作系统的安全性较低的技术问题。[0094]实施例二[0095]图4为本发明实施例二注入动态链接库文件的方法流程示意图,如图4所示,本实施例的方法可以包括:[0096]步骤401,调用影像修改设置内核函数注册所述加载模块回调函数。[0097]本实施例中,作为一可选实施例,影像修改设置内核函数为PsSetLoadImageNotifyRoutine内核函数。[0098]本实施例中,在进程加载DLL文件前调用加载模块回调函数,加载模块回调函数用于修改进程的通用导入表,在进程启动时,将新增DLL文件的信息节点写入通用导入表,从而实现特定DLL文件的注入及加载。[0099]步骤402,依据接收的动态链接库文件加载请求分配进程,调用记录有所述进程的加载模块回调函数;[0100]步骤403,解析所述加载模块回调函数,依据所述加载模块回调函数的参数获取通用导入表地址;[0101]步骤404,读取所述通用导入表地址对应的通用导入表,从所述动态链接库文件加载请求包含的动态链接库文件中,提取未存储在所述通用导入表中的动态链接库文件;[0102]步骤405,将提取的动态链接库文件写入所述通用导入表,生成更新通用表,写入至所述进程的内存空间;[0103]步骤406,在所述内存空间中加载所述更新通用表中的动态链接库文件。[0104]本实施例中,步骤402至步骤406的过程分别和上述方法实施例一的步骤101至步骤105类似,此处不再赘述。[0105]本实施例中,调用PsSetLoadImageNotifyRoutine内核函数注册所述加载模块回调函数,明确了加载模块回调函数的注册过程。[0106]实施例三[0107]图5为本发明实施例三注入动态链接库文件的方法流程示意图,如图5所示,本实施例的方法可以包括:[0108]步骤501,依据接收的动态链接库文件加载请求分配进程,调用记录有所述进程的加载模块回调函数;[0109]步骤502,解析所述加载模块回调函数,依据所述加载模块回调函数的参数获取通用导入表地址;[0110]步骤503,读取所述通用导入表地址对应的通用导入表,从所述动态链接库文件加载请求包含的动态链接库文件中,提取未存储在所述通用导入表中的动态链接库文件;[0111]本实施例中,步骤501至步骤503的过程分别和上述方法实施例一的步骤101至步骤103类似,此处不再赘述。[0112]步骤504,记录提取的动态链接库文件数;[0113]步骤505,依据所述通用导入表中一Thunk节点占用的存储空间,计算所述提取的动态链接库文件数与所述存储空间的乘积,得到待申请空间;[0114]步骤506,调用内存分配内核函数,在所述进程的内存空间上为所述更新通用表申请包含所述待申请空间以及通用导入表空间的更新通用表空间;[0115]本实施例中,内存分配内核函数为ZwAl1cateVirtualMemory内核函数,每一Thunk节点占用的存储空间为頂AGEJMP0RT_DESCRIPT0R结构大小。将通用导入表占用的原有空间加上新增加的待申请空间,可以得到更新通用表在注入提取的动态链接库文件后所需的内存空间大小,申请的更新通用表空间为待申请空间以及通用导入表空间的和。[0116]本实施例中,作为一可选实施例,将提取的动态链接库文件写入所述通用导入表的顶部,生成更新通用表。当然,实际应用中,也可以将提取的动态链接库文件写入所述通用导入表的其他位置。[0117]步骤507,将提取的动态链接库文件写入所述通用导入表,生成更新通用表,写入至所述进程的内存空间;[0118]步骤508,在所述内存空间中加载所述更新通用表中的动态链接库文件。[0119]本实施例中,步骤507至步骤508的过程分别和上述方法实施例一的步骤104至步骤105类似,此处不再赘述。[0120]本实施例,通过记录提取的动态链接库文件数;依据所述通用导入表中一节点占用的存储空间,计算所述提取的动态链接库文件数与所述存储空间的乘积,得到待申请空间;调用ZwAl1cateVirtualMemory内核函数,在所述进程的内存空间上为所述更新通用表申请包含所述待申请空间以及通用导入表空间的更新通用表空间,可以达到更新通用导入表的效果。[0121]实施例四[0122]图6为本发明实施例四注入动态链接库文件的方法的流程示意图,如图6所示,本实施例的方法可以包括:[0123]步骤601,依据接收的动态链接库文件加载请求分配进程,调用记录有所述进程的加载模块回调函数;[0124]步骤602,解析所述加载模块回调函数,依据所述加载模块回调函数的参数获取通用导入表地址;[0125]步骤603,读取所述通用导入表地址对应的通用导入表,从所述动态链接库文件加载请求包含的动态链接库文件中,提取未存储在所述通用导入表中的动态链接库文件;[0126]步骤604,将提取的动态链接库文件写入所述通用导入表,生成更新通用表,写入至所述进程的内存空间;[0127]步骤605,在所述内存空间中加载所述更新通用表中的动态链接库文件;[0128]本实施例中,步骤601至步骤605的过程分别和上述方法实施例一的步骤101至步骤105类似,此处不再赘述[0129]步骤606,利用所述更新通用表替换所述通用导入表并利用所述更新通用表地址替换所述通用导入表地址;[0?3O]本实施例中,利用新的更新导入表的ImpοrtDesc替换旧的通用导入表的ImportDesc,将动态链接库文件总数增加I即可实现增加一MyDLL(动态链接库文件)的注入。[0131]步骤607,在所述进程退出运行时,调用预先设置的进程创建退出回调函数,调用所述通用导入表替换所述更新通用表,利用所述通用导入表地址替换所述更新通用表地址。[0132]本实施例中,由于动态链接库文件注入是不经过现有API函数(windowsLoadLibrary函数或windowsCreateRemoteThread函数)实现的,是自主通过加载模块回调函数实现动态链接库文件的注入,因而,操作系统并不知晓进程多了一个或多个动态链接库文件(模块),故在进程退出时,还需要应用程序自行卸载该动态链接库文件(模块)。[0133]本实施例中,作为一可选实施例,进程创建退出回调函数为CreateProcessCalIback函数。[0134]本实施例中,在进程创建或者退出时,通过调用063七6?1'006880&1]^301^函数,删除更新导入表中新增加的动态链接库文件,并利用通用导入表的ImportDesc地址替换更新通用表的ImportDesc地址,将动态链接库文件总数减少I,从而实现动态链接库文件的卸载。[0135]作为一可选实施例,调用创建进程通知设置内核函数注入所述进程创建退出回调函数。其中,作为一可选实施例,创建进程通知设置内核函数为PsSetCreateProcessNotifyRoutine内核函数。[0136]本实施例,通过利用所述更新通用表替换所述通用导入表并利用所述更新通用表地址替换所述通用导入表地址;在所述进程退出运行时,调用预先设置的进程创建退出回调函数,调用所述通用导入表替换所述更新通用表,利用所述通用导入表地址替换所述更新通用表地址。可以实现动态链接库文件的卸载效果。[0137]实施例五[0138]图7为本发明的实施例五注入动态链接库文件的装置结构示意图,如图7所示,本实施例的装置可以包括:回调函数调用模块71、参数解析模块72、文件提取模块73、更新模块74以及文件加载模块75,其中,[0139]回调函数调用模块71,用于依据接收的动态链接库文件加载请求分配进程,调用记录有所述进程的加载模块回调函数;[0140]本实施例中,操作系统接收动态链接库文件加载请求,在所述动态链接库文件加载请求中,包含有一个或多个待加载的DLL文件信息,操作系统依据动态链接库文件加载请求分配进程。[0141]参数解析模块72,用于解析所述加载模块回调函数,依据所述加载模块回调函数的参数获取通用导入表地址;[0142]本实施例中,在加载模块回调函数中,第二参数用于记录进程句柄,第三参数用于记录进程映像地址(ImageInfo)。其中,[0?43]进程映像地址为一结构地址,保存有进程的ImageBase,利用进程的ImageBase以及进程句柄,可以得到ImportDesc。在ImportDesc对应的通用导入表中,存储有DLL文件的名称、导出函数以及DLL文件数等信息,ImportDesc是指向通用导入表中所有DLL文件的首地址。[0144]本实施例中,作为一可选实施例,参数解析模块72包括:函数解析单元、进程句柄获取单元、进程映像地址获取单元、基地址提取单元以及导入表地址获取单元(图中未示出),其中,[0145]函数解析单元,用于解析所述加载模块回调函数;[0146]进程句柄获取单元,用于获取所述加载模块回调函数的参数中的进程句柄;[0147]进程映像地址获取单元,用于获取所述加载模块回调函数的参数中的进程映像地址;[0148]基地址提取单元,用于提取所述进程映像地址中的所述进程的映射基地址;[0149]导入表地址获取单元,用于依据所述进程句柄以及所述进程的映射基地址,获取通用导入表地址。[0150]文件提取模块73,用于读取所述通用导入表地址对应的通用导入表,从所述动态链接库文件加载请求包含的动态链接库文件中,提取未存储在所述通用导入表中的动态链接库文件;[0151]本实施例中,加载模块回调函数通过比对动态链接库文件加载请求中包含的DLL文件以及通用导入表中的动态链接库文件,得到未存储在所述通用导入表中的动态链接库文件。[0152]本实施例中,通用导入表包含有一个或多个Thunk节点,为一DLL文件的节点,每一Thunk节点对应一DLL文件。[0153]更新模块74,用于将提取的动态链接库文件写入所述通用导入表,生成更新通用表,写入至所述进程的内存空间;[0154]本实施例中,作为一可选实施例,更新模块74包括:第一填充单元以及第二填充单元(图中未示出),其中,[0155]第一填充单元,用于在所述更新通用表的所述待申请空间中,将所述提取的动态链接库文件对应的数据依序填充至结构为映像输入描述的形实转换程序节点上;[0156]第二填充单元,用于在所述更新通用表的所述通用导入表空间中,将所述通用导入表中动态链接库文件对应的数据依序填充至结构为映像输入描述的形实转换程序节点上,得到更新通用表。[0157]本实施例中,动态链接库文件对应的数据包括:动态链接库文件名称、导出函数以及动态链接库文件基地址等信息。[0158]文件加载模块75,用于在所述内存空间中加载所述更新通用表中的动态链接库文件。[0159]本实施例中,作为一可选实施例,该装置还包括:[0160]注册模块76,用于调用影像修改设置内核函数注册所述加载模块回调函数。[0161]本实施例中,作为一可选实施例,影像修改设置内核函数为PsSetLoadImageNotifyRoutine内核函数。[0162]作为另一可选实施例,该装置还包括:记录模块77、内存计算模块78以及内存申请模块79,其中,[0163]记录模块77,用于记录提取的动态链接库文件数;[0164]内存计算模块78,用于依据所述通用导入表中一节点占用的存储空间,计算所述提取的动态链接库文件数与所述存储空间的乘积,得到待申请空间;[0165]内存申请模块79,用于调用内存分配内核函数,在所述进程的内存空间上为所述更新通用表申请包含所述待申请空间以及通用导入表空间的更新通用表空间。[0166]本实施例中,内存分配内核函数为ZwAl1cateVirtualMemory内核函数,每一节点占用的存储空间为頂AGEJMP0RT_DESCRIPT0R结构大小,申请的更新通用表空间为待申请空间以及通用导入表空间的和。[0167]作为再一可选实施例,该装置还包括:替换模块70以及退出处理模块80,其中,[0168]替换模块70,用于利用所述更新通用表替换所述通用导入表并利用所述更新通用表地址替换所述通用导入表地址;[0169]退出处理模块80,用于在所述进程退出运行时,调用预先设置的进程创建退出回调函数,调用所述通用导入表替换所述更新通用表,利用所述通用导入表地址替换所述更新通用表地址。[0170]本实施例中,作为一可选实施例,调用创建进程通知设置内核函数注入所述进程创建退出回调函数。其中,创建进程通知设置内核函数为PsSetCreateProcessNotifyRoutine内核函数,进程创建退出回调函数为CreateProcessCalIback函数。[0171]本实施例的装置,可以用于执行图1至图6所示方法实施例的技术方案,其实现原理和技术效果类似,此处不再赘述。[0172]需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。[0173]本说明书中的各个实施例均采用相关的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。[0174]尤其,对于装置实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。[0175]在流程图中表示或在此以其他方式描述的逻辑和/或步骤,例如,可以被认为是用于实现逻辑功能的可执行指令的定序列表,可以具体实现在任何计算机可读介质中,以供指令执行系统、装置或设备(如基于计算机的系统、包括处理器的系统或其他可以从指令执行系统、装置或设备取指令并执行指令的系统)使用,或结合这些指令执行系统、装置或设备而使用。就本说明书而言,〃计算机可读介质〃可以是任何可以包含、存储、通信、传播或传输程序以供指令执行系统、装置或设备或结合这些指令执行系统、装置或设备而使用的装置。计算机可读介质的更具体的示例(非穷尽性列表)包括以下:具有一个或多个布线的电连接部(电子装置),便携式计算机盘盒(磁装置),随机存取存储器(RAM),只读存储器(ROM),可擦除可编辑只读存储器(EPR0M或闪速存储器),光纤装置,以及便携式光盘只读存储器(CDR0M)。另外,计算机可读介质甚至可以是可在其上打印所述程序的纸或其他合适的介质,因为可以例如通过对纸或其他介质进行光学扫描,接着进行编辑、解译或必要时以其他合适方式进行处理来以电子方式获得所述程序,然后将其存储在计算机存储器中。[0176]应当理解,本发明的各部分可以用硬件、软件、固件或它们的组合来实现。[0177]在上述实施方式中,多个步骤或方法可以用存储在存储器中且由合适的指令执行系统执行的软件或固件来实现。例如,如果用硬件来实现,和在另一实施方式中一样,可用本领域公知的下列技术中的任一项或他们的组合来实现:具有用于对数据信号实现逻辑功能的逻辑门电路的离散逻辑电路,具有合适的组合逻辑门电路的专用集成电路,可编程门阵列(PGA),现场可编程门阵列(FPGA)等。[0178]本发明实施例还提供一种电子设备,所述电子设备包含前述任一实施例所述的装置。[0179]图8为本发明电子设备一个实施例的结构示意图,可以实现本发明图1-7所示实施例的流程,如图8所示,上述电子设备可以包括:壳体81、处理器82、存储器83、电路板84和电源电路85,其中,电路板84安置在壳体81围成的空间内部,处理器82和存储器83设置在电路板84上;电源电路85,用于为上述电子设备的各个电路或器件供电;存储器83用于存储可执行程序代码;处理器82通过读取存储器83中存储的可执行程序代码来运行与可执行程序代码对应的程序,用于执行前述任一实施例所述的注入动态链接库文件的方法。[0180]处理器82对上述步骤的具体执行过程以及处理器82通过运行可执行程序代码来进一步执行的步骤,可以参见本发明图1-6所示实施例的描述,在此不再赘述。[0181]该电子设备以多种形式存在,包括但不限于:[0182](I)移动通信设备:这类设备的特点是具备移动通信功能,并且以提供话音、数据通信为主要目标。这类终端包括:智能手机(例如iPhone)、多媒体手机、功能性手机,以及低端手机等。[0183](2)超移动个人计算机设备:这类设备属于个人计算机的范畴,有计算和处理功能,一般也具备移动上网特性。这类终端包括:PDA、MID和UMPC设备等,例如iPad。[0184](3)便携式娱乐设备:这类设备可以显示和播放多媒体内容。该类设备包括:音频、视频播放器(例如iPod),掌上游戏机,电子书,以及智能玩具和便携式车载导航设备。[0185](4)服务器:提供计算服务的设备,服务器的构成包括处理器、硬盘、内存、系统总线等,服务器和通用的计算机架构类似,但是由于需要提供高可靠的服务,因此在处理能力、稳定性、可靠性、安全性、可扩展性、可管理性等方面要求较高。[0186](5)其他具有数据交互功能的电子设备。[0187]本
技术领域
的普通技术人员可以理解实现上述实施例方法携带的全部或部分步骤是可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,该程序在执行时,包括方法实施例的步骤之一或其组合。[0188]为了描述的方便,描述以上装置是以功能分为各种单元/模块分别描述。当然,在实施本发明时可以把各单元/模块的功能在同一个或多个软件和/或硬件中实现。[0189]通过以上的实施方式的描述可知,本领域的技术人员可以清楚地了解到本[0190]发明可借助软件加必需的通用硬件平台的方式来实现。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在存储介质中,如R0M/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例或者实施例的某些部分所述的方法。[0191]以上所述,仅为本发明的【具体实施方式】,但本发明的保护范围并不局限于此,任何熟悉本
技术领域
的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以权利要求的保护范围为准。【主权项】1.一种注入动态链接库文件的方法,其特征在于,包括:依据接收的动态链接库文件加载请求分配进程,调用记录有所述进程的加载模块回调函数;解析所述加载模块回调函数,依据所述加载模块回调函数的参数获取通用导入表地址;读取所述通用导入表地址对应的通用导入表,从所述动态链接库文件加载请求包含的动态链接库文件中,提取未存储在所述通用导入表中的动态链接库文件;将提取的动态链接库文件写入所述通用导入表,生成更新通用表,写入至所述进程的内存空间;在所述内存空间中加载所述更新通用表中的动态链接库文件。2.根据权利要求1所述的注入动态链接库文件的方法,其特征在于,所述依据所述加载模块回调函数的参数获取通用导入表地址包括:获取所述加载模块回调函数的参数中的进程句柄;获取所述加载模块回调函数的参数中的进程映像地址;提取所述进程映像地址中的所述进程的映射基地址;依据所述进程句柄以及所述进程的映射基地址,获取通用导入表地址。3.根据权利要求1所述的注入动态链接库文件的方法,其特征在于,在所述提取未存储在所述通用导入表中的动态链接库文件之后,将提取的动态链接库文件写入所述通用导入表之前,所述方法还包括:记录提取的动态链接库文件数;依据所述通用导入表中一节点占用的存储空间,计算所述提取的动态链接库文件数与所述存储空间的乘积,得到待申请空间;调用内存分配内核函数,在所述进程的内存空间上为所述更新通用表申请包含所述待申请空间以及通用导入表空间的更新通用表空间。4.根据权利要求3所述的注入动态链接库文件的方法,其特征在于,所述将提取的动态链接库文件写入所述通用导入表,生成更新通用表,写入至所述进程的内存空间包括:在所述更新通用表的所述待申请空间中,将所述提取的动态链接库文件对应的数据依序填充至结构为映像输入描述的形实转换程序节点上;在所述更新通用表的所述通用导入表空间中,将所述通用导入表中动态链接库文件对应的数据依序填充至结构为映像输入描述的形实转换程序节点上,得到更新通用表。5.根据权利要求1所述的注入动态链接库文件的方法,其特征在于,在所述依据接收的动态链接库文件加载请求分配进程之前,所述方法还包括:调用影像修改设置内核函数注册所述加载模块回调函数。6.根据权利要求1至5任一项所述的注入动态链接库文件的方法,其特征在于,在所述内存空间中加载所述更新通用表中的动态链接库文件之后,所述方法还包括:利用所述更新通用表替换所述通用导入表并利用所述更新通用表地址替换所述通用导入表地址;在所述进程退出运行时,调用预先设置的进程创建退出回调函数,调用所述通用导入表替换所述更新通用表,利用所述通用导入表地址替换所述更新通用表地址。7.根据权利要求6所述的注入动态链接库文件的方法,其特征在于,调用创建进程通知设置内核函数注入所述进程创建退出回调函数。8.—种注入动态链接库文件的装置,其特征在于,包括:回调函数调用模块、参数解析模块、文件提取模块、更新模块以及文件加载模块,其中,回调函数调用模块,用于依据接收的动态链接库文件加载请求分配进程,调用记录有所述进程的加载模块回调函数;参数解析模块,用于解析所述加载模块回调函数,依据所述加载模块回调函数的参数获取通用导入表地址;文件提取模块,用于读取所述通用导入表地址对应的通用导入表,从所述动态链接库文件加载请求包含的动态链接库文件中,提取未存储在所述通用导入表中的动态链接库文件;更新模块,用于将提取的动态链接库文件写入所述通用导入表,生成更新通用表,写入至所述进程的内存空间;文件加载模块,用于在所述内存空间中加载所述更新通用表中的动态链接库文件。9.根据权利要求8所述的注入动态链接库文件的装置,其特征在于,所述参数解析模块包括:函数解析单元、进程句柄获取单元、进程映像地址获取单元、基地址提取单元以及导入表地址获取单元,其中,函数解析单元,用于解析所述加载模块回调函数;进程句柄获取单元,用于获取所述加载模块回调函数的参数中的进程句柄;进程映像地址获取单元,用于获取所述加载模块回调函数的参数中的进程映像地址;基地址提取单元,用于提取所述进程映像地址中的所述进程的映射基地址;导入表地址获取单元,用于依据所述进程句柄以及所述进程的映射基地址,获取通用导入表地址。10.根据权利要求8所述的注入动态链接库文件的装置,其特征在于,所述装置还包括:记录模块以及内存申请模块,其中,记录模块,用于记录提取的动态链接库文件数;内存计算模块,用于依据所述通用导入表中一节点占用的存储空间,计算所述提取的动态链接库文件数与所述存储空间的乘积,得到待申请空间;内存申请模块,用于调用内存分配内核函数,在所述进程的内存空间上为所述更新通用表申请包含所述待申请空间以及通用导入表空间的更新通用表空间。【文档编号】G06F9/445GK105955762SQ201610244973【公开日】2016年9月21日【申请日】2016年4月19日【发明人】李文靖【申请人】北京金山安全软件有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1