文件解密方法和装置与流程

文档序号:13031529阅读:413来源:国知局
文件解密方法和装置与流程

本发明涉及计算机领域,具体而言,涉及一种文件解密方法和装置。



背景技术:

目前很多的恶意脚本和后门文件,为了躲避查杀会采用加密和混淆手段对自身代码进行保护,来增加被发现和逆向分析的难度。其中一种常见的加密手段为脚本层的混淆方法,该方法为通过多次随机调用php多个内置函数,例如eval、base64_encode、gzcompress对自身代码进行加密。php代码脚本层的加密,通常是将待加密的脚本代码作为一个字符串,使用内置或变形的字符串函数进行多次加密,执行时候通过对应的解密函数将密文按照顺序揭开,然后多次调用eval等函数执行代码。

针对上述加密手段,常规的解密手段是通过修改加密代码中的关键函数,并输出每一次执行的中间结果,最终还原出解密代码。然而这种方法存在一些弊端,由于php语言灵活的特性,加密后的代码可能与原代码相差较大,很难快速寻找和定位到关键的函数,且常规的解密手段往往需要花费很长的时间,成本较高,导致解密效率较低。

针对现有技术对加密文件的解密方法效率低的问题,目前尚未提出有效的解决方案。



技术实现要素:

本发明实施例提供了一种文件解密方法和装置,以至少解决现有技术对加密文件的解密方法效率低的技术问题。

根据本发明实施例的一个方面,提供了一种文件解密方法,包括:截获对加密文件进行解密而得到的解密结果;验证解密结果是否为将加密文件还原至未加密状态时的文件;在确定解密结果为将加密文件还原至未加密状态时的文件的情况下,将解密结果传输至第一类型函数,其中,第一类型函数用于获取允许虚拟机执行的中间代码。

根据本发明实施例的另一方面,还提供了一种文件解密装置,包括:截获模块,用于截获对加密文件进行解密而得到的解密结果;验证模块,用于验证解密结果是否为将加密文件还原至未加密状态时的文件;传输模块,用于在确定解密结果为将加密文件还原至未加密状态时的文件的情况下,将解密结果传输至第一类型函数,其中,第一类型函数用于获取允许虚拟机执行的中间代码。

本申请上述实施例通过截获对加密文件进行解密而得到的解密结果,并对解密结果进行验证,从而根据验证结果对加密文件进行对应的处理。现有技术对解密文件的解密效率低的原因在于现有技术通过修改加密代码中的关键函数,输出每一次执行的中间结果,从而得到最终解密文件,由于加密文件的灵活性或复杂性,现有技术的解密方法很难快速寻找和定位加密文件中的关键函数,而本申请上述实施例提供的方法,从通过截获加密结果,从而将解密过程迁移至脚本层,进而使得解密过程无需关注加密文件的加密方法,也不需要对加密文件进行修改,从而提高解密效率,解决了现有技术对加密文件的解密方法效率低的技术问题。

由此,本申请提供的文件解密方法解决了现有技术对加密文件的解密方法效率低的技术问题。

附图说明

此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:

图1是本发明实施例的一种文件解密方法的计算机终端的硬件结构框图;

图2是根据本发明实施例1的一种文件解密方法的流程图;

图3是根据本申请实施例1的一种可选的文件解密方法的流程图;

图4是根据本申请实施例1的一种可选的内核函数为zend_compile_string函数的php代码执行的流程图;

图5是根据本发明实施例1的一种可选的文件解密方法的流程图;

图6是根据本发明实施例2的一种文件解密装置的示意图;

图7是根据本发明实施例2的一种可选的文件解密装置的示意图;

图8是根据本发明实施例2的一种可选的文件解密装置的示意图;

图9是根据本发明实施例2的一种可选的文件解密装置的示意图;

图10是根据本发明实施例2的一种可选的文件解密装置的示意图;

图11是根据本发明实施例2的一种可选的文件解密装置的示意图;

图12是根据本发明实施例2的一种可选的文件解密装置的示意图;

图13是根据本发明实施例2的一种可选的文件解密装置的示意图;以及

图14是根据本申请实施例3的一种计算机终端的结构框图

具体实施方式

为了使本技术领域的人员更好地理解本发明方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分的实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范围。

需要说明的是,本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本发明的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。

首先,在对本申请实施例进行描述的过程中出现的部分名词或术语适用于如下解释:

截获:在本申请中,截获用于表征通过将原本指向内核函数的函数指针修改为指向解密函数,使得原本传入至内核函数的解密结果传入至解密函数进行解密。

内核函数:内核函数是为众多应用程序提供对计算机硬件的安全访问的一部分软件中所包含的函数,在本申请中,内核函数用于将代码编译为中间代码,其中,虚拟机通过执行中间代码,完成整个执行流程。

php:(hypertextpreprocessor,超文本预处理器)是一种通用开源脚本语言。语法吸收了c语言、java和perl的特点,利于学习,使用广泛,主要适用于web开发领域,php还可以执行编译后代码,编译可以达到加密和优化代码运行,使代码运行更快。

恶意脚本:恶意脚本是指一切以制造危害或者损害系统功能为目的而从软件系统中增加、改变或删除的任何脚本。传统的恶意脚本包括:病毒,蠕虫,特洛伊木马,和攻击性脚本。

后门文件:后门文件一般是指那些能够绕过安全性控制而获取对程序或系统访问权的程序文件。在软件的开发阶段,程序员常常会在软件内创建后门程序以便可以修改程序设计中的缺陷。但是,如果这些后门被其他人知道,或是在发布软件之前没有删除后门程序,那么它就成了安全风险,容易被黑客当成漏洞进行攻击。

混淆加密:混淆加密是将计算机程序的代码转换为一种功能上能够等价执行,但难于阅读和理解的形式的行为。

词法分析:是计算机科学中将字符序列转换为单词序列的过程。进行词法分析的程序或者函数叫作词法分析器(lexicalanalyzer,简称lexer),也叫扫描器(scanner)。词法分析器一般以函数的形式存在,供语法分析器调用。

语法分析:语法分析是编译过程的一个逻辑阶段。语法分析的任务是在词法分析的基础上将单词序列组合成各类语法短语,如“程序”,“语句”,“表达式”等等.语法分析程序判断源程序在结构上是否正确。

eval函数:eval()函数用于将字符串转换为代码执行,并返回一个或多个值。

hook:直译为钩子,是windows消息处理机制的一个平台,应用程序可以在上面设置子程序以监视制定串口的某种消息。钩子机制允许应用程序截获处理windows消息或者特定事件。

zend_compile_string:zend_compile_string函数为php的一个内核函数,其用于将php代码编译为虚拟机可以直接执行的机器码,加密和混淆过后的php代码,最终会解密后变为字符串,然后执行。

php_minit_function:该函数为模块加载时候的初始化函数,拓展在加载时,会首先通过该函数定义一些全局的常量、变量等。

zend虚拟机:在php代码执行过程中,执行词法分析、语法分析,编译中间代码,执行中间代码等各个部分统称为zend虚拟机。

实施例1

目前很多的恶意脚本和后门文件,为了躲避查杀会采用加密和混淆手段对自身代码进行保护,来增加被发现和逆向分析的难度。其中一种常见的加密手段为脚本层的混淆方法,该方法为通过多次随机调用php多个内置函数,例如eval、base64_encode、gzcompress等对自身代码进行加密。php代码脚本层的加密通常是将待加密的脚本代码作为一个字符串,使用内置或变形的字符串函数进行多次加密,执行时候通过对应的解密函数将密文按照顺序揭开,然后多次调用eval等函数执行代码。

根据本发明实施例,还提供了一种文件解密方法的方法实施例,需要说明的是,在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。

本申请实施例一所提供的方法实施例可以在移动终端、计算机终端或者类似的运算装置中执行。以运行在计算机终端上为例,图1是本发明实施例的一种文件解密方法的计算机终端的硬件结构框图。如图1所示,计算机终端10可以包括一个或多个(图中仅示出一个)处理器102(处理器102可以包括但不限于微处理器mcu或可编程逻辑器件fpga等的处理装置)、用于存储数据的存储器104、以及用于通信功能的传输模块106。本领域普通技术人员可以理解,图1所示的结构仅为示意,其并不对上述电子装置的结构造成限定。例如,计算机终端10还可包括比图1中所示更多或者更少的组件,或者具有与图1所示不同的配置。

存储器104可用于存储应用软件的软件程序以及模块,如本发明实施例中的文件解密方法对应的程序指令/模块,处理器102通过运行存储在存储器104内的软件程序以及模块,从而执行各种功能应用以及数据处理,即实现上述的文件解密方法。存储器104可包括高速随机存储器,还可包括非易失性存储器,如一个或者多个磁性存储装置、闪存、或者其他非易失性固态存储器。在一些实例中,存储器104可进一步包括相对于处理器102远程设置的存储器,这些远程存储器可以通过网络连接至计算机终端10。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。

传输装置106用于经由一个网络接收或者发送数据。上述的网络具体实例可包括计算机终端10的通信供应商提供的无线网络。在一个实例中,传输装置106包括一个网络适配器(networkinterfacecontroller,nic),其可通过基站与其他网络设备相连从而可与互联网进行通讯。在一个实例中,传输装置106可以为射频(radiofrequency,rf)模块,其用于通过无线方式与互联网进行通讯。

在上述运行环境下,本申请提供了如图2所示的文件解密方法。图2是根据本发明实施例1的一种文件解密方法的流程图。

步骤s21,截获对加密文件进行解密而得到的解密结果。

在一种可选的实施例中,以上述加密文件为加密的php代码作为示例,在对加密的php代码解密后,php内核函数会对解密后的代码进行词法分析和语法分析,然后通过内核函数将代码编译为中间代码,最后通过zend虚拟机执行中间代码,截获对加密文件进行解密而得到的解密结果,即在对加密的php代码解密,得到解密结果后,在php内核函数会对解密后的代码进行词法分析和语法分析之前,对解密结果尽心截取。

步骤s23,验证解密结果是否为将加密文件还原至未加密状态时的文件。

在上述步骤中。验证解密结果是否为将所述加密文件还原至未加密状态时的文件的方法可以是通过人工查询解密结果,也可以是通过将解密结果的格式、显示形式与通常未加密的文件进行比较,来得到验证结果,还可以通过对加密文件中的部分参数进行判别,来得到验证结果。

步骤s25,在确定解密结果为将加密文件还原至未加密状态时的文件的情况下,将解密结果传输至第一类型函数,其中,第一类型函数用于获取允许虚拟机执行的中间代码。

在上述步骤中,在确认解密结果为将加密文件还原至未加密状态时的文件的情况下,可以将解密结果传输至第一类型函数执行,通过第一函数来获取中间代码,虚拟机通过执行中间代码来来完成整个执行流程,其中,上述第一类型函数将解密结果进行编译得到虚拟机可以执行的机器码,即中间代码,上述第一类型函数可以是内核函数,例如:zend_compile_string函数。

在一种可选的实施例中,以如下php代码作为示例:

<?phpphpinfo();?>;

通过phpjm.net在线php代码加密平台对上述php代码进行加密,上述php代码变更为如下所示的代码,可以看到,在通过加密平台加密后的代码中,变量和函数名字均进过了混淆,可读性较差。

通过上述实施例1提供的解密方法,能够快速还原被加密的php代码,被还原后的php代码如下:

foundevalcode;

phpinfo();

doyouwanttocontinue[y/n]

在上述还原后的代码中,“foundevalcode”用于表示成功将加密的代码还原,即查找到转换后的代码,“phpinfo()”为实际被加密的原代码,“doyouwanttocontinue[y/n]”用于向用户询问是否继续进行解密还原。

本申请上述实施例通过截获对加密文件进行解密而得到的解密结果,并对解密结果进行验证,从而根据验证结果对加密文件进行对应的处理。现有技术对解密文件的解密效率低的原因在于现有技术通过修改加密代码中的关键函数,输出每一次执行的中间结果,从而得到最终解密文件,由于加密文件的灵活性或复杂性,现有技术的解密方法很难快速寻找和定位加密文件中的关键函数,而本申请上述实施例提供的方法,从通过截获加密结果,从而将解密过程迁移至脚本层,进而使得解密过程无需关注加密文件的加密方法,也不需要对加密文件进行修改,从而提高解密效率,解决了现有技术对加密文件的解密方法效率低的技术问题。

由此,本申请上述实施例1提供的文件解密方法解决了现有技术对加密文件的解密方法效率低的技术问题。

在本申请上述实施例中,在解密函数对所述加密文件进行解密之后,根据指向所述解密函数的函数指针来确定截获对加密文件进行解密而得到的解密结果。

在解密函数对加密文件进行解密之后,原本指向内核函数的函数指针通过指向解密函数,来截获原本要传入内核函数的解密结果。

在本申请上述实施例中,步骤s21,截获对加密文件进行解密而得到的解密结果,包括:

步骤s211,在执行php脚本的过程中,截获解密函数对加密文件进行解密而得到的解密结果,其中,解密函数按照预定次数重复解密加密文件。

在一种可选的实施例中,仍以上述加密过的php代码作为示例,在截取解密结果之前,可以通过解密函数重复多次对加密的php代码进行解密,以提高加密的php代码被完全解密的概率,从而减少截获的解密结果不是将加密文件还原至未加密状态时的文件,导致返回对加密文件继续进行加密的步骤,从而进一步的提高对加密文件的解密效率。

此处需要说明是,本申请对上述预设的次数不做具体限定,在预设的次数较大的情况下,截获得到的解密结果为将加密文件还原至未加密状态时的文件的概率更大。

在本申请上述实施例中,上述方法还包括:

步骤s27,在确定解密结果不是将加密文件还原至未加密状态时的文件的情况下,对加密文件继续进行解密。

在上述步骤中,不是将加密文件还原至未加密状态时的文件的解密结果可以是加密文件中一部分文件解密成功,一部分文件未解密成功的解密结果,也可以是由于加密文件进行了多次加密,而解密次数不足导致的加密文件解密不完全的解密结果。

在本申请上述实施例中,步骤s23,验证解密结果是否为将加密文件还原至未加密状态时的文件,包括:

步骤s231,判断解密结果包含的代码是否满足预定条件,代码至少包括:函数和变量。

在上述步骤中,将代码的函数和变量作为判断解密结果是否为将加密文件还原至未加密状态时的文件的条件,并设置预设条件来对代码的函数和变量进行判断。

步骤s233,在解密结果包含的代码满足预定条件的情况下,确定解密结果为将加密文件还原至未加密状态时的文件。

步骤s235,在解密结果包含的代码不满足预定条件的情况下,确定解密结果为中间解密结果。

在一种可选的实施例中,仍以上述加密文件为加密过的php代码为例,在加密的php代码进行混淆加密的情况下,由于混淆加密通常是对代码的函数、变量名称进行改变,因此通过对解密结果包含的代码的函数和变量是否满足预设条件进行判断,来确定截获的解密结果是否为将加密文件还原至未加密状态时的文件,上述预设的条件可以是完全解密或的代码与未解密或未完全解密的代码的区别之处,如果截获的解密结果中包含的php代码满足上述预设条件,则确认截获的解密结果为最终的解密结果,否则,确认截获的解密结果为并未解密成功或并未完全解密的中间解密结果。

此处需要说明的是,通常情况下,一段未被加密或已被完全解密的代码与加密后的代码具有较大的区别,加密后的代码通常是对代码中的函数和变量进行混淆,将代码的变量、函数、类的名称被改变成无意义的名称(例如:将变量名称修改为单个字母或简短的无意义的字母组合),从而导致代码可读性差,使阅读的人无法阅读混淆后的代码,因此可以通过将代码的函数和变量来判断解密结果包括的代码是否满足预设条件,并将截获的解密结果包含的代码是否满足预设提交作为判断解密结果是否为将加密文件还原至未加密状态时的文件的方法。

在本申请上述实施例中,预定条件包括如下任意一个或多个条件:

代码中包含的函数和/或变量的数量是否超过预定数量;

代码中包含的函数和/或变量的长度是否超过预定长度;

代码中包含的代码逻辑复杂度是否超过预定复杂度。

在一种可选的实施例中,仍以上述加密文件为加密过的php代码为例,在加密的php代码进行混淆加密的情况下,截获的解密结果包含的代码中的函数以及变量的长度,均小于预设的长度,因此可以认为上述php代码仍未加密过的php代码,即该php代码仍未被完全解密,因此,该解密结果包含的代码不能满足预设条件,从而可以确认该解密结果不为将加密文件还原至未加密状态时的文件,需要返回解密函数继续进行解密。

此处需要说明的是,由于通常被经过混淆器混淆或加密的代码通常由于对函数、变量或类的名称通过剪短的英文或字母甚至符号所代替,因此被加密的文件中包含的代码通常会减少原本的函数和/或变量、长度,或降低复杂度。上述步骤利用加密代码的这一特点,设置代码中包含的函数和/或变量的预定次数、预定长度或代码逻辑的预设复杂度来实现对未解密或未完全解密的代码与将加密文件还原至未加密状态时的文件包含的代码的区分。

在本申请上述实施例中,步骤s29,在验证解密结果是否为将加密文件还原至未加密状态时的文件之前,方法还包括:

步骤s291,判断解密结果是否为字符串。

步骤s293,在解密结果是字符串的情况下,则执行验证解密结果是否为将加密文件还原至未加密状态时的文件的步骤。

步骤s295,在解密结果不是字符串的情况下,则确定解密结果为未加密的数据。

在一种可选的实施例中,加密文件中的部分文件并未被加密,因此在验证解密结果是否为将加密文件还原至未加密状态时的文件之前,通过对解密结果是否为字符串进行判断,来判断解密结果是否为未加密的文件。

在一种可选的实施例中,仍以上述加密文件为加密过的php代码为例,php代码脚本层的加密,通常是将待加密的脚本代码作为一个字符串,使用内置或变形的字符串函数进行多次加密,执行时候通过对应的解密函数将密文按照顺序揭开,然后多次调用eval等函数执行代码,因此解密结果如果不是字符串,则确认解密结果为未加密的数据。

在本申请上述实施例中,步骤s27,返回对加密文件继续进行解密,包括:

步骤s271,调用解密函数。

步骤s273,解密函数基于解密结果对加密文件进行解密。

在上述步骤中,调用解密函数的步骤可以是通过修改内核函数的指针来实现。上述解密结果可以是中间解密结果,解密函数可以在中间解密结果的基础上,对加密文件进行解密。

在一种可选的实施例中,上述解密结果中,包含部分未解密的加密文件,加密文件被返回调用解密函数,继续对加密文件进行解密时,加密函数可以查看上述解密结果,对已经解密的部分不做处理,仅对上述解密结果中未解密的部分进行进一步解密。

在本申请上述实施例中,步骤s31,在截获对加密文件进行解密而得到的解密结果之前,方法还包括:

步骤s311,在php内核中预设初始化函数。

在上述步骤中,初始化函数可以是php内核中预置了php_minit_function宏函数,此函数为模块加载时候的初始化函数,拓展在加载时,会首先通过该函数定义一些全局的常量、变量等,用于为执行php程序创建一个执行环境,包括保存php运行过程中变量名称和值内容的符号表,以及当前所有的函数以及类等信息的符号表。

步骤s313,通过初始化函数修改内核函数的函数指针至解密函数,其中,解密函数用于在执行php脚本的过程中,对加密文件进行解密。

在上述步骤中,通过修改内核函数的函数指针至解密函数,将原来传入内核函数的参数,首先传入预设函数中进行处理,而上述预设的函数可以是解密函数,从而实现了在脚本层对加密文件进行解密的效果。

在解密函数对加密文件进行解密之后,传入内核函数的传入参数成为解密结果,在解密结果为将加密文件还原至未加密状态时的文件的情况下,将内核函数的指针修改为原内核指针的地址,从而可以保持继续执行上述加密文件,在解密结果不为将加密文件还原至未加密状态时的文件的情况下,保持内核函数的指针指向解密函数,从而继续使用解密函数对加密文件进行解密,直至得到的解密结果不是中间解密结果,而是将加密文件还原至未加密状态时的文件。

图3是根据本申请实施例1的一种可选的文件解密方法的流程图,在一种可选的实施例中,结合图3所示,以加密文件为加密的php代码作为示例,通常在php程序执行php代码之前,需要加载注册的拓展模块,该实施例使用内置函数php_minit_function对拓展模块进行加载时,判断模块是否已经被加载,如果拓展模块已经被加载,则其他家在模块,如果加载模块未被加载,则修改内核函数的指针,将指针指向解密函数,从而使得原本传入内核函数的参数传入预设的解密函数,来对加密文件进行解密。上述步骤可以由php内核中的hook模块完成。

在本申请上述实施例中,上述第一类型函数为内核函数,其中,在内核函数为zend_compile_string函数的情况下,内核函数用于将进行词法分析和/或语法分析后得到的字符串代码编译为所述中间代码。

在上述步骤中,zend_compile_string函数为php的一个内核函数,其用于将php代码编译为虚拟机可以直接执行的机器码,加密和混淆过后的php代码,最终会解密后变为字符串,然后执行。

图4是根据本申请实施例1的一种可选的第一类型函数为zend_compile_string函数的php代码执行的流程图,在一种可选的实施例中,结合图4所示,仍以加密文件为加密的php代码作为示例,向php程序输入php代码后,php内核首先对php代码进行词法分析和语法分析,然后调用zend_compile_string函数对php代码进行编译,得到虚拟机能够运行的机器码,由zend虚拟机来执行。

此处需要说明的是,php脚本在执行过程中,php内核会首先对代码进行词法分析和语法分析,然后通过内核函数将代码编译为中间代码,最后通过zend虚拟机执行中间代码,完成整个执行流程。在编译为中间代码的过程中,会将php代码的函数转化为php内核中的函数进行执行,其中zend_compile_string函数功能为将字符串编译为中间代码的内核函数,当php代码中使用eval、assert等函数执行代码时,最终都会进入php内核中的zend_compile_string进行处理。因此,可以通过加载拓展模块来修改zend_compile_string函数的指针,从而使解密函数获取加密的php代码以及中间解密结果,从而使得解密函数对加密的php代码进行解密,进而得到将加密文件还原至未加密状态时的文件。

图5是根据本发明实施例1的一种可选的文件解密方法的流程图,结合5所示的方法,对文件解密方法进行进一步描述。

步骤s51,解密函数对加密文件进行解密。

在上述步骤中,可以通过在php内核中预设初始化函数,通过初始化函数修改所述内核函数的函数指针至解密函数,从而使得解密函数得到加密文件,并对加密文件进行解密。

步骤s52,得到传入参数。

在上述步骤中,传入参数可以是每次执行解密后的中间结果,中间结果可以是将加密文件还原至未加密状态时的文件,也可以是中间解密结果。

步骤s53,判断传入参数是否为字符串。

在上述步骤中,在上述传入参数是字符串的情况下,进入步骤s55,否则,进入步骤s54。

仍以上述加密文件为加密过的php代码为例,php代码脚本层的加密,通常是将待加密的脚本代码作为一个字符串,使用内置或变形的字符串函数进行多次加密,执行时候通过对应的解密函数将密文按照顺序揭开,然后多次调用eval等函数执行代码,因此解密结果如果不是字符串,则确认解密结果为未加密的数据。

步骤s54,退出解密步骤。

根据上述步骤可以知晓,在判断得到传入次数不为字符串的情况下,可以认为上述传入参数并未进行加密,因此退出解密步骤。

步骤s55,是否继续执行解密。

在上述步骤中,是否继续执行解密在于验证解密结果是否为将加密文件还原至未加密状态时的文件,在确定解密结果不是将加密文件还原至未加密状态时的文件的情况下,返回对加密文件继续进行解密;在确定解密结果为将加密文件还原至未加密状态时的文件的情况下,将解密结果传输至内核函数。

其中,验证解密结果是否为将加密文件还原至未加密状态时的文件的方法可以是判断解密结果包含的代码是否满足如下任意条件中的一条或多条:代码中包含的函数和/或变量的数量是否超过预定数量;代码中包含的函数和/或变量的长度是否超过预定长度;代码中包含的代码逻辑复杂度是否超过预定复杂度;在解密结果包含的代码满足预定条件的情况下,确定解密结果为将加密文件还原至未加密状态时的文件,否则,确定解密结果为中间解密结果。

步骤s56,返回zend_compile_string函数处理。

在上述步骤中,在确定传入参数为将加密文件还原至未加密状态时的文件的情况下,结束上述解密流程,将解密结果返回至zend_compile_string函数,继续执行上述文件。

需要说明的是,对于前述的各方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本发明并不受所描述的动作顺序的限制,因为依据本发明,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定是本发明所必须的。

通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到根据上述实施例的方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质(如rom/ram、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。

实施例2

根据本发明实施例,还提供了一种用于实施上述文件解密方法的文件解密装置,如图6所示,该装置包括:

截获模块60,用于截获对加密文件进行解密而得到的解密结果;验证模块62,用于验证解密结果是否为将加密文件还原至未加密状态时的文件;传输模块64,用于在确定解密结果为将加密文件还原至未加密状态时的文件的情况下,将解密结果传输至第一类型函数,其中,第一类型函数用于获取允许虚拟机执行的中间代码。

此处需要说明的是,上述截获模块60、验证模块62和传输模块64对应于实施例1中的步骤s21至步骤s25,两个模块与对应的步骤所实现的实例和应用场景相同,但不限于上述实施例一所公开的内容。需要说明的是,上述模块作为装置的一部分可以运行在实施例一提供的计算机终端10中。

在上述装置中,验证解密结果是否为将加密文件还原至未加密状态时的文件的方法可以通过人工查询解密结果,也可以通过将解密结果的格式、显示形式或与通常未加密的文件进行比较,来得到验证结果,还可以通过对加密文件中的部分参数进行判别,来得到验证结果。

本申请上述实施例通过截获对加密文件进行解密而得到的解密结果,并对解密结果进行验证,从而根据验证结果对加密文件进行对应的处理。现有技术对解密文件的解密效率低的原因在于现有技术通过修改加密代码中的关键函数,输出每一次执行的中间结果,从而得到最终解密文件,由于加密文件的灵活性或复杂性,现有技术的解密方法很难快速寻找和定位加密文件中的关键函数,而本申请上述实施例提供的方法,从通过截获加密结果,从而将解密过程迁移至脚本层,进而使得解密过程无需关注加密文件的加密方法,也不需要对加密文件进行修改,从而提高解密效率,解决了现有技术对加密文件的解密方法效率低的技术问题。

由此,本申请上述实施例2提供的文件解密装置解决了现有技术对加密文件的解密方法效率低的技术问题。

根据本申请上述实施例,结合图7所示,装置还包括:

第一确定模块70,用于根据指向解密函数的函数指针来确定截获对加密文件进行解密而得到的解密结果。

在解密函数对加密文件进行解密之后,原本指向内核函数的函数指针通过指向解密函数,来截获原本要传入内核函数的解密结果。

根据本申请上述实施例,结合图8所示,上述截获模块60包括:

截获子模块80,用于在执行php脚本的过程中,截获解密函数对加密文件进行解密而得到的解密结果,其中,解密函数按照预定次数重复解密加密文件。

此处需要说明的是,上述截获子模块80对应于实施例1中的步骤s211,两个模块与对应的步骤所实现的实例和应用场景相同,但不限于上述实施例一所公开的内容。需要说明的是,上述模块作为装置的一部分可以运行在实施例一提供的计算机终端10中。

根据本申请上述实施例,结合图9所示,上述装置还包括:

第一解密模块90,用于在确定解密结果不是将加密文件还原至未加密状态时的文件的情况下,对所述加密文件继续进行解密。

此处需要说明的是,第一解密模块90对应于实施例1中的步骤s27,模块与对应的步骤所实现的实例和应用场景相同,但不限于上述实施例一所公开的内容。需要说明的是,上述模块作为装置的一部分可以运行在实施例一提供的计算机终端10中。

根据本申请上述实施例,结合图10所示,上述验证模块62包括:

第一判断模块100,用于判断解密结果包含的代码是否满足预定条件,代码至少包括:函数和变量;第一子确定模块102,用于在解密结果包含的代码满足预定条件的情况下,确定解密结果为将加密文件还原至未加密状态时的文件;第二子确定模块104,用于在解密结果包含的代码不满足预定条件的情况下,确定解密结果为中间解密结果。

此处需要说明的是,第一判断模块100、第一子确定模块102和第二子确定模块104对应于实施例1中的步骤s231至步骤s235,三个模块与对应的步骤所实现的实例和应用场景相同,但不限于上述实施例一所公开的内容。需要说明的是,上述模块作为装置的一部分可以运行在实施例一提供的计算机终端10中。

根据本申请上述实施例,上述预定条件包括如下任意一个或多个条件:

代码中包含的函数和/或变量的数量是否超过预定数量;

代码中包含的函数和/或变量的长度是否超过预定长度;

代码中包含的代码逻辑复杂度是否超过预定复杂度。

在一种可选的实施例中,仍以上述加密文件为加密过的php代码为例,在加密的php代码进行混淆加密的情况下,截获的解密结果包含的代码中的函数以及变量的长度,均小于预设的长度,因此可以认为上述php代码仍未加密过的php代码,即该php代码仍未被完全解密,因此,该解密结果包含的代码不能满足预设条件,从而可以确认该解密结果不为将加密文件还原至未加密状态时的文件,需要返回解密函数继续进行解密。

此处需要说明的是,由于通常被经过混淆器混淆或加密的代码通常由于对函数、变量或类的名称通过剪短的英文或字母甚至符号所代替,因此被加密的文件中包含的代码通常会减少原本的函数和/或变量、长度,或降低复杂度。上述步骤利用加密代码的这一特点,设置代码中包含的函数和/或变量的预定次数、预定长度或代码逻辑的预设复杂度来实现对未解密或为完全解密的代码与将加密文件还原至未加密状态时的文件包含的代码的区分。

根据本申请上述实施例,结合图11所示,上述装置还包括:

第二判断模块110,用于判断解密结果是否为字符串;执行模块112,用于在解密结果是字符串的情况下,则执行验证解密结果是否为将加密文件还原至未加密状态时的文件的步骤;第二确定模块114,用于在解密结果不是字符串的情况下,则确定解密结果为未加密的数据。

此处需要说明的是,第二判断模块110、执行模块112和第二确定模块114对应于实施例1中的步骤s291至步骤s295,三个模块与对应的步骤所实现的实例和应用场景相同,但不限于上述实施例一所公开的内容。需要说明的是,上述模块作为装置的一部分可以运行在实施例一提供的计算机终端10中。

根据本申请上述实施例,结合图12所示,上述第一解密模块90包括:

调用模块120,用于调用解密函数;第二解密模块122,用于解密函数基于解密结果对加密文件进行解密。

此处需要说明的是,调用模块120和第二解密模块122对应于实施例1中的步骤s271至步骤s273,两个模块与对应的步骤所实现的实例和应用场景相同,但不限于上述实施例一所公开的内容。需要说明的是,上述模块作为装置的一部分可以运行在实施例一提供的计算机终端10中。

根据本申请上述实施例,结合图13所示,上述装置还包括:

初始化模块130,用于在php内核中预设初始化函数;修改模块132,用于通过初始化函数修改内核函数的函数指针至解密函数,其中,解密函数用于在执行php脚本的过程中,对加密文件进行解密。

此处需要说明的是,初始化模块130和修改模块132对应于实施例1中的步骤s311至步骤s313,两个模块与对应的步骤所实现的实例和应用场景相同,但不限于上述实施例一所公开的内容。需要说明的是,上述模块作为装置的一部分可以运行在实施例一提供的计算机终端10中。

根据本申请上述实施例,上述内核函数为zend_compile_string函数。

在上述步骤中,zend_compile_string函数为php的一个内核函数,其用于将php代码编译为虚拟机可以直接执行的机器码,加密和混淆过后的php代码,最终会解密后变为字符串,然后执行。

此处需要说明的是,php脚本在执行过程中,php内核会首先对代码进行词法分析和语法分析,然后通过内核函数将代码编译为中间代码,最后通过zend虚拟机执行中间代码,完成整个执行流程。在编译为中间代码的过程中,会将php代码的函数转化为php内核中的函数进行执行,其中zend_compile_string函数功能为将字符串编译为中间代码的内核函数,当php代码中使用eval、assert等函数执行代码时,最终都会进入php内核中的zend_compile_string进行处理。因此,可以通过加载拓展模块来修改zend_compile_string函数的指针,从而使解密函数获取加密的php代码以及中间解密结果,从而使得解密函数对加密的php代码进行解密,进而得到将加密文件还原至未加密状态时的文件。

实施例3

本发明的实施例可以提供一种计算机终端,该计算机终端可以是计算机终端群中的任意一个计算机终端设备。可选地,在本实施例中,上述计算机终端也可以替换为移动终端等终端设备。

可选地,在本实施例中,上述计算机终端可以位于计算机网络的多个网络设备中的至少一个网络设备。

在本实施例中,上述计算机终端可以执行密脚本文件的方法中以下步骤的程序代码:截获对加密文件进行解密而得到的解密结果;验证解密结果是否为将加密文件还原至未加密状态时的文件;在确定解密结果为将加密文件还原至未加密状态时的文件的情况下,将解密结果传输至内核函数。本发明解决了现有技术对加密文件的解密方法效率低的技术问题。

可选地,图14是根据本申请实施例3的一种计算机终端的结构框图。如图14所示,该计算机终端a可以包括:一个或多个(图中仅示出一个)处理器1401、存储器1403、以及传输装置1405。

其中,存储器可用于存储软件程序以及模块,如本发明实施例中的密脚本文件的方法和装置对应的程序指令/模块,处理器通过运行存储在存储器内的软件程序以及模块,从而执行各种功能应用以及数据处理,即实现上述的密脚本文件的方法。存储器可包括高速随机存储器,还可以包括非易失性存储器,如一个或者多个磁性存储装置、闪存、或者其他非易失性固态存储器。在一些实例中,存储器可进一步包括相对于处理器远程设置的存储器,这些远程存储器可以通过网络连接至终端a。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。

处理器可以通过传输装置调用存储器存储的信息及应用程序,以执行下述步骤:截获对加密文件进行解密而得到的解密结果;验证解密结果是否为将加密文件还原至未加密状态时的文件;在确定解密结果为将加密文件还原至未加密状态时的文件的情况下,将解密结果传输至内核函数。本发明解决了现有技术对加密文件的解密方法效率低的技术问题。

可选的,上述处理器还可以执行如下步骤的程序代码:截获对加密文件进行解密而得到的解密结果,包括:在执行php脚本的过程中,截获解密函数对加密文件进行解密而得到的解密结果,其中,解密函数按照预定次数重复解密加密文件。

可选的,上述处理器还可以执行如下步骤的程序代码:在确定解密结果不是将加密文件还原至未加密状态时的文件的情况下,对加密文件继续进行解密。

可选的,上述处理器还可以执行如下步骤的程序代码:验证解密结果是否为将加密文件还原至未加密状态时的文件,包括:判断解密结果包含的代码是否满足预定条件,代码至少包括:函数和变量;在解密结果包含的代码满足预定条件的情况下,确定解密结果为将加密文件还原至未加密状态时的文件;在解密结果包含的代码不满足预定条件的情况下,确定解密结果为中间解密结果。

可选的,上述处理器还可以执行如下步骤的程序代码:预定条件包括如下任意一个或多个条件:代码中包含的函数和/或变量的数量是否超过预定数量;代码中包含的函数和/或变量的长度是否超过预定长度;代码中包含的代码逻辑复杂度是否超过预定复杂度。

可选的,上述处理器还可以执行如下步骤的程序代码:在验证解密结果是否为将加密文件还原至未加密状态时的文件之前,方法还包括:判断解密结果是否为字符串;在解密结果是字符串的情况下,则执行验证解密结果是否为将加密文件还原至未加密状态时的文件的步骤;在解密结果不是字符串的情况下,则确定解密结果为未加密的数据。

可选的,上述处理器还可以执行如下步骤的程序代码:返回对加密文件继续进行解密,包括:返回调用解密函数;解密函数基于解密结果对加密文件进行解密。

可选的,上述处理器还可以执行如下步骤的程序代码:在截获对加密文件进行解密而得到的解密结果之前,方法还包括:在php内核中预设初始化函数;通过初始化函数修改内核函数的函数指针至解密函数,其中,解密函数用于在执行php脚本的过程中,对加密文件进行解密。

可选的,上述处理器还可以执行如下步骤的程序代码:内核函数为zend_compile_string函数。

本申请上述实施例通过截获对加密文件进行解密而得到的解密结果,并对解密结果进行验证,从而根据验证结果对加密文件进行对应的处理。现有技术对解密文件的解密效率低的原因在于现有技术通过修改加密代码中的关键函数,输出每一次执行的中间结果,从而得到最终解密文件,由于加密文件的灵活性或复杂性,现有技术的解密方法很难快速寻找和定位加密文件中的关键函数,而本申请上述实施例提供的方法,从通过截获加密结果,从而将解密过程迁移至脚本层,进而使得解密过程无需关注加密文件的加密方法,也不需要对加密文件进行修改,从而提高解密效率,解决了现有技术对加密文件的解密方法效率低的技术问题。

由此,本申请上述方案提供的文件解密方法解决了现有技术对加密文件的解密方法效率低的技术问题。

本领域普通技术人员可以理解,图14所示的结构仅为示意,计算机终端也可以是智能手机(如android手机、ios手机等)、平板电脑、掌声电脑以及移动互联网设备(mobileinternetdevices,mid)、pad等终端设备。图14其并不对上述电子装置的结构造成限定。例如,计算机终端14还可包括比图14中所示更多或者更少的组件(如网络接口、显示装置等),或者具有与图14所示不同的配置。

本领域普通技术人员可以理解上述实施例的各种方法中的全部或部分步骤是可以通过程序来指令终端设备相关的硬件来完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:闪存盘、只读存储器(read-onlymemory,rom)、随机存取器(randomaccessmemory,ram)、磁盘或光盘等。

实施例4

本发明的实施例还提供了一种存储介质。可选地,在本实施例中,上述存储介质可以用于保存上述实施例一所提供的密脚本文件的方法所执行的程序代码。

可选地,在本实施例中,上述存储介质可以位于计算机网络中计算机终端群中的任意一个计算机终端中,或者位于移动终端群中的任意一个移动终端中。

可选地,在本实施例中,存储介质被设置为存储用于执行以下步骤的程序代码:截获对加密文件进行解密而得到的解密结果;验证解密结果是否为将加密文件还原至未加密状态时的文件;在确定解密结果为将加密文件还原至未加密状态时的文件的情况下,将解密结果传输至内核函数。本发明解决了现有技术对加密文件的解密方法效率低的技术问题。

可选地,在本实施例中,存储介质被设置为存储用于执行以下步骤的程序代码:截获对加密文件进行解密而得到的解密结果,包括:在执行php脚本的过程中,截获解密函数对加密文件进行解密而得到的解密结果,其中,解密函数按照预定次数重复解密加密文件。

可选的,上述处理器还可以执行如下步骤的程序代码:在确定解密结果不是将加密文件还原至未加密状态时的文件的情况下,对加密文件继续进行解密。

可选地,在本实施例中,存储介质被设置为存储用于执行以下步骤的程序代码:验证解密结果是否将加密文件还原至未加密状态时的文件,包括:判断解密结果包含的代码是否满足预定条件,代码至少包括:函数和变量;在解密结果包含的代码满足预定条件的情况下,确定解密结果为将加密文件还原至未加密状态时的文件;在解密结果包含的代码不满足预定条件的情况下,确定解密结果为中间解密结果。

可选地,在本实施例中,存储介质被设置为存储用于执行以下步骤的程序代码:预定条件包括如下任意一个或多个条件:代码中包含的函数和/或变量的数量是否超过预定数量;代码中包含的函数和/或变量的长度是否超过预定长度;代码中包含的代码逻辑复杂度是否超过预定复杂度。

可选地,在本实施例中,存储介质被设置为存储用于执行以下步骤的程序代码:在验证解密结果是否为将加密文件还原至未加密状态时的文件之前,方法还包括:判断解密结果是否为字符串;在解密结果是字符串的情况下,则执行验证解密结果是否为将加密文件还原至未加密状态时的文件的步骤;在解密结果不是字符串的情况下,则确定解密结果为未加密的数据。

可选地,在本实施例中,存储介质被设置为存储用于执行以下步骤的程序代码:返回对加密文件继续进行解密,包括:返回调用解密函数;解密函数基于解密结果对加密文件进行解密。

可选地,在本实施例中,存储介质被设置为存储用于执行以下步骤的程序代码:在截获对加密文件进行解密而得到的解密结果之前,方法还包括:在php内核中预设初始化函数;通过初始化函数修改内核函数的函数指针至解密函数,其中,解密函数用于在执行php脚本的过程中,对加密文件进行解密。

可选地,在本实施例中,存储介质被设置为存储用于执行以下步骤的程序代码:内核函数为zend_compile_string函数。

上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。

在本发明的上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。

在本申请所提供的几个实施例中,应该理解到,所揭露的技术内容,可通过其它的方式实现。其中,以上所描述的装置实施例仅仅是示意性的,例如所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,单元或模块的间接耦合或通信连接,可以是电性或其它的形式。

所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。

另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。

所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可为个人计算机、服务器或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、只读存储器(rom,read-onlymemory)、随机存取存储器(ram,randomaccessmemory)、移动硬盘、磁碟或者光盘等各种可以存储程序代码的介质。

以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1