【发明公布】一种DLL文件的处理方法及相关装置_武汉斗鱼网络科技有限公司_201910603753.4 

申请/专利权人:武汉斗鱼网络科技有限公司

申请日:2019-07-05

发明/设计人:周志刚

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

代理机构:北京众达德权知识产权代理有限公司

公开(公告)号:CN110298175A

代理人:徐松

主分类号:G06F21/56(20130101)

地址:430000 湖北省武汉市东湖开发区软件园东路1号软件产业4.1期B1栋11楼

分类号:G06F21/56(20130101)

优先权:

专利状态码:在审-公开

法律状态:2019.10.01#公开

摘要:本申请实施例公开了一种DLL文件的处理方法及相关装置,用于绕开对DLL文件的检测。本申请实施例方法包括:将DLL文件注入到目标进程;根据DLL文件的大小申请内存空间;根据目标进程的标识信息对DLL文件进行加密得到密文信息,目标进程的标识信息随着目标进程的每次启动而发生变化;存储密文信息至内存空间,并从目标进程中卸载DLL文件;当触发执行DLL文件时,解密密文信息以得到原始的DLL文件;根据DLL文件在目标进程的起始地址和内存空间的地址对解密的DLL文件进行重定位修复;选择资源文件修改DLL文件的格式头,以绕开对DLL文件的检测,资源文件的格式与DLL文件的格式不同。

主权项:1.一种动态链接库DLL文件的处理方法,所述处理方法用于绕开对所述DLL文件的检测,其特征在于,包括:将所述DLL文件注入到目标进程;根据所述DLL文件的大小申请内存空间;根据所述目标进程的标识信息对所述DLL文件进行加密得到密文信息,所述目标进程的标识信息随着所述目标进程的每次启动而发生变化;存储所述密文信息至所述内存空间,并从所述目标进程中卸载所述DLL文件;当触发执行所述DLL文件时,解密所述密文信息以得到原始的所述DLL文件;根据所述DLL文件在目标进程的起始地址和所述内存空间的地址对解密的所述DLL文件进行重定位修复;选择资源文件修改所述DLL文件的格式头,以绕开对所述DLL文件的检测,所述资源文件的格式与所述DLL文件的格式不同。

全文数据:一种DLL文件的处理方法及相关装置技术领域本申请涉及软件领域,尤其涉及一种DLL文件的处理方法及相关装置。背景技术对于一些特殊功能的工具,需要编写一个动态链接库文件dynamiclinklibrary,DLL并注入到对应的进程中,例如直播软件会注入DLL到游戏进程中。为防止应用程序被注入来自第三方的DLL,现有技术中会通过应用程序检测是否有注入DLL并判断注入的DLL是否为外挂程序。因此需要方法来对注入的DLL文件绕开对应程序的检测。现有通常的方法都是对注入的DLL进行断开DLL的链表,从而在枚举系统所有DLL时枚举不到该DLL。然而此种方法也存在被检测的可能,因此需要一种新的方法来绕开检测。发明内容本申请实施例提供了一种DLL文件的处理方法及相关装置,用于绕开对DLL文件的检测。本申请实施例的第一方面提供了一种DLL文件的处理方法,包括:将所述DLL文件注入到目标进程;根据所述DLL文件的大小申请内存空间;根据所述目标进程的标识信息对所述DLL文件进行加密得到密文信息,所述目标进程的标识信息随着所述目标进程的每次启动而发生变化;存储所述密文信息至所述内存空间,并从所述目标进程中卸载所述DLL文件;当触发执行所述DLL文件时,解密所述密文信息以得到原始的所述DLL文件;根据所述DLL文件在目标进程的起始地址和所述内存空间的地址对解密的所述DLL文件进行重定位修复;选择资源文件修改所述DLL文件的格式头,以绕开对所述DLL文件的检测,所述资源文件的格式与所述DLL文件的格式不同。在一种可能的实施例中,所述根据所述DLL文件的大小申请内存空间包括:通过系统函数GetModuleHandle获取所述DLL文件在所述目标进程中的起始地址;根据所述起始地址获取所述DLL文件的DOS头结构信息pDos;根据所述pDos确定所述DLL文件的NT头结构信息pNT,所述pNT包括所述DLL文件的大小;将所述DLL文件的大小作为系统函数VirualAlloc的输入参数以申请所述内存空间。在一种可能的实施例中,所述根据所述目标进程的标识信息对所述DLL文件进行加密得到密文信息包括:当读取所述DLL文件时,每读取所述DLL文件的Q个字节,根据所述目标进程的当前标识信息生成第一密钥,并根据所述第一密钥对所述Q个字节进行加密,得到第一加密字节;再根据所述Q个字节和所述目标进程的当前表示信息生成第二密钥,以根据所述第二密钥对所述Q个字节的下一Q个字节进行加密,得到第二加密字节,直至完成对整个所述DLL文件的加密,得到所述密文信息。在一种可能的实施例中,所述再根据所述Q个字节和所述目标进程的当前表示信息生成第二密钥,以根据所述第二密钥对所述Q个字节的下一Q个字节进行加密包括:通过以下函数生成所述第二密钥:Key2=Md5.Creatpid+hmodule+i*Q;其中,所述Key2用于表示所述第二密钥,所述pid用于表示所述目标进程的当前标识信息,所述hmodule用于表示所述DLL文件在所述目标进程中的起始地址,所述hmodule+i*Q用于表示所述DLL文件的Q个字节,所述Md5.Creat为md5算法的加密接口。在一种可能的实施例中,所述根据所述DLL文件在目标进程的起始地址和所述内存空间的地址对解密的所述DLL文件进行重定位修复包括:获取所述DLL文件对应的重定位表的内存地址,所述重定位表用于记录所有的重定位块;将所述内存空间的内存地址和所述DLL文件在目标进程的起始地址的差作为待修复偏移量;遍历所述重定位表,以得到各重定位块的内存地址和所述重定位块的个数;根据所述各重定位块的内存地址和所述待修复偏移量对所述各重定位块进行修复。在一种可能的实施例中,当所述资源文件为png图片文件时,所述选择资源文件修改所述DLL文件的格式头包括:通过系统函数CreatFile创建文件句柄以读取所述png图片文件;通过系统函数ReadFile读取所述png图片文件,以得到所述png图片文件的图片内容;将所述图片内容分别拷贝到所述pDos头部和pNT头部,以修改所述DLL文件的格式头。在一种可能的实施例中,所述将所述图片内容分别拷贝到所述pDos头部和pNT头部包括:通过系统函数MemcpyA,B,C将所述图片内容分别拷贝到所述pDos头部和pNT头部,其中,所述参数A用于表示所述pDos头部或pNT头部,所述参数B用于表示所述图片内容,所述参数C用于表示所述pDos头部的大小或pNT头部的大小。本申请实施例的第二方面提供了一种处理装置,包括:注入单元,用于将DLL文件注入到目标进程;申请单元,用于根据所述DLL文件的大小申请内存空间;加解密单元,用于根据所述目标进程的标识信息对所述DLL文件进行加密得到密文信息,所述目标进程的标识信息随着所述目标进程的每次启动而发生变化;存储单元,用于存储所述密文信息至所述内存空间,并从所述目标进程中卸载所述DLL文件;所述加解密单元还用于当触发执行所述DLL文件时,解密所述密文信息以得到原始的所述DLL文件;修复单元,用于根据所述DLL文件在目标进程的起始地址和所述内存空间的地址对解密的所述DLL文件进行重定位修复;修改单元,用于选择资源文件修改所述DLL文件的格式头,以绕开对所述DLL文件的检测,所述资源文件的格式与所述DLL文件的格式不同。本申请第三方面提供了一种电子设备,包括存储器、处理器,其特征在于,所述处理器用于执行存储器中存储的计算机管理类程序时实现如上述第一方面任意一项所述的DLL文件的处理方法的步骤。本申请的第四方面提供了一种计算机可读存储介质,所述计算机可读存储介质中存储有指令,当其在计算机上运行时,使得计算机执行上述各方面所述的DLL文件的处理方法。本申请的第五方面提供了一种包含指令的计算机程序产品,当其在计算机上运行时,使得计算机执行上述各方面所述的方法。从以上技术方案可以看出,本申请实施例具有以下优点:将所述DLL文件注入到目标进程;根据所述DLL文件的大小申请内存空间;根据所述目标进程的标识信息对所述DLL文件进行加密得到密文信息,所述目标进程的标识信息随着所述目标进程的每次启动而发生变化;存储所述密文信息至所述内存空间,并从所述目标进程中卸载所述DLL文件;当触发执行所述DLL文件时,解密所述密文信息以得到原始的所述DLL文件;根据所述DLL文件在目标进程的起始地址和所述内存空间的地址对解密的所述DLL文件进行重定位修复;选择资源文件修改所述DLL文件的格式头,以绕开对所述DLL文件的检测,所述资源文件的格式与所述DLL文件的格式不同。本申请实施例中,由于一个dll文件的格式头部数据主要用于加载dll的时候使用,包括修复重定位数据,因此本文在完成对DLL文件的重定位数据修复后,将DLL文件的头部数据进行修改伪装,使得该DLL文件不是一个完整的dll文件,从而绕过检测。附图说明图1a为本申请实施例提供的一种DLL文件的处理方法的流程图;图1b为本申请实施例提供的一种可能的PE的逻辑图;图2为本申请实施例提供的一种可能的处理装置的结构示意图;图3为本申请实施例提供的另一可能的电子设备的硬件结构示意图;图4为本申请实施例提供的一种可能的计算机可读存储介质的硬件结构示意图。具体实施方式本申请实施例提供了一种DLL文件的处理方法及相关装置,用于绕开对DLL文件的检测。下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。请参阅图1a,为本申请实施例提供的一种可能的DLL文件的处理方法的流程图,具体包括:101、将DLL文件注入到目标进程;需要说明的是,所谓DLL文件的注入,可以理解为向一个正在运行的进程插入注入代码的过程。注入的代码以动态链接库即DLL的形式存在。DLL文件在运行时将按需加载类似于UNIX系统中的共享库。DLL注入技术可以被用于合法正当的用途。比如,反病毒软件和端点安全解决方案使用这些技术来将其软件的代码嵌入拦截系统中“所有”正在运行的进程,这使得它们可以在其运行过程中监控每一个进程,从而更好地进行保护。本申请实施例中,首先将编写的DLL文件注入到目标进程中。需要说明的是,现有技术中,将DLL文件注入到目标进程的方式有多种,例如远程线程注入、全局钩子注入、劫持注入等,具体注入方式此处不做限定。为更好的理解本申请实施例,本实施例以远程线程注入方式进行说明,包括:1附加到远程进程;2在远程进程内分配内存;3将DLL文件路径,或者DLL文件,复制到远程进程的内存空间;4控制进程运行DLL文件,即实现了远程线程注入。注入完成后在目标进程中则会存在一份编写的DLL文件。本步骤中,通过将DLL文件注入到目标进程,使用系统来帮助来加载DLL文件到系统,解决了从磁盘加载dll文件导致在某些系统或者系统更新后,产生的兼容性方面的问题。102、根据DLL文件的大小申请内存空间;接下来需要申请一个内存空间用于拷贝注入的DLL文件,因此需要获取DLL文件的大小从而方便进行拷贝。具体包括以下步骤:通过系统函数GetModuleHandle获取DLL文件在目标进程中的起始地址,函数实现可以如下:DWORDhmodule=GetModuleHandle“DLL”;其中,hmodule用于表示DLL文件在目标进程中的起始地址,函数GetModuleHandle的输入参数即为DLL文件。由于DLL文件是完全的可移植的可执行文件PE,portableexecutablefileformat格式,一个标准的PE文件由DOS头,NT头PE标识、标准PE头和可选PE头,节表,节的内容以及一些为了内存对齐而填充的0,具体请参见图1b,为本申请实施例提供的一种可能的PE的逻辑图,其中各个节中的内容可能是代码,也可能是数据或者符号等,具体内容可根据节的属性等因素决定。其中,对于一个PE文件来说,最开始的位置就是一个DOS头。DOS头部是由IMAGE_DOS_HEADER结构体来定义的,IMAGE_DOS_HEADER结构体的大小为64B,它最后一个成员e_lfanew的值决定了NT头在PE文件中的偏移。因此,在得到DLL文件在目标进程中的起始地址后,可以根据该起始地址获取DLL文件的DOS头结构信息pDos,函数实现可以如下:PIMAGE_DOS_HEADERpDos=PIMAGE_DOS_HEADERhmodule;得到DLL文件的DOS头结构信息pDos,由于该pDOS为PIMAGE_DOS_HEADER类型,那么就能获取到NT头的开始位置,即NT头结构信息pNT。pNT可通过以下方式获得:PIMAGE_NT_HEADERSpNT=PIMAGE_NT_HEADERSDWORDhmodule+pDos-e_lfanew;其中,pNT用于表示NT头的开始位置即NT头结构信息,hmodule表示DLL文件在目标进程中的起始地址,e_lfanew用于表示NT头在DLL文件中的偏移。在得到了NT头结构信息pNT后,即可从NT头结构信息中得到DLL文件的大小,本申请实施例中,通过pNt-OptionalHeader.SizeOfImage表示该DLL文件的大小。接下来即可通过DLL文件的大小申请可以执行的内存空间,具体通过调用系统函数VirtualAlloc来保留指定大小的内存空间,以实现内存空间的分配操作,由于函数VirtualAlloc的第一个参数为指定地址,如果指定地址已经被占用或者指定地址后面没有足够的连续的地址空间来满足提交的大小则会调用失败,本申请实施例中没有必要获取指定地址空间,这样第一个参数必须保留为NULL0,故具体函数实现如下:PBYTEdllmemory=PBYTEVirtualAlloc0,pNt-OptionalHeader.SizeOfImage,MEM_COMMIT,PAGE_EXECUTE_READWRITE;其中,dllmemory用于表示申请的内存空间,pNt-OptionalHeader.SizeOfImage用于表示DLL文件的大小,MEM_COMMIT用于表示为特定的页面区域分配内存中或磁盘的页面文件中的物理存储;PAGE_EXECUTE_READWRITE用于表示区域包含可执行代码,应用程序可以读写该区域。因此通过上述方式,实现了内存空间的分配,且该内存空间的大小与DLL文件的大小相同。103、根据目标进程的标识信息对DLL文件进行加密得到密文信息;在申请了内存空间后,需要将DLL文件拷贝到该申请的内存空间中。然而本申请实施例中,DLL文件并不是总会执行,因此为了更好的保护该DLL文件,在不需要执行该DLL文件时,可对DLL文件进行加密来存放到该内存空间中。具体实现如下:在读取DLL文件时,每读取Q个字节的内容,就将该Q个字节加密然后再拷贝到申请到的内存空间中,其中,Q=MN取整,M为DLL文件的总字节个数,N为大于1的整数。为便于描述,本申请实施例将以Q=1000来进行说明。另外,考虑到进程每次启动时,进程的标识信息都会发生变化,因此为了提高加密的安全性,将加密过程与目标进程的标识信息进行绑定,这样每次进程启动时,得到的加密后的内容都不一样,没有规律,很难被第三方破解。故本申请实施例中,加密DLL文件的具体过程包括:通过调用GetCurrentProcessId获取目标进程的标识信息,实现函数可以为DWORDpid=GetCurrentProcessId;其中,pid用于表示目标进程的当前标识信息;然后根据该pid得到第一密钥,实现函数可以为Key1=Md5.Createpid;其中,Key1用于表示第一密钥;得到Key1后,再对DLL文件进行加密,本实施例中,通过for循环实现在读取DLL文件的每Q个字节内容时便进行加密的步骤,以下将以Q=1000为例进行详细说明:Forinti=0;iOptionalHeader.SizeOfImage1000;i++{EncryptData=Tea.encrypthmodule+i*1000,Key1;其中,pNt-OptionalHeader.SizeOfImage用于表示DLL文件的总字节数目;EncryptData用于表示第一加密字节,hmodule用于表示DLL文件在目标进程的起始地址,hmodule+1*1000用于表示原始的DLL文件的前1000个字节;Tea.encrypt用于表示TEA加密算法的加密接口;在得到EncryptData后,将该EncryptData拷贝至申请的内存空间中。接下来需要计算下一次的密钥数据即第二密钥,该第二密钥通过上一1000个字节的原始数据和目标进程的当前标识信息生成,具体函数实现如下:Key2=Md5.Createpid+hmodule+i*1000;其中Key2用于表示第二密钥,hmodule+i*1000为上一1000个字节的原始数据,pid用于表示目标进程的当前标识信息。在得到第二密钥后,根据该第二密钥对DLL文件的下一个1000字节的内容进行加密。因此通过上一1000个字节的原始数据和目标进程当前的标识信息生成密钥来对下一1000个字节的原始数据进行加密,不断循环,以实现对整个DLL文件的加密,得到密文信息。本步骤中,将原始的DLL文件根据目标进程标识信息加密后再写入分配的内存空间中,使得写入到内存空间的数据是密文信息,可以防止安全程序通过钩子来监听写入的内容。同时,通过目标进程的标识信息对DLL文件的各段字节进行加密,保障此段内容只有当前进程才能够解密,即使是被拷贝到磁盘上也无法进行解密。同时每次进程启动都会使得加密的内容不一样,没有规律进而提高安全性。104、存储密文信息至内存空间,并从目标进程中卸载DLL文件;在对DLL文件的各段字节进行加密生成对应的加密字节即密文信息后,将各加密字节拷贝至内存空间,例如针对步骤103生成的第一加密字节,通过调用函数Memcpy拷贝到内存空间,实现函数可能如下:Memcpydllmemory+i*1000,EncryptData;其中,函数Memcpy用于XXX;EncryptData用于表示第一加密字节,dllmemory用于表示内存空间,dllmemory+i*1000用于表示内存空间中存放第一加密字节的地址。采用类似的方式,将所有的加密字节均存入内存空间,即将密文信息存储至内存空间。需要说明的是,内存空间拷贝有全部的密文信息后,即内存空间存储有加密后的DLL文件,那么原来注入到目标进程中的DLL文件为了不引起程序的安全检测则需要进行卸载。具体地,可以通过系统函数FreeLibrary来将之前注入的dll从目标进程中进行卸载,函数实现可能如下:FreeLibraryhmodule;其中,hmodule用于表示目标进程。本步骤中,将原始的DLL文件从目标进程中卸载,能够避免程序对目标进程中DLL文件的检测,减小了DLL文件被检测到的可能性。105、当触发执行DLL文件时,解密密文信息以得到原始的DLL文件;需要说明的是,本申请实施例中,当不需要执行DLL文件时,则将该DLL文件加密后得到的密文信息存储到内存空间中,当需要执行DLL文件时,则解密该密文信息以得到原始的DLL文件来执行。例如DLL文件需要注入的进程用于登录程序,则只需要在登录程序的时候解密使用,非登录的时候则加密保存到内存空间里。本实施例中,解密该密文信息得到原始的DLL文件的方式与步骤103中加密DLL文件得到密文信息的方式逆向,具体如下:通过调用GetCurrentProcessId获取进程的标识信息,实现函数可以为DWORDpid=GetCurrentProcessId;其中,pid用于表示进程的当前标识信息;然后根据该pid得到第一密钥,实现函数可以为Key1=Md5.Createpid;其中,Key1用于表示第一密钥;得到Key1后,再对密文信息中的各加密字节进行解密,本实施例中,通过for循环实现对各加密字节进行依次解密的步骤,对应的,以下将以Q=1000为例进行详细说明:Forinti=0;iOptionalHeader.SizeOfImage1000;i++{Data=Tea.decrypthmodule+i*1000,Key1;其中,pNt-OptionalHeader.SizeOfImage用于表示DLL文件的总字节数目;Data用于表示原始的DLL文件的前1000个字节,hmemory+i*1000用于表示第一加密字节,即加密后的原始的DLL文件的前1000个字节;Tea.decrypt用于表示TEA加密算法的解密接口。在得到Data后,再计算下一个1000个字节的解密密钥,即第二密钥。函数实现可能如下:Key2=Md5.Createpid+Data;其中,Key2用于表示第二密钥,Data用于表示前1000个字节的原始数据,pid用于表示目标进程的当前标识信息。在得到第二密钥后,根据该第二密钥对第二加密字节进行解密。因此通过解密出上一1000个字节的原始数据,和目标进程当前的标识信息生成密钥来对下一1000个字节对应的加密字节进行加密,不断循环,以实现对整个密文信息的解密,以还原得到原始的DLL文件。本步骤中,解密的时候必须依赖于上下文,才能解密出整段内容。并且只有解密出第一块的明文才能解密第二块的明文。106、根据DLL文件在目标进程的起始地址和内存空间的地址对解密的DLL文件进行重定位修复;本申请实施例中,DLL文件加载到内存空间中,系统会进行重定位的修复,重定位的修复需要依赖于dll加载的内存起始地址。对于每个DLL文件来说都存在一个重定位节.reloc,用来记录DLL文件的重定位信息,系统在加载DLL文件时就可以按照该重定位节的信息对需要重定位的地址进行修正,在32位代码中,凡涉及到直接寻址的指令都是需要重定位的,而PE文件的.reloc段则是可选的,因为PE文件一般都可以加载到默认地址如:0x00400000。对于操作系统来说,其任务就是在对可执行程序透明的情况下完成重定位操作,在现实中,重定位信息是在编译的时候由编译器生成并被保留在可执行文件中的,在程序被执行前由操作系统根据重定位信息修正代码,这样在开发程序的时候就不用考虑重定位问题了。重定位信息在DLL文件中被存放在重定位表中,重定位的算法可以描述为:将直接寻址指令中的双字地址加上模块实际装入地址与模块建议装入地址之差。为了进行这个运算,需要有3个数据,首先是需要修正的机器码地址;其次是模块的建议装入地址;最后是模块的实际装入地址。在这3个数据中,模块的建议装入地址已经在PE文件头中定义了编译后就已经确定,而模块的实际装入地址是Windows装载器确定的,到装载文件的时候自然会知道,所以被保存在重定位表中的仅仅是需要修正的代码的地址。因此DLL文件的重定位表中保存的就是一大堆需要修正的代码的地址。重定位表一般会被单独存放在一个可丢弃的以“.reloc”命名的节中,需要说明的是,重定位表放在其他节中也是合法。可以确定的是,假如重定位表存在的话,它的地址肯定可以在DLL文件头中的数据目录中找到。重定位表的位置和大小可以从数据目录中的第6个IMAGE_DATA_DIRECTORY结构中获取,具体地,可通过以下函数获取重定位表的内存地址:PIMAGE_BASE_RELOCATIONreloc=PIMAGE_BASE_RELOCATIONDWORDdllmemory+pNt-OptionalHeader.DataDirectory[5].VirtualAddress;其中,dllmemory用于表示申请的内存空间,VirtualAddress是这一组重定位数据的开始的相对虚拟地址relativevirtualaddress,RVA;pNt-OptionalHeader.DataDirectory[5].VirtualAddress用于指向数据目录中的第6个IMAGE_DATA_DIRECTORY结构中需要重定位数据的RAV;再获得待修复偏移量,具体地,将内存空间的内存地址和DLL文件在目标进程的起始地址的差作为待修复偏移量,具体实现函数如下:DWORDoffset=DWORDdllmemory-DWORDhmodule;其中,offset用于表示待修复偏移量,dllmemory用于表示内存空间的内存地址,hmodule用于表示DLL文件在目标进程的起始地址。由于DLL文件在目标进程的起始地址是hmodule,系统按照这个地址修复了重定位。新的内存地址是dllmemory,那么则需要对所有的重定位数据减去上述的待修复偏移量。重定位表格记录了所有的重定位数据,故需要遍历表格对每个重定位数据重新修复偏移数据。本实施例中,通过编写一个while循环来修复重定位,在该循环中,判断是否有需要重定位的地址即重定位块的大小是否等于0,函数表达为reloc-SizeOfBlock==0,如果等于0,则表示没有重定位块,便退出该while循环;否则通过函数Item=PRELOCATIONITEMPBYTEreloc+8获取第一个重定位块,并通过公式num=reloc-SizeOfBlock-82计算重定位块的个数,再获取各重定位块的内存地址,并根据各重定位块的内存地址和上述待修复偏移量对各重定位块进行修复。通过上述for循环,实现了当前重定位节的修复处理,因此再转移到下一个重定位节进行处理,函数实现可能如下:reloc=PIMAGE_BASE_RELOCATIONPBYTEreloc+rBase-SizeOfBlock;}本步骤中,通过对DLL文件进行重定位修复,解决了DLL文件的运行地址和链接地址不同所导致的DLL执行时发生不可预估的错误的问题,保证了DLL文件的正常执行。107、选择资源文件修改DLL文件的格式头,以绕开对DLL文件的检测。由于本实施例拷贝到内存空间的DLL文件是一个完整的文件,而对于一些安全检查程序,其可能会存在通过枚举系统所有可以执行的内存来判断所有内存是不是一个dll格式文件。通常,判断一块内存是不是一个dll格式文件,则通过读取内存的头部数据判断其格式。而一个dll文件的格式头部数据主要用于加载dll的时候使用,例如修复重定位数据,修复导入表数据。因此在DLL文件所有的修复已经完成,则可以将头部数据进行修改伪装等,从而使得其不是一个完整的dll文件,以绕过检测。修改的方式本实施例则可以拷贝一份资源文件的数据格式头,从而让检测程序认为是一个资源文件,可以理解的是,该资源文件的格式与DLL文件的格式不同,从而绕过了检测,具体实现如下:DLL文件的头部数据主要是2个头部结构IMAGE_DOS_HEADER,和IMAGE_NT_HEADERS。通过步骤102可获取到DOS头结构信息pDos和NT头结构信息pNt,然后可以选择一份程序中的资源文件,例如一份图片文件或者其他的数据文件,将其读取到内存空间中并拷贝到DLL文件的头部数据。以下将以资源文件为png图片文件进行说明:通过系统函数CreatFile创建文件句柄以读取png图片文件,具体函数实现如下:hFile=HANDLECreateFile“xx.png”,GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_EXISTING,NULL,NULL;其中,hFile用于表示文件句柄,xx.png用于表示png图片文件的名称,GENERIC_WRITE用于表示允许进行写访问,FILE_SHARE_READ表示允许对文件进行共享访问,OPEN_EXISTING表示打开指定名称;然后根据该文件句柄并通过调用函数ReadFile读取图片内容,实现函数可能如下:ReadFilehFile,pBuffer,GetFileSizem_hFile,NULL,&RSize,NULL;其中,hFile用于表示文件句柄,pBuffer用于表示图片的离屏渲染,GetFileSize用于获取文件的大小;在读取到图片内容后,将读取的图片内容拷贝到DOS头和NT头,具体函数实现如下:MemcpypDos,pBuffer,sizeofIMAGE_DOS_HEADER;MemcpypNt,pBuffer,sizeofIMAGE_NT_HEADERS;其中,函数Memcpy为拷贝函数,pDos用于表示DOS头结构信息,sizeofIMAGE_DOS_HEADER用于表示DOS头的大小,pNt用于表示NT头结构信息,sizeofIMAGE_NT_HEADERS用于表示NT头的大小,pBuffer用于表示图片的离屏渲染。从而改变了DDL文件的头部数据,实现了DLL头部数据的伪装,以绕开DLL文件的检测。本申请实施例中,由于一个dll文件的格式头部数据主要用于加载dll的时候使用,包括修复重定位数据,因此本文在完成对DLL文件的重定位数据修复后,将DLL文件的头部数据进行修改伪装,使得该DLL文件不是一个完整的dll文件,从而绕过检测。上面从DLL文件的处理方法的角度对本申请实施例进行了描述,下面从处理装置的角度对本申请实施例进行描述。请参阅图2,图2为本申请实施例提供的一种可能的处理装置的实施例示意图,其中,该播放装置具体包括:注入单元201,用于将DLL文件注入到目标进程;申请单元202,用于根据所述DLL文件的大小申请内存空间;加解密单元203,用于根据所述目标进程的标识信息对所述DLL文件进行加密得到密文信息,所述目标进程的标识信息随着所述目标进程的每次启动而发生变化;存储单元204,用于存储所述密文信息至所述内存空间,并从所述目标进程中卸载所述DLL文件;所述加解密单元203还用于当触发执行所述DLL文件时,解密所述密文信息以得到原始的所述DLL文件;修复单元205,用于根据所述DLL文件在目标进程的起始地址和所述内存空间的地址对解密的所述DLL文件进行重定位修复;修改单元206,用于选择资源文件修改所述DLL文件的格式头,以绕开对所述DLL文件的检测,所述资源文件的格式与所述DLL文件的格式不同。在一种可能的实施例中,所述申请单元202具体用于:通过系统函数GetModuleHandle获取所述DLL文件在所述目标进程中的起始地址;根据所述起始地址获取所述DLL文件的DOS头结构信息pDos;根据所述pDos确定所述DLL文件的NT头结构信息pNT,所述pNT包括所述DLL文件的大小;将所述DLL文件的大小作为系统函数VirualAlloc的输入参数以申请所述内存空间。在一种可能的实施例中,所述加解密单元203具体用于:当读取所述DLL文件时,每读取所述DLL文件的Q个字节,根据所述目标进程的当前标识信息生成第一密钥,并根据所述第一密钥对所述Q个字节进行加密,得到第一加密字节;再根据所述Q个字节和所述目标进程的当前表示信息生成第二密钥,以根据所述第二密钥对所述Q个字节的下一Q个字节进行加密,得到第二加密字节,直至完成对整个所述DLL文件的加密,得到所述密文信息。在一种可能的实施例中,所述加解密单元203具体用于:通过以下函数生成所述第二密钥:Key2=Md5.Creatpid+hmodule+i*Q;其中,所述Key2用于表示所述第二密钥,所述pid用于表示所述目标进程的当前标识信息,所述hmodule用于表示所述DLL文件在所述目标进程中的起始地址,所述hmodule+i*Q用于表示所述DLL文件的Q个字节,所述Md5.Creat为md5算法的加密接口。在一种可能的实施例中,所述修复单元205具体用于:获取所述DLL文件对应的重定位表的内存地址,所述重定位表用于记录所有的重定位块;将所述内存空间的内存地址和所述DLL文件在目标进程的起始地址的差作为待修复偏移量;遍历所述重定位表,以得到各重定位块的内存地址和所述重定位块的个数;根据所述各重定位块的内存地址和所述待修复偏移量对所述各重定位块进行修复。在一种可能的实施例中,所述修改单元206具体用于:通过系统函数CreatFile创建文件句柄以读取所述png图片文件;通过系统函数ReadFile读取所述png图片文件,以得到所述png图片文件的图片内容;将所述图片内容分别拷贝到所述pDos头部和pNT头部,以修改所述DLL文件的格式头。在一种可能的实施例中,所述修改单元206具体用于:通过系统函数MemcpyA,B,C将所述图片内容分别拷贝到所述pDos头部和pNT头部,其中,所述参数A用于表示所述pDos头部或pNT头部,所述参数B用于表示所述图片内容,所述参数C用于表示所述pDos头部的大小或pNT头部的大小。请参阅图3,图3为本申请实施例提供的电子设备的实施例示意图。如图3所示,本申请实施例提供了一种电子设备,包括存储器310、处理器320及存储在存储器320上并可在处理器320上运行的计算机程序311,处理器320执行计算机程序311时实现以下步骤:将所述DLL文件注入到目标进程;根据所述DLL文件的大小申请内存空间;根据所述目标进程的标识信息对所述DLL文件进行加密得到密文信息,所述目标进程的标识信息随着所述目标进程的每次启动而发生变化;存储所述密文信息至所述内存空间,并从所述目标进程中卸载所述DLL文件;当触发执行所述DLL文件时,解密所述密文信息以得到原始的所述DLL文件;根据所述DLL文件在目标进程的起始地址和所述内存空间的地址对解密的所述DLL文件进行重定位修复;选择资源文件修改所述DLL文件的格式头,以绕开对所述DLL文件的检测,所述资源文件的格式与所述DLL文件的格式不同。可选的,在一种可能的实施例中,所述处理器320具体用于:通过系统函数GetModuleHandle获取所述DLL文件在所述目标进程中的起始地址;根据所述起始地址获取所述DLL文件的DOS头结构信息pDos;根据所述pDos确定所述DLL文件的NT头结构信息pNT,所述pNT包括所述DLL文件的大小;将所述DLL文件的大小作为系统函数VirualAlloc的输入参数以申请所述内存空间。可选的,在一种可能的实施例中,所述处理器320具体用于:当读取所述DLL文件时,每读取所述DLL文件的Q个字节,根据所述目标进程的当前标识信息生成第一密钥,并根据所述第一密钥对所述Q个字节进行加密,得到第一加密字节;再根据所述Q个字节和所述目标进程的当前表示信息生成第二密钥,以根据所述第二密钥对所述Q个字节的下一Q个字节进行加密,得到第二加密字节,直至完成对整个所述DLL文件的加密,得到所述密文信息。可选的,在一种可能的实施例中,所述处理器320具体用于:通过以下函数生成所述第二密钥:Key2=Md5.Creatpid+hmodule+i*Q;其中,所述Key2用于表示所述第二密钥,所述pid用于表示所述目标进程的当前标识信息,所述hmodule用于表示所述DLL文件在所述目标进程中的起始地址,所述hmodule+i*Q用于表示所述DLL文件的Q个字节,所述Md5.Creat为md5算法的加密接口。可选的,在一种可能的实施例中,所述处理器320具体用于:获取所述DLL文件对应的重定位表的内存地址,所述重定位表用于记录所有的重定位块;将所述内存空间的内存地址和所述DLL文件在目标进程的起始地址的差作为待修复偏移量;遍历所述重定位表,以得到各重定位块的内存地址和所述重定位块的个数;根据所述各重定位块的内存地址和所述待修复偏移量对所述各重定位块进行修复。可选的,在一种可能的实施例中,所述处理器320具体用于:通过系统函数CreatFile创建文件句柄以读取所述png图片文件;通过系统函数ReadFile读取所述png图片文件,以得到所述png图片文件的图片内容;将所述图片内容分别拷贝到所述pDos头部和pNT头部,以修改所述DLL文件的格式头。可选的,在一种可能的实施例中,所述处理器320具体用于:通过系统函数MemcpyA,B,C将所述图片内容分别拷贝到所述pDos头部和pNT头部,其中,所述参数A用于表示所述pDos头部或pNT头部,所述参数B用于表示所述图片内容,所述参数C用于表示所述pDos头部的大小或pNT头部的大小。由于本实施例所介绍的电子设备为实施本申请实施例中一种处理装置所采用的设备,故而基于本申请实施例中所介绍的方法,本领域所属技术人员能够了解本实施例的电子设备的具体实施方式以及其各种变化形式,所以在此对于该电子设备如何实现本申请实施例中的方法不再详细介绍,只要本领域所属技术人员实施本申请实施例中的方法所采用的设备,都属于本申请所欲保护的范围。请参阅图4,图4为本申请实施例提供的一种计算机可读存储介质的实施例示意图。如图4所示,本实施例提供了一种计算机可读存储介质400,其上存储有计算机程序411,该计算机程序411被处理器执行时实现如下步骤:将所述DLL文件注入到目标进程;根据所述DLL文件的大小申请内存空间;根据所述目标进程的标识信息对所述DLL文件进行加密得到密文信息,所述目标进程的标识信息随着所述目标进程的每次启动而发生变化;存储所述密文信息至所述内存空间,并从所述目标进程中卸载所述DLL文件;当触发执行所述DLL文件时,解密所述密文信息以得到原始的所述DLL文件;根据所述DLL文件在目标进程的起始地址和所述内存空间的地址对解密的所述DLL文件进行重定位修复;选择资源文件修改所述DLL文件的格式头,以绕开对所述DLL文件的检测,所述资源文件的格式与所述DLL文件的格式不同。可选的,在一种可能的实施例中,该计算机程序411被处理器执行时具体实现如下步骤:通过系统函数GetModuleHandle获取所述DLL文件在所述目标进程中的起始地址;根据所述起始地址获取所述DLL文件的DOS头结构信息pDos;根据所述pDos确定所述DLL文件的NT头结构信息pNT,所述pNT包括所述DLL文件的大小;将所述DLL文件的大小作为系统函数VirualAlloc的输入参数以申请所述内存空间。可选的,在一种可能的实施例中,该计算机程序411被处理器执行时具体实现如下步骤:当读取所述DLL文件时,每读取所述DLL文件的Q个字节,根据所述目标进程的当前标识信息生成第一密钥,并根据所述第一密钥对所述Q个字节进行加密,得到第一加密字节;再根据所述Q个字节和所述目标进程的当前表示信息生成第二密钥,以根据所述第二密钥对所述Q个字节的下一Q个字节进行加密,得到第二加密字节,直至完成对整个所述DLL文件的加密,得到所述密文信息。可选的,在一种可能的实施例中,该计算机程序411被处理器执行时具体实现如下步骤:通过以下函数生成所述第二密钥:Key2=Md5.Creatpid+hmodule+i*Q;其中,所述Key2用于表示所述第二密钥,所述pid用于表示所述目标进程的当前标识信息,所述hmodule用于表示所述DLL文件在所述目标进程中的起始地址,所述hmodule+i*Q用于表示所述DLL文件的Q个字节,所述Md5.Creat为md5算法的加密接口。可选的,在一种可能的实施例中,该计算机程序411被处理器执行时具体实现如下步骤:获取所述DLL文件对应的重定位表的内存地址,所述重定位表用于记录所有的重定位块;将所述内存空间的内存地址和所述DLL文件在目标进程的起始地址的差作为待修复偏移量;遍历所述重定位表,以得到各重定位块的内存地址和所述重定位块的个数;根据所述各重定位块的内存地址和所述待修复偏移量对所述各重定位块进行修复。可选的,在一种可能的实施例中,该计算机程序411被处理器执行时具体实现如下步骤:通过系统函数CreatFile创建文件句柄以读取所述png图片文件;通过系统函数ReadFile读取所述png图片文件,以得到所述png图片文件的图片内容;将所述图片内容分别拷贝到所述pDos头部和pNT头部,以修改所述DLL文件的格式头。可选的,在一种可能的实施例中,该计算机程序411被处理器执行时具体实现如下步骤:通过系统函数MemcpyA,B,C将所述图片内容分别拷贝到所述pDos头部和pNT头部,其中,所述参数A用于表示所述pDos头部或pNT头部,所述参数B用于表示所述图片内容,所述参数C用于表示所述pDos头部的大小或pNT头部的大小。本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质包括但不限于磁盘存储器、CD-ROM、光学存储器等上实施的计算机程序产品的形式。本申请是参照根据本申请实施例的方法、设备系统、和计算机程序产品的流程图和或方框图来描述。应理解可由计算机程序指令实现流程图和或方框图中的每一流程和或方框、以及流程图和或方框图中的流程和或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式计算机或者其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和或方框图一个方框或多个方框中指定的功能的装置。这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和或方框图一个方框或多个方框中指定的功能。这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和或方框图一个方框或多个方框中指定的功能的步骤。尽管已描述了本申请的优选实施例,但本领域内的技术人员一旦得知了基本创造概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本申请范围的所有变更和修改。显然,本领域的技术人员可以对本申请进行各种改动和变型而不脱离本申请的精神和范围。这样,倘若本申请的这些修改和变型属于本申请权利要求及其等同技术的范围之内,则本申请也意图包括这些改动和变型在内。

权利要求:1.一种动态链接库DLL文件的处理方法,所述处理方法用于绕开对所述DLL文件的检测,其特征在于,包括:将所述DLL文件注入到目标进程;根据所述DLL文件的大小申请内存空间;根据所述目标进程的标识信息对所述DLL文件进行加密得到密文信息,所述目标进程的标识信息随着所述目标进程的每次启动而发生变化;存储所述密文信息至所述内存空间,并从所述目标进程中卸载所述DLL文件;当触发执行所述DLL文件时,解密所述密文信息以得到原始的所述DLL文件;根据所述DLL文件在目标进程的起始地址和所述内存空间的地址对解密的所述DLL文件进行重定位修复;选择资源文件修改所述DLL文件的格式头,以绕开对所述DLL文件的检测,所述资源文件的格式与所述DLL文件的格式不同。2.根据权利要求1所述的方法,其特征在于,所述根据所述DLL文件的大小申请内存空间包括:通过系统函数GetModuleHandle获取所述DLL文件在所述目标进程中的起始地址;根据所述起始地址获取所述DLL文件的DOS头结构信息pDos;根据所述pDos确定所述DLL文件的NT头结构信息pNT,所述pNT包括所述DLL文件的大小;将所述DLL文件的大小作为系统函数VirualAlloc的输入参数以申请所述内存空间。3.根据权利要求1所述的方法,其特征在于,所述根据所述目标进程的标识信息对所述DLL文件进行加密得到密文信息包括:当读取所述DLL文件时,每读取所述DLL文件的Q个字节,根据所述目标进程的当前标识信息生成第一密钥,并根据所述第一密钥对所述Q个字节进行加密,得到第一加密字节;再根据所述Q个字节和所述目标进程的当前表示信息生成第二密钥,以根据所述第二密钥对所述Q个字节的下一Q个字节进行加密,得到第二加密字节,直至完成对整个所述DLL文件的加密,得到所述密文信息。4.根据权利要求3所述的方法,其特征在于,所述再根据所述Q个字节和所述目标进程的当前表示信息生成第二密钥,以根据所述第二密钥对所述Q个字节的下一Q个字节进行加密包括:通过以下函数生成所述第二密钥:Key2=Md5.Creatpid+hmodule+i*Q;其中,所述Key2用于表示所述第二密钥,所述pid用于表示所述目标进程的当前标识信息,所述hmodule用于表示所述DLL文件在所述目标进程中的起始地址,所述hmodule+i*Q用于表示所述DLL文件的Q个字节,所述Md5.Creat为md5算法的加密接口。5.根据权利要求1所述的方法,其特征在于,所述根据所述DLL文件在目标进程的起始地址和所述内存空间的地址对解密的所述DLL文件进行重定位修复包括:获取所述DLL文件对应的重定位表的内存地址,所述重定位表用于记录所有的重定位块;将所述内存空间的内存地址和所述DLL文件在目标进程的起始地址的差作为待修复偏移量;遍历所述重定位表,以得到各重定位块的内存地址和所述重定位块的个数;根据所述各重定位块的内存地址和所述待修复偏移量对所述各重定位块进行修复。6.根据权利要求2所述的方法,其特征在于,当所述资源文件为png图片文件时,所述选择资源文件修改所述DLL文件的格式头包括:通过系统函数CreatFile创建文件句柄以读取所述png图片文件;通过系统函数ReadFile读取所述png图片文件,以得到所述png图片文件的图片内容;将所述图片内容分别拷贝到所述pDos头部和pNT头部,以修改所述DLL文件的格式头。7.根据权利要求6所述的方法,其特征在于,所述将所述图片内容分别拷贝到所述pDos头部和pNT头部包括:通过系统函数MemcpyA,B,C将所述图片内容分别拷贝到所述pDos头部和pNT头部,其中,所述参数A用于表示所述pDos头部或pNT头部,所述参数B用于表示所述图片内容,所述参数C用于表示所述pDos头部的大小或pNT头部的大小。8.一种处理装置,其特征在于,包括:注入单元,用于将DLL文件注入到目标进程;申请单元,用于根据所述DLL文件的大小申请内存空间;加解密单元,用于根据所述目标进程的标识信息对所述DLL文件进行加密得到密文信息,所述目标进程的标识信息随着所述目标进程的每次启动而发生变化;存储单元,用于存储所述密文信息至所述内存空间,并从所述目标进程中卸载所述DLL文件;所述加解密单元还用于当触发执行所述DLL文件时,解密所述密文信息以得到原始的所述DLL文件;修复单元,用于根据所述DLL文件在目标进程的起始地址和所述内存空间的地址对解密的所述DLL文件进行重定位修复;修改单元,用于选择资源文件修改所述DLL文件的格式头,以绕开对所述DLL文件的检测,所述资源文件的格式与所述DLL文件的格式不同。9.一种计算机可读存储介质,包括指令,当其在计算机上运行时,使得计算机执行如权利要求1-7任意一项所述的方法。10.一种包含指令的计算机程序产品,当其在计算机上运行时,使得计算机执行如权利要求1-7任意一项所述的方法。

百度查询: 武汉斗鱼网络科技有限公司 一种DLL文件的处理方法及相关装置

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