CN110515652B - 代码摘要的生成方法、装置和存储介质 - Google Patents
代码摘要的生成方法、装置和存储介质 Download PDFInfo
- Publication number
- CN110515652B CN110515652B CN201910816817.9A CN201910816817A CN110515652B CN 110515652 B CN110515652 B CN 110515652B CN 201910816817 A CN201910816817 A CN 201910816817A CN 110515652 B CN110515652 B CN 110515652B
- Authority
- CN
- China
- Prior art keywords
- instruction
- queue
- computer
- executed
- current
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/72—Code refactoring
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
- Debugging And Monitoring (AREA)
Abstract
本申请提供一种代码摘要的生成方法、装置和存储介质,获取由可执行文件编译得到的指令队列后,从指令队列中确定出与可执行文件的有效代码对应的待执行队列,然后在模拟环境中执行待执行队列的部分或全部计算机指令,从而识别出每一条被执行的计算机指令的操作码。最后利用消息摘要算法计算识别得到的操作码,得到代码摘要。本方案通过在模拟环境中执行计算机指令,识别出计算机指令的操作码,并针对识别得到的操作码计算得到代码摘要。计算机指令的操作码的取值只取决于对应的可执行文件,而不受加载地址的影响,因此,本发明能够确保在可执行文件不发生变化的前提下,每次计算得到的代码摘要完全一致,从而避免加载地址的干扰导致的误判。
Description
技术领域
本发明涉及计算机技术领域,特别涉及一种代码摘要的生成方法、装置和存储介质。
背景技术
代码摘要是计算机领域,特别是涉及查杀计算机病毒,反制外挂程序的计算机安全领域常用的一种技术手段。将可执行文件编译得到对应的指令队列后,利用消息摘要算法计算指令队列中的计算机指令,得到的计算结果就是这个可执行文件的代码摘要。
具体的,可以定期生成可执行文件的代码摘要,并将当前的代码摘要与以往的代码摘要比较,若当前的代码摘要与以往的代码摘要不一致,就表示可执行文件可能携带病毒或者被外挂程序篡改。
现有的生成代码摘要的技术,直接对可执行文件编译得到的计算机指令中的操作码和操作数进行全文摘要。然而,每次一个可执行文件被执行时,用于加载这个可执行文件的内存地址一般与前一次执行时的加载地址不同,这会导致同一个可执行文件编译得到的计算机指令中的操作数发生变化,进而使得代码摘要发生变化,最终引起误判。
发明内容
基于上述现有技术的缺点,本发明提供一种代码摘要的生成方法、装置和存储介质,以解决现有的代码摘要技术生成的代码摘要受可执行文件的加载地址干扰的问题。
本发明第一方面提供一种代码摘要的生成方法,包括:
获取指令队列;其中,所述指令队列包括多条计算机指令;所述计算机指令由可执行文件编译得到;
从所述指令队列中确定出待执行队列;其中,所述待执行队列对应于所述可执行文件中的有效代码;
在模拟环境中执行所述待执行队列的部分或全部计算机指令,从而识别出每一条被执行的计算机指令的操作码;其中,识别得到的每一条计算机指令的操作码组合为所述待执行队列的操作码集合;
利用消息摘要算法计算所述操作码集合,得到所述可执行文件的代码摘要。
可选地,所述从所述指令队列中确定出待执行队列,包括:
利用反汇编引擎识别出所述指令队列中的第一个函数头和最后一个函数头;其中,所述指令队列中,每N条连续的有效计算机指令作为一个函数头;所述N是预设的正整数;
将所述指令队列的第一个函数头作为所述待执行队列的起始位置,并且,将所述指令队列的最后一个函数头作为所述待执行队列的结束位置;
将所述起始位置的计算机指令,所述结束位置的计算机指令,以及所述起始位置和所述结束位置之间的计算机指令,组合为所述待执行队列。
可选地,所述在模拟环境中执行所述待执行队列的部分或全部计算机指令,从而识别出每一条被执行的计算机指令的操作码,包括:
判断所述待执行队的计算机指令的数量是否大于第一阈值;
若所述待执行队列的计算机指令的数量大于所述第一阈值,根据所述待执行队列的计算机指令的数量以及所述第一阈值,将所述待执行队列划分为多个子队列;
在模拟环境中执行每一个所述子队列的部分或全部计算机指令,从而识别出每一个所述子队列的每一条被执行的计算机指令的操作码;
若所述待执行队列的计算机指令的数量小于或等于所述第一阈值,在模拟环境中执行所述待执行队列的部分或全部计算机指令,从而识别出每一条被执行的计算机指令的操作码。
可选地,所述在模拟环境中执行每一个所述子队列的部分或全部计算机指令,从而识别出每一个所述子队列的每一条被执行的计算机指令的操作码,包括:
针对所述子队列的每一条有效计算机指令,判断所述有效计算机指令对应的汇编指令是否为跳转指令;
针对所述子队列的每一条有效计算机指令,若判断出所述有效计算机指令对应的汇编指令不为跳转指令,在模拟环境中执行所述有效计算机指令,从而识别出所述有效计算机指令的操作码。
可选地,所述在模拟环境中执行所述待执行队列的部分或全部计算机指令,从而识别出每一条被执行的计算机指令的操作码,包括:
针对所述待执行队列的每一条有效计算机指令,判断所述有效计算机指令对应的汇编指令是否为跳转指令;
针对所述待执行队列的每一条有效计算机指令,若判断出所述有效计算机指令对应的汇编指令不为跳转指令,在模拟环境中执行所述有效计算机指令,从而识别出所述有效计算机指令的操作码。
本发明第二方面提供一种代码摘要的生成装置,包括:
获取单元,用于获取指令队列;其中,所述指令队列包括多条计算机指令;所述计算机指令由可执行文件编译得到;
确定单元,用于从所述指令队列中确定出待执行队列;其中,所述待执行队列对应于所述可执行文件中的有效代码;
识别单元,用于在模拟环境中执行所述待执行队列的部分或全部计算机指令,从而识别出每一条被执行的计算机指令的操作码;其中,识别得到的每一条计算机指令的操作码组合为所述待执行队列的操作码集合;
计算单元,用于利用消息摘要算法计算所述操作码集合,得到所述可执行文件的代码摘要。
可选地,所述确定单元包括:
子识别单元,用于利用反汇编引擎识别出所述指令队列中的第一个函数头和最后一个函数头;其中,所述指令队列中,每N条连续的有效计算机指令作为一个函数头;所述N是预设的正整数;
子确定单元,用于将所述指令队列的第一个函数头作为所述待执行队列的起始位置,并且,将所述指令队列的最后一个函数头作为所述待执行队列的结束位置;
组合单元,用于将所述起始位置的计算机指令,所述结束位置的计算机指令,以及所述起始位置和所述结束位置之间的计算机指令,组合为所述待执行队列。
可选地,所述识别单元,包括:
判断单元,用于判断所述待执行队的计算机指令的数量是否大于第一阈值;
划分单元用于,若所述待执行队列的计算机指令的数量大于所述第一阈值,根据所述待执行队列的计算机指令的数量以及所述第一阈值,将所述待执行队列划分为多个子队列;
执行单元,用于在模拟环境中执行每一个所述子队列的部分或全部计算机指令,从而识别出每一个所述子队列的每一条被执行的计算机指令的操作码;
所述执行单元用于,若所述待执行队列的计算机指令的数量小于或等于所述第一阈值,在模拟环境中执行所述待执行队列的部分或全部计算机指令,从而识别出每一条被执行的计算机指令的操作码。
可选地,所述执行单元在模拟环境中执行所述待执行队列的部分或全部计算机指令,从而识别出每一条被执行的计算机指令的操作码时,具体用于:
针对所述待执行队列的每一条有效计算机指令,判断所述有效计算机指令对应的汇编指令是否为跳转指令;
针对所述待执行队列的每一条有效计算机指令,若判断出所述有效计算机指令对应的汇编指令不为跳转指令,在模拟环境中执行所述有效计算机指令,从而识别出所述有效计算机指令的操作码。
本发明第三方面提供一种存储介质,用于存储程序,所述程序被执行时,用于实现如第一方面任意一项所述的代码摘要的生成方法。
本申请提供一种代码摘要的生成方法、装置和存储介质,获取由可执行文件编译得到的指令队列后,从指令队列中确定出与可执行文件的有效代码对应的待执行队列,然后在模拟环境中执行待执行队列的部分或全部计算机指令,从而识别出每一条被执行的计算机指令的操作码。最后利用消息摘要算法计算识别得到的操作码,得到代码摘要。本方案通过在模拟环境中执行计算机指令,识别出计算机指令的操作码,并针对识别得到的操作码计算得到代码摘要。计算机指令的操作码的取值只取决于对应的可执行文件,而不受加载地址的影响,因此,本发明能够确保在可执行文件不发生变化的前提下,每次计算得到的代码摘要完全一致,从而避免加载地址的干扰导致的误判。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。
图1为本发明实施例提供的一种代码摘要的生成方法的流程图;
图2为本发明实施例提供的一种确定待执行队列的方法的流程图;
图3为本发明另一实施例提供的一种代码摘要的生成方法的流程图;
图4为本发明实施例提供的一种在模拟环境中执行待执行队列或子队列中的计算机指令的方法的流程图;
图5为本发明实施例提供的一种代码摘要的生成装置的结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
可执行文件是一类计算机文件,在微软操作系统中,常见的可执行文件的后缀包括但不限于EXE、DLL、OCX、SYS、COM。可执行文件相当于是计算机程序的载体,计算机系统直接或间接的执行这些可执行文件,就相当于是在计算机系统上运行对应的计算机程序。
可执行文件一般是只读的,也就是只允许计算机系统读取并执行,而不允许修改其中的内容。
计算机系统执行一个可执行文件的过程,具体包括:为这个可执行文件分配一块内存区域,利用编译工具将可执行文件编译成一个由若干条计算机指令组成的指令队列,然后由CPU逐条执行其中的计算机指令。其中,分配的内存区域用于保存可执行文件的关联数据(包括可执行文件被执行时需要使用的数据,以及被执行后产生的数据)。
计算机的可执行文件的代码摘要,作为计算机技术领域的一种重要的技术手段,被广泛应用于查杀计算机病毒,反制外挂程序等与计算机安全相关的领域。
现有的生成可执行文件的代码摘要的方法,一般是直接获取目标可执行文件编译得到的指令队列,然后利用现有的消息摘要算法直接计算这个指令队列中的全部计算机指令,得到的计算结果就是目标可执行文件的代码摘要。
计算机指令(也可以称为,机器指令)是以二进制编码的形式表现的,能够被计算机的CPU直接识别并执行的指令。一条计算机指令包括若干个二进制位,其中的一部分二进制位用于表示这条计算机指令的操作码,CPU读取操作码后,可以根据预设的操作码与操作类型的对应关系,确定这条计算机指令被执行时需要进行什么操作。另一部分二进制位用于表示这条计算机指令的操作数,一条计算机指令的操作数部分一般记录有一个或多个内存地址,CPU根据操作数,可以确定这条计算机指令被执行时,需要操作的数据保存在内存的哪个位置,以及操作结果需要写入内存的哪个位置。
具体的,如果一条计算机指令需要对变量a和变量b求和,那么这条计算机指令的操作码就是加法运算对应的操作码,操作数则包括变量a的内存地址,变量b的内存地址,以及目标内存地址(即,用于保存变量a与变量b之和的内存地址),CPU读取这条计算机指令后,分别读取变量a的内存地址的数据和变量b的内存地址的数据,将这两个数据相加后,得到的结果存入目标内存地址中。
应当理解,一个可执行文件被编译得到指令队列后,这个指令队列中的计算机指令的操作数,其实就是计算机内存中,用于保存前述可执行文件的关联数据的内存地址。进一步的,如果计算机系统为一个可执行文件分配的内存区域不同,自然的,用于保存这个可执行文件的关联数据的内存地址也不同,指令队列中的计算机指令的操作数也不同。
其中,需要执行一个可执行文件时,计算机系统为这个可执行文件分配的内存区域,也可以称为这个可执行文件的加载地址。
消息摘要算法(Message DigestAlgorithm)是一类用于计算给定的消,得到一个与消息的内容相关的由数字和字母组成的字符串(这个字符串就是被计算的消息的摘要)的算法。利用现有的消息摘要算法直接计算这个指令队列中的全部计算机指令,就是,将目标可执行文件编译得到的指令队列中的所有计算机指令作为一个消息,然后利用消息摘要算法计算这个消息,得到的字符串就是目标可执行文件的代码摘要。
一般的,对于一种特定的消息摘要算法,根据被计算的消息的不同,计算得到的摘要也不同。例如,对于“12345”和“123456”这两个消息,利用特定的一种消息摘要算法分别计算这两个消息,会得到分别对应于这两个消息的两个不同的摘要。
基于消息摘要算法的这一特性,计算机系统可以定期生成可执行文件的代码摘要。针对一个可执行文件,每生成一次代码摘要,就将这次生成的代码摘要与前一次生成的代码摘要进行比对,如果这次生成的代码摘要与前一次生成的代码摘要不一致,就表示从上次生成代码摘要的时刻到本次生成代码摘要的时刻之间,可执行文件可能被篡改,进而判断出计算机系统中可能存在安全隐患(例如计算机病毒,外挂程序等)。
针对一个可执行文件,计算机系统每次执行时为其分配的内存区域一般不同,这就导致同一个可执行文件每次被执行时,编译这个可执行文件得到的计算机指令的操作数一般不同。
例如,假设一个可执行文件中涉及对变量a的计算,那么这个可执行文件被编译后得到的指令队列中,必然有若干条以变量a的内存地址为操作数的计算机指令,然而,由于可执行文件每次被执行时占用的内存区域不同,就可能出现,可执行文件某次被执行时,变量a保存在计算机内存的某个内存区域(不妨记为第一内存区域)的内存地址A,对应的指令队列中与变量a相关的计算机指令的操作数就包括内存地址A;而下一次执行这个可执行文件时,计算机系统为其分配了与前述第一内存区域不同的另一个内存区域,对应的本次执行过程中变量a的内存地址就会是与前述内存地址A不同的内存地址B,相对的,指令队列中与变量a相关的计算机指令的操作数就包括内存地址B。
结合前述例子,可以理解,对于同一个可执行文件,这个可执行文件编译得到的指令队列中,计算机指令的操作数会根据每次执行时分配的内存区域的不同而不同。
现有的生成代码摘要的方法中,消息摘要方法计算的对象是可执行文件编译后得到的指令队列中所有计算机指令组成的消息,其中包括了每一条计算机指令的操作码和操作数。结合前述介绍,可以理解的,这种对利用消息摘要算法对计算机指令的操作码和操作数一并进行计算的方法,存在以下缺点:
一个可执行文件第一次被执行时,计算机系统为其分配了第一内存区域,利用消息摘要算法计算这个可执行文件编译得到的指令队列,得到的第一代码摘要。经过一段时间后,这个可执行文件第二次被执行时,计算机系统为其分配了与第一内存区域不同的第二内存区域,此时,根据指令队列计算得到第二代码摘要。两次执行时分配的内存区域不同,第一次执行时指令队列中计算机指令的操作数与第二次执行时指令队列中计算机指令的操作数也不同。进一步的,根据第一次执行时的各个计算机指令的操作码和操作数生成的第一代码摘要,也不同于根据第二次执行时的各个计算机指令的操作码和操作数生成的第二代码摘要。
即使两次执行时的可执行文件完全相同(即,可执行文件在两次执行之间的间隔时间内未被篡改),计算机系统也可能因为第一代码摘要和第二代码摘要不一致,而错误的认为可执行文件被篡改,进而导致可执行文件无法被正常的执行。
总而言之,由于计算机指令的操作数会根据每次执行时计算机系统分配的内存区域的变化而变化,现有技术中对计算机指令的操作码和操作数一并进行计算得到的代码摘要也会根据内存区域的变化而变化,进而导致计算机系统中根据代码摘要是否一致而进行的检测程序出现误判,影响可执行文件的正常执行。
基于上述现有技术缺点,本申请实施例提供一种生成代码摘要的方法,以解决基于现有技术生成的代码摘要会受内存地址的干扰的问题,请参考图1,该方法包括以下步骤:
S101、获取指令队列。
其中,指令队列包括多条计算机指令,这些计算机指令通过编译目标可执行文件得到。
目标可执行文件,就是需要生成代码摘要的可执行文件。
S102、从指令队列中确定出待执行队列。
其中,待执行队列对应于可执行文件中的有效代码。或者说,待执行队列是,可执行文件中的有效代码被编译得到的多条计算机指令组合成的一个指令队列。
可执行文件的有效代码,是指,可执行文件中用于实现特定具体功能的代码片段。
如前文所述,可执行文件可以理解为用于记录开发好的计算机程序的文件。具体的,为了使一个可执行文件记录的计算机程序被顺利运行,一方面,可执行文件中需要包括用于实现计算机程序的具体功能的代码,这些代码就是这个可执行文件的有效代码,另一方面,可执行文件中还需要包括用于配置计算机程序的具体运行环境以及关联参数的代码,使得计算机系统根据这些代码自动的设置运行环境和关联参数,以支持计算机程序的运行,这部分代码则不属于有效代码。
可选的,确定待执行队列的方法可以参考图2,该方法包括:
S201、利用反汇编引擎识别出指令队列中的第一个函数头和最后一个函数头。
其中,指令队列中,每N条连续的有效计算机指令作为一个函数头,N是预设的正整数,一般将N设定为3。也就是说,指令队列中的每3条连续的有效计算机指令的组合,均可以称为一个函数头。
有效计算机指令的定义是:对一条计算机指令进行反汇编,得到这条计算机指令对应的汇编指令,若这条计算机指令对应的汇编指令是返回指令(return),或者是中断指令(int3),那么这条计算机指令就不是一条有效计算机指令;若这条计算机指令对应的汇编指令是除上述返回指令和中断指令以外的其他汇编指令,例如,若这条计算机指令对应的汇编指令是压入指令(push),加法指令(add),转移指令(mov),减法指令(sub)和跳转指令(call、jmp、ret、jz)的任意一种,那么这条计算机指令就是有效计算机指令。当然,有效计算机指令对应的汇编指令并不限于上面罗列的几种,只要一条计算机指令反汇编后得到的汇编指令既不是返回指令,也不是中断指令,这条计算机指令就是一条有效计算机指令。
综上所述,步骤S201的具体实现过程可以是,利用反汇编引擎从指令队列的第一条计算机指令(即指令队列的队头)开始,向后依次反汇编指令队列中的计算机指令,从而判断每一条计算机指令是否为有效计算机指令,若连续判断出三条计算机指令均为有效计算机指令,那么这三条计算机指令就构成这个指令队列的第一个函数头;
另一方面,利用反汇编引擎,从指令队列的最后一条计算机指令(即指令队列的队尾)开始,向前依次反汇编指令队列中的每条计算机指令,若连续判断出三条计算机指令均为有效计算机指令,那么这三条计算机指令就构成这个指令队列的最后一个函数头。
S202、将指令队列的第一个函数头作为待执行队列的起始位置,并且,将指令队列的最后一个函数头作为待执行队列的结束位置。
S203、将起始位置的计算机指令,结束位置的计算机指令,以及起始位置和结束位置之间的计算机指令,组合为待执行队列。
例如,在一个包括1000条计算机指令的指令队列中,第一次出现的连续的三条有效计算机指令,是指令队列的第10条,第11条和第12条计算机指令,那么第10条,第11条和第12条计算机指令就构成这个指令队列的第一个函数头,最后一次出现的连续的三条有效计算机指令,是指令队列的第951条,第952条和第953条计算机指令,那么指令队列的第951条,第952条和第953条计算机指令构成指令队列的最后一个函数头。对应的,从指令队列的第10条计算机指令开始,直至指令队列的第953条计算机指令,这之间的所有计算机指令(包括第10条计算机指令和第953条计算机指令),就构成这个指令队列的待执行队列。
S103、在模拟环境中执行待执行队列的部分或全部计算机指令,从而识别出每一条被执行的有效计算机指令的操作码。
其中,识别得到的每一条计算机指令的操作码组合为待执行队列的操作码集合。
具体的,在模拟环境中执行待执行队列中的部分或全部计算机指令,是指:
对待执行队列中的每一条计算机指令,利用反汇编引擎解析得到这条计算机指令对应的汇编指令,若这条计算机指令对应的汇编指令是跳转指令,中断指令和返回指令三者中的任意一种,则不执行这条计算机指令,反之,若这条计算机指令对应的汇编指令是除跳转指令,中断指令和返回指令三者以外的其他汇编指令,则在模拟环境中执行这条计算机指令,从而识别出这条计算机指令的操作码。
也就是说,在模拟环境中执行的计算机指令需要满足下述执行条件:
这条计算机指令对应的汇编指令不是跳转指令,中断指令和返回指令三种汇编指令中的任意一种。
若待执行队列中的每一条计算机指令均满足执行条件,那么可以执行待执行队列的全部计算机指令,若待执行队列中有一部分计算机指令不满足执行条件,那么只执行满足上述执行条件的那一部分计算机指令。
可选的,若待执行队列中的计算机指令的数量较多,可以设定一个阈值,每次在模拟环境中执行一条计算机指令并识别出它的操作码后,判断当前从待执行队列中识别得到的操作码的总数是否小于该阈值,若从待执行队列中识别得到的操作码的总数小于阈值,则继续执行下一条满足执行条件的计算机指令,若从待执行队列中识别得到的操作码的总数大于或等于阈值,则不再执行下一条满足执行条件的计算机指令,直接结束步骤S103。
也就是说,根据待执行队列中的计算机指令的数量,步骤S103的具体实现方式还可以是:
逐条执行待执行队列中满足执行条件的计算机指令,直至待执行队列中满足执行条件的计算机指令均被在模拟环境中执行,或者通过执行计算机指令识别得到的操作码的数量等于阈值为止。
模拟环境,可以认为是利用软件在一个计算机系统上实现的一个虚拟机。通过配置软件的参数,可以确保待执行队列中的计算机指令在模拟环境中执行的过程和结果,与计算机指令直接在真实的计算机系统中执行的过程和结果一致。
并且,模拟环境中的各种参数,均可以由技术人员通过软件控制,因此,即使在执行上述待执行队列中的计算机指令的过程中出现不良影响,技术人员也能够将有效的隔离这些不良影响,避免对真实的计算机系统造成影响。
通过在模拟环境中执行计算机指令,就可以识别出被执行的计算机指令的操作码和操作数。
可选的,可以预先创建一个用于存储操作码的队列,在模拟环境中执行待执行队列的计算机指令时,每执行一条计算机指令,就将从这条计算机指令中识别得到的操作码压入这个队列中,步骤S104执行结束后,这个队列就相当于是一个操作码集合。
生成可执行文件的代码摘要,主要目的是利用代码摘要判断一个可执行文件是否被篡改。如果直接在真实的计算机系统中执行可执行文件编译后得到的计算机指令,若这个可执行文件被篡改,那么这些计算机指令被执行时就可能对真实的计算机系统造成不良影响。因此,为了隔绝这些不良影响,在不确定可执行文件是否被篡改的情况下,待执行队列中的计算机指令应当在模拟环境中执行,而不能直接在真实的计算机系统中执行。
现有技术中有多种软件能够在一个计算机系统上实现模拟环境,此处不做限定。
S104、利用消息摘要算法计算操作码集合,得到可执行文件的代码摘要。
步骤S104中使用的消息摘要算法可以是任意一种现有的消息摘要算法,可用的消息摘要算法包括但不限于:MD5算法(MD5 Message-DigestAlgorithm
),安全哈希算法(Secure Hash Algorithm,shal),循环冗余校验算法(cyclicredundancy check 32,crc32)等。
步骤S104的具体实现过程,可以是,将从待执行队列中识别得到的所有操作码,按照在待执行队列中的先后顺序,依次拼接成一个字符串,然后将这个字符串作为一个消息,利用消息摘要算法计算,得到的计算结果,就是这个可执行文件的代码摘要。
例如,假设从一个待执行队列中识别得到10个操作码,按照在待执行队列中的先后顺序依次表示为A,B,C,D,E,F,G,H,I,J,这些操作码拼接后构成一个字符串“ABCDEFGHIJ”,然后就可以利用消息摘要算法对这个字符串进行计算,得到的计算结果就是这个可执行文件的代码摘要。
在特定的一种计算机系统中,一个可执行文件被编译后得到的每一条计算机指令的操作码,均由这个可执行文件中的代码决定,而与计算机系统分配的用于执行这个可执行文件的内存区域无关。因此,本实施例通过在模拟环境中执行计算机指令而识别得到的操作码集合,只要可执行文件本身未被篡改,并且将可执行文件编译得到指令队列的过程中没有其他的程序向指令队列中插入与可执行文件无关的计算机指令,这个操作码集合就不会产生变化,对应的,基于这个操作码集合计算得到的可执行文件的代码摘要也将保持不变。因此,本申请实施例提供的代码摘要的生成方法,能够有效的隔绝计算机系统为可执行文件分配的内存区域的变化对可执行文件的代码摘要的影响,从而解决现有技术生成的代码摘要随着分配的内存区域的改变而改变的问题。
本申请另一实施例还提供一种生成代码摘要的方法,用于根据待执行队列中的计算机指令的数量选择性的执行待执行队列中的计算机指令,以减小计算量。请参考图3,该方法包括下述步骤:
S301、获取指令队列。
S302、从指令队列中确定出待执行队列。
S303、判断待执行队列的计算机指令的数量是否大于第一阈值。
若待执行队列的计算机指令的数量大于第一阈值,则执行步骤S305。
若待执行队列的计算机指令的数量小于或等于第一阈值,则执行步骤S304。
可选的,为了避免确定待执行队列时出现错误,可以在执行步骤S303之前先判断待执行队列的起始位置是否大于待执行队列的结束位置,若起始位置大于结束位置,则认为识别待执行队列时出现错误,这种情况下,可以返回步骤S302再次识别待执行队列,也可以直接结束本方法。若判断出起始位置小于或等于结束位置,则认为确定了正确的待执行队列,继续执行步骤S303。
例如,若识别得到的待执行队列的起始位置是,指令队列中的第30条,第31条和第32条计算机指令构成的函数头,而结束位置是指令队列中的第10条,第11条和第12条计算机指令,则确定起始位置大于结束位置,识别待执行队列时出现错误。若起始位置对应的计算机指令在结束位置对应的计算机指令之前,则表示起始位置小于结束位置,若起始位置和结束位置对应的是同样的三条计算机指令,则表示起始位置等于结束位置。
具体的,若待执行队列的起始位置是指令队列的第10,11和12条计算机指令,待执行队列的结束位置是指令队列的第18,19和20条计算机指令,那么这个待执行队列就包括从第10条至第20条,共计11条计算机指令。
特别的,若待执行队列的起始位置等于待执行队列的结束位置,例如,起始位置和结束位置均为指令队列的第11,12和13条计算机指令,那么待执行队列就仅包括起始位置的这三条计算机指令。
一般的,第一阈值可以设定为1000,也就是说,若待执行队列中的计算机指令的数量多于1000条,则执行步骤S305,若待执行队列中的计算机指令的数量小于或等于1000条,则执行步骤S304。
S304、在模拟环境中执行待执行队列的全部计算机指令,从而识别出每一条被执行的计算机指令的操作码。
识别得到的每一条计算机指令的操作码,组合为待执行队列的操作码集合。
步骤S304执行结束后,直接跳转至步骤S307。
S305、根据待执行队列的计算机指令的数量以及第一阈值,将待执行队列划分为多个子队列。
步骤S305的一种具体实现方式可以是:
判断待执行队列的计算机指令的数量是否大于第二阈值。
若待执行队列的计算机指令的数量大于第二阈值,则将待执行队列划分为M个子队列。
若待执行队列的计算机指令的数量小于或等于第二阈值,则用待执行队列的计算机指令的数量除以第一阈值,对计算结果向上取整得到一个整数K,然后将待执行队列划分为K个子队列。
其中,M是预设的子队列数量阈值,第二阈值根等于子队列数量阈值和第一阈值的乘积。
一般的,M可以设定为10,若第一阈值设定为1000,那么第二阈值就等于10000。
也就是说,若待执行队列的计算机指令的数量S大于10000,那么直接将待执行队列划分为10个子队列。
若待执行队列的计算机指令的数量S小于或等于10000,那么就用S除以1000,对得到的结果向上取整得到整数K,然后将待执行队列划分为K个子队列。
例如,若S等于2800,S除以1000得到2.8,向上取整后得到K等于3,因此将待执行队列划分为3个子队列。
S306、在模拟环境中执行每一个子队列的部分或全部计算机指令,从而识别出每一个子队列的每一条被执行的计算机指令的操作码。
步骤S306的具体实现过程可以参考图1对应的实施例中的步骤S103。也就是说,针对每一个子队列,若这个子队列的每一条计算机指令均满足图1对应的实施例中定义的执行条件,则执行步骤S306时可以执行这个子队列的全部计算机指令,若这个子队列中只有一部分计算机指令满足执行条件,则仅在模拟环境中执行这部分满足执行条件的计算机指令。
与前述步骤S103类似,在模拟环境中执行子队列的计算机指令时,也可以实时的判断识别得到的操作码的数量是否小于阈值,并根据判断结果决定是否继续执行这个子队列中的满足执行条件的计算机指令。
具体的,针对每一个子队列,在逐条执行这个子队列中的满足执行条件的计算机指令,并识别出操作码的过程中,若判断出从这个子队列中识别得到的操作码的总数等于阈值,则不再执行这个子队列的其他计算机指令,若判断出从这个子队列中识别得到的操作码的总数小于阈值,则继续执行这个子队列后续的满足执行条件的计算机指令。
针对每一个子队列,这个子队列中的每一条被执行的计算机指令的操作码,组合为这个子队列的操作码集合,待执行队列的所有子队列的操作码集合,组合为这待执行队列的操作码集合。
可选的,针对每一个子队列,可以再次利用反汇编引擎识别出这个子队列的第一个函数头,然后在模拟环境中执行这个子队列的第一个函数头之后的计算机指令。
S307、利用消息摘要算法计算操作码集合,得到可执行文件的代码摘要。
在待执行队列的计算机指令的数量较多时,将待执行队列划分为多个子队列,就可以并行的处理这些子队列中的计算机指令,达到提高生成代码摘要的效率的效果。
参考图4,本申请任一实施例中,在模拟环境中执行待执行队列或子队列中的计算机指令的过程包括:
S401、读取当前队列的第一个函数头的第一条计算机指令作为当前指令。
当前队列可以指代待执行队列,也可以指代待执行队列划分得到的多个子队列中的任意一个。
也就是说,本实施例提供的方法可以适用于前述任一实施例中的待执行队列,也可以适用于待执行队列的子队列。
若当前队列是待执行队列,那么当前队列的第一个函数头,就是待执行队列的起始位置,若当前队列是图3对应的实施例中,对待执行队列划分得到的子队列,那么可以利用反汇编引擎从这个子队列中识别出这个子队列的第一个函数头。
S402、判断当前指令是否为有效计算机指令。
具体的,有效计算机指令的定义如前文所述。因此,步骤S402可以利用反汇编引擎实现,若反汇编引擎对当前指令进行反汇编后得到的汇编指令是中断指令或返回指令,那么当前指令就不是有效计算机指令,反之,若当前指令反汇编得到的汇编指令既不是中断指令也不是返回指令,则当前指令是有效计算机指令。
若当前指令不是有效计算机指令,表明当前队列的计算机指令已经执行完毕,本方法结束。
若当前指令是有效计算机指令,执行步骤S403。
S403、判断当前指令是否对应于跳转指令。
具体的,可以利用反汇编引擎对当前指令进行反汇编,若反汇编后得到的当前指令对应的汇编指令是跳转指令,表明当前指令对应于跳转指令,执行步骤S404,若反汇编后得到的当前指令对应的汇编指令不是跳转指令,表明当前指令不对应于跳转指令,执行步骤S406。
S404、判断目标指令是否在当前队列内。
若一条计算机指令对应的反汇编指令是跳转指令。那么这条计算机指令会指向另一条计算机指令,被指向的这条计算机指令就是目标指令。
例如,若当前队列的第10条计算机指令对应的反汇编指令是跳转指令,那么这条计算机指令会指向另一条计算机指令。目标指令可能在当前队列内,也可能不在当前队列内。
若目标指令不在当前队列内,执行步骤S409。
若目标指令在当前队列内,执行步骤S405。
S405、将目标指令赋值于当前指令,返回执行步骤S402。
赋值后的当前指令,就是步骤S404中提及的目标指令。
具体的,执行步骤S405之前(即赋值前)当前指令是当前队列的第20条计算机指令,第20条计算机指令对应的反汇编指令是跳转指令,并且第20条计算机指令指向的是当前队列的第30条计算机指令(即,目标指令是当前队列的第30条计算机指令),那么在执行步骤S405所述的赋值后,当前指令就变更为当前队列的第30条指令。
S406、在模拟环境中执行当前指令,从而识别出当前指令的操作码。
S407、将当前指令的操作码存入当前队列的操作码集合中。
S408、判断当前队列的操作码集合中的操作码数量是否小于阈值。
一般的,操作码集合中的操作码数量的阈值设定为1000,也就是说,若操作码集合中已经保存了从1000条计算机指令中识别得到的操作码(相当于操作码集合中保存了1000个操作码),就表明当前队列的操作码集合中的操作码数量等于阈值(即,不小于阈值),反之,则表明当前队列的操作码集合中的操作码数量小于阈值。
若当前队列的操作码集合中的操作码数量小于阈值,则执行步骤S409。
若当前队列的操作码集合中的操作码数量不小于(大于或等于)阈值,则本方法结束。
S409、将当前指令的下一条计算机指令赋值于当前指令,返回执行步骤S402。
与步骤S405类似,若执行步骤S409之前,当前指令是当前队列的第20条计算机指令,则当前指令的下一条计算机指令就是第21条计算机指令,执行步骤S409的赋值后,当前指令就变更为当前队列的第21条计算机指令。
若待执行队列被划分为多个子队列,那么,对每一个子队列执行图4对应的方法后,就可以得到每一个子队列的操作码集合,每一个子队列的操作码集合组合后就得到待执行队列的操作码集合。
若待执行队列未被划分为多个子队列,那么上述方法执行时,上述当前队列就是待执行队列,上述方法执行结束后的当前队列的操作码集合,就是待执行队列的操作码集合。
本申请实施例提供的生成代码摘要的方法,能够广泛的应用于查杀计算机病毒,检测外挂程序等多种场景中,下面介绍几个本申请任一实施例提供的代码摘要的生成方法的应用场景:
第一方面,针对任一可执行文件,可以每隔一定时间,利用本申请任一实施例提供的方法生成这个可执行文件的代码摘要。每生成一次代码摘要,就将这次生成的代码摘要与前一次生成的代码摘要进行比对,若本次生成的代码摘要与前一次生成的代码摘要不一致,就表明可执行文件被修改,若这段时间内计算机系统未检测到合法程序对可执行文件进行修改,就表明计算机系统中可能出现了会恶意篡改可执行文件的病毒程序,进而触发杀毒软件对计算机系统进行病毒检测。
第二方面,可以利用本申请任一实施例提供的代码摘要的生成方法生成计算机系统中的每一个可执行文件的代码摘要,然后记录每一个可执行文件与其代码摘要之间的对应关系,从而将可执行文件的代码摘要,作为计算机系统中的可执行文件的标签。
第三方面,某些针对电脑游戏的外挂程序,可能会在电脑游戏启动前,对电脑游戏的可执行文件编译得到的对应的指令队列之后,在指令队列中额外的插入一段非法的能够实现特定功能的计算机指令,从而修改电脑游戏运行时的参数,达到“开挂”的效果。因此,针对特定的游戏,可以在编译得到这个游戏的可执行文件对应的指令队列,先利用本申请任一实施例提供的代码摘要的生成方法生成一个代码摘要,并将本次生成的代码摘要与以往生成的这个可执行文件的可信的代码摘要做比较,若本次生成的代码摘要与以往生成的可信的代码摘要不一致,就表明这个指令队列中被外挂程序插入了非法的计算机指令,于是暂停启动游戏,触发外挂检测程序检测当前计算机系统中的外挂程序。因此,本申请任一实施例提供的代码摘要方法能够用于反制外挂程序。
当然,上述应用场景仅仅是为了方便理解本发明的技术方案而提供的例子,本申请任一实施例提供的代码摘要的生成方法的适用范围包括但不限于上述应用场景。
结合本申请任一实施例提供的代码摘要的生成方法,本申请另一实施例还提供一种代码摘要的生成装置,请参考图5,该装置包括以下结构:
获取单元501,用于获取指令队列;其中,所述指令队列包括多条计算机指令;所述计算机指令由可执行文件编译得到。
确定单元502,用于从所述指令队列中确定出待执行队列;其中,所述待执行队列对应于所述可执行文件中的有效代码。
识别单元503,用于在模拟环境中执行所述待执行队列的部分或全部计算机指令,从而识别出每一条被执行的计算机指令的操作码;其中,识别得到的每一条计算机指令的操作码组合为所述待执行队列的操作码集合。
计算单元504,用于利用消息摘要算法计算所述操作码集合,得到所述可执行文件的代码摘要。
可选的,所述确定单元502包括:
子识别单元,用于利用反汇编引擎识别出所述指令队列中的第一个函数头和最后一个函数头;其中,所述指令队列中,每N条连续的有效计算机指令作为一个函数头;所述N是预设的正整数;
子确定单元,用于将所述指令队列的第一个函数头作为所述待执行队列的起始位置,并且,将所述指令队列的最后一个函数头作为所述待执行队列的结束位置;
组合单元,用于将所述起始位置的计算机指令,所述结束位置的计算机指令,以及所述起始位置和所述结束位置之间的计算机指令,组合为所述待执行队列。
可选的,所述识别单元503,包括:
判断单元,用于判断所述待执行队的计算机指令的数量是否大于第一阈值;
划分单元,若所述待执行队列的计算机指令的数量大于所述第一阈值,则用于根据所述待执行队列的计算机指令的数量以及所述第一阈值,将所述待执行队列划分为多个子队列;
执行单元,用于在模拟环境中执行每一个所述子队列的部分或全部计算机指令,从而识别出每一个所述子队列的每一条被执行的计算机指令的操作码;
所述执行单元,若所述待执行队列的计算机指令的数量小于或等于所述第一阈值,则用于在模拟环境中执行所述待执行队列的部分或全部计算机指令,从而识别出每一条被执行的计算机指令的操作码。
可选的,识别单元503中的执行单元在模拟环境中执行所述待执行队列的部分或全部计算机指令,从而识别出每一条被执行的计算机指令的操作码时,具体用于:
针对所述待执行队列的每一条有效计算机指令,判断所述有效计算机指令对应的汇编指令是否为跳转指令;
针对所述待执行队列的每一条有效计算机指令,若判断出所述有效计算机指令对应的汇编指令不为跳转指令,在模拟环境中执行所述有效计算机指令,从而识别出所述有效计算机指令的操作码。
可选的,识别单元503中的执行单元在模拟环境中执行所述每一个子队列的部分或全部计算机指令,从而识别出每一个子队列的每一条被执行的计算机指令的操作码时,具体用于:
针对所述子队列的每一条有效计算机指令,判断所述有效计算机指令对应的汇编指令是否为跳转指令;
针对所述子队列的每一条有效计算机指令,若判断出所述有效计算机指令对应的汇编指令不为跳转指令,在模拟环境中执行所述有效计算机指令,从而识别出所述有效计算机指令的操作码。
本申请任一实施例提供的代码摘要的生成装置,其具体工作原理可以参考本申请任一实施例提供的代码摘要的生成方法,此处不再赘述。
本申请提供一种代码摘要的生成装置,获取单元501获取由可执行文件编译得到的指令队列后,确定单元502从指令队列中确定出与可执行文件的有效代码对应的待执行队列,然后识别单元503在模拟环境中执行待执行队列的部分或全部计算机指令,从而识别出每一条被执行的计算机指令的操作码。最后通过计算单元504利用消息摘要算法计算识别得到的操作码,得到代码摘要。本方案通过在模拟环境中执行计算机指令,识别出计算机指令的操作码,并针对识别得到的操作码计算得到代码摘要。计算机指令的操作码的取值只取决于对应的可执行文件,而不受加载地址的影响,因此,本发明能够确保在可执行文件不发生变化的前提下,每次计算得到的代码摘要完全一致,从而避免加载地址的干扰导致的误判。
本申请另一实施例还提供一种存储介质,用于存储计算机程序,计算机程序被执行时,用于实现本申请任一实施例提供的代码摘要的生成方法。
专业技术人员能够实现或使用本申请。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本申请的精神或范围的情况下,在其它实施例中实现。因此,本申请将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。
Claims (5)
1.一种代码摘要的生成方法,其特征在于,包括:
获取指令队列;其中,所述指令队列包括多条计算机指令;所述计算机指令由可执行文件编译得到;
利用反汇编引擎,从所述指令队列的第一条计算机指令开始,向后依次反汇编所述指令队列中的每条计算机指令,判断每一条计算机指令是否为有效计算机指令;
若所述计算机指令对应的汇编指令是除返回指令和中断指令以外的其他汇编指令,确定所述计算机指令是有效计算机指令;
若连续判断出三条计算机指令均为有效计算机指令,则该三条计算机指令构成所述指令队列的第一个函数头;
利用所述反汇编引擎,从所述指令队列的最后一条计算机指开始,向前依次反汇编指令队列中的每条计算机指令,判断每一条计算机指令是否为有效计算机指令;
若所述计算机指令对应的汇编指令是除返回指令和中断指令以外的其他汇编指令,确定所述计算机指令是有效计算机指令;
若连续判断出三条计算机指令均为有效计算机指令,则该三条计算机指令构成所述指令队列的最后一个函数头;
将所述指令队列的第一个函数头作为待执行队列的起始位置,并且,将所述指令队列的最后一个函数头作为所述待执行队列的结束位置;
将所述起始位置的计算机指令,所述结束位置的计算机指令,以及所述起始位置和所述结束位置之间的计算机指令,组合为所述待执行队列;其中,所述待执行队列对应于所述可执行文件中的有效代码,所述可执行文件中的有效代码是所述可执行文件中用于实现预设功能的代码片段;
判断所述待执行队列的计算机指令的数量是否大于第一阈值;
若所述待执行队列的计算机指令的数量小于或等于所述第一阈值,在模拟环境中执行所述待执行队列的部分或全部计算机指令,从而识别出每一条被执行的计算机指令的操作码;
若所述待执行队列的计算机指令的数量大于所述第一阈值,判断待执行队列的计算机指令的数量是否大于第二阈值,所述第二阈值等于子队列数量阈值和第一阈值的乘积;
若待执行队列的计算机指令的数量大于第二阈值,则将待执行队列划分为M个子队列,M是预设的子队列数量阈值;
若待执行队列的计算机指令的数量小于或等于第二阈值,则用待执行队列的计算机指令的数量除以第一阈值,对计算结果向上取整得到一个整数K,然后将待执行队列划分为K个子队列;
对所述待执行队列的部分或全部计算机指令,或每一个所述子队列的部分或全部计算机指令,利用反汇编引擎解析得到所述计算机指令对应的汇编指令,若所述计算机指令对应的汇编指令是跳转指令,中断指令和返回指令三者中的任意一种,则不执行所述计算机指令;
若所述计算机指令对应的汇编指令是除跳转指令,中断指令和返回指令三者以外的其他汇编指令,则在模拟环境中执行所述计算机指令,从而识别出执行的计算机指令的操作码;其中,识别得到的每一条计算机指令的操作码组合为所述待执行队列的操作码集合;
利用消息摘要算法计算所述操作码集合,得到所述可执行文件的代码摘要。
2.根据权利要求1所述的生成方法,其特征在于,所述对所述待执行队列的部分或全部计算机指令,或每一个所述子队列的部分或全部计算机指令,利用反汇编引擎解析得到所述计算机指令对应的汇编指令,若所述计算机指令对应的汇编指令是跳转指令,中断指令和返回指令三者中的任意一种,则不执行所述计算机指令;若所述计算机指令对应的汇编指令是除跳转指令,中断指令和返回指令三者以外的其他汇编指令,则在模拟环境中执行所述计算机指令,从而识别出执行的计算机指令的操作码,包括:
读取当前队列的第一个函数头的第一条计算机指令作为当前指令;
判断当前指令是否为有效计算机指令;
若所述当前指令对应的汇编指令是除返回指令和中断指令以外的其他汇编指令,确定所述计算机指令是有效计算机指令,判断当前指令是否对应于跳转指令;
若当前指令对应于跳转指令,判断目标指令是否在当前队列内;
若目标指令在当前队列内,将目标指令赋值于当前指令,返回执行判断当前指令是否为有效计算机指令的步骤;
若目标指令不在当前队列内,将当前指令的下一条计算机指令赋值于当前指令,返回执行判断当前指令是否为有效计算机指令的步骤;
若当前指令不对应于跳转指令,在模拟环境中执行当前指令,从而识别出当前指令的操作码;将当前指令的操作码存入当前队列的操作码集合中;判断当前队列的操作码集合中的操作码数量是否小于阈值;若当前队列的操作码集合中的操作码数量小于阈值,则将当前指令的下一条计算机指令赋值于当前指令,返回执行判断当前指令是否为有效计算机指令的步骤。
3.一种代码摘要的生成装置,其特征在于,包括:
获取单元,用于获取指令队列;其中,所述指令队列包括多条计算机指令;所述计算机指令由可执行文件编译得到;
确定单元,用于利用反汇编引擎,从所述指令队列的第一条计算机指令开始,向后依次反汇编所述指令队列中的每条计算机指令,判断每一条计算机指令是否为有效计算机指令;若所述计算机指令对应的汇编指令是除返回指令和中断指令以外的其他汇编指令,确定所述计算机指令是有效计算机指令;若连续判断出三条计算机指令均为有效计算机指令,则该三条计算机指令构成所述指令队列的第一个函数头;利用所述反汇编引擎,从所述指令队列的最后一条计算机指开始,向前依次反汇编指令队列中的每条计算机指令,判断每一条计算机指令是否为有效计算机指令;若所述计算机指令对应的汇编指令是除返回指令和中断指令以外的其他汇编指令,确定所述计算机指令是有效计算机指令;若连续判断出三条计算机指令均为有效计算机指令,则该三条计算机指令构成所述指令队列的最后一个函数头;将所述指令队列的第一个函数头作为待执行队列的起始位置,并且,将所述指令队列的最后一个函数头作为所述待执行队列的结束位置;将所述起始位置的计算机指令,所述结束位置的计算机指令,以及所述起始位置和所述结束位置之间的计算机指令,组合为所述待执行队列;其中,所述待执行队列对应于所述可执行文件中的有效代码,所述可执行文件中的有效代码是所述可执行文件中用于实现预设功能的代码片段;
识别单元,用于判断所述待执行队列的计算机指令的数量是否大于第一阈值;若所述待执行队列的计算机指令的数量小于或等于所述第一阈值,在模拟环境中执行所述待执行队列的部分或全部计算机指令,从而识别出每一条被执行的计算机指令的操作码;若所述待执行队列的计算机指令的数量大于所述第一阈值,判断待执行队列的计算机指令的数量是否大于第二阈值,所述第二阈值等于子队列数量阈值和第一阈值的乘积;若待执行队列的计算机指令的数量大于第二阈值,则将待执行队列划分为M个子队列,M是预设的子队列数量阈值;若待执行队列的计算机指令的数量小于或等于第二阈值,则用待执行队列的计算机指令的数量除以第一阈值,对计算结果向上取整得到一个整数K,然后将待执行队列划分为K个子队列;对所述待执行队列的部分或全部计算机指令,或每一个所述子队列的部分或全部计算机指令,利用反汇编引擎解析得到所述计算机指令对应的汇编指令,若所述计算机指令对应的汇编指令是跳转指令,中断指令和返回指令三者中的任意一种,则不执行所述计算机指令;若所述计算机指令对应的汇编指令是除跳转指令,中断指令和返回指令三者以外的其他汇编指令,则在模拟环境中执行所述计算机指令,从而识别出执行的计算机指令的操作码;其中,识别得到的每一条计算机指令的操作码组合为所述待执行队列的操作码集合;
计算单元,用于利用消息摘要算法计算所述操作码集合,得到所述可执行文件的代码摘要。
4.根据权利要求3所述的生成装置,其特征在于,所述识别单元具体用于:
读取当前队列的第一个函数头的第一条计算机指令作为当前指令;
判断当前指令是否为有效计算机指令;
若所述当前指令对应的汇编指令是除返回指令和中断指令以外的其他汇编指令,确定所述计算机指令是有效计算机指令,判断当前指令是否对应于跳转指令;
若当前指令对应于跳转指令,判断目标指令是否在当前队列内;
若目标指令在当前队列内,将目标指令赋值于当前指令,返回执行判断当前指令是否为有效计算机指令的步骤;
若目标指令不在当前队列内,将当前指令的下一条计算机指令赋值于当前指令,返回执行判断当前指令是否为有效计算机指令的步骤;
若当前指令不对应于跳转指令,在模拟环境中执行当前指令,从而识别出当前指令的操作码;将当前指令的操作码存入当前队列的操作码集合中;判断当前队列的操作码集合中的操作码数量是否小于阈值;若当前队列的操作码集合中的操作码数量小于阈值,则将当前指令的下一条计算机指令赋值于当前指令,返回执行判断当前指令是否为有效计算机指令的步骤。
5.一种存储介质,其特征在于,用于存储程序,所述程序被执行时,用于实现如权利要求1至2任意一项所述的代码摘要的生成方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910816817.9A CN110515652B (zh) | 2019-08-30 | 2019-08-30 | 代码摘要的生成方法、装置和存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910816817.9A CN110515652B (zh) | 2019-08-30 | 2019-08-30 | 代码摘要的生成方法、装置和存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110515652A CN110515652A (zh) | 2019-11-29 |
CN110515652B true CN110515652B (zh) | 2021-10-15 |
Family
ID=68629604
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910816817.9A Active CN110515652B (zh) | 2019-08-30 | 2019-08-30 | 代码摘要的生成方法、装置和存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110515652B (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111814120B (zh) * | 2020-07-10 | 2021-04-23 | 北京嘀嘀无限科技发展有限公司 | 程序反混淆处理方法、装置、设备及存储介质 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102855119A (zh) * | 2012-07-26 | 2013-01-02 | 北京奇虎科技有限公司 | 一种可执行文件处理方法和装置 |
CN102959556A (zh) * | 2010-07-22 | 2013-03-06 | 纳格拉影像股份有限公司 | 用于确保软件完整性的处理器实现的方法 |
CN106855926A (zh) * | 2015-12-08 | 2017-06-16 | 武汉安天信息技术有限责任公司 | 安卓系统下的恶意代码检测方法、系统及一种移动终端 |
CN108563952A (zh) * | 2018-04-24 | 2018-09-21 | 腾讯科技(深圳)有限公司 | 文件的病毒检测方法、装置及存储介质 |
Family Cites Families (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2007117567A2 (en) * | 2006-04-06 | 2007-10-18 | Smobile Systems Inc. | Malware detection system and method for limited access mobile platforms |
US8407675B1 (en) * | 2007-02-06 | 2013-03-26 | The United States Of America As Represented By The Secretary Of The Navy | Extraction of executable code and translation to alternate platform |
CN101458630B (zh) * | 2008-12-30 | 2011-07-27 | 中国科学院软件研究所 | 一种基于硬件模拟器的自修改代码识别方法 |
CN102830975B (zh) * | 2012-08-15 | 2015-11-18 | 深圳市翌日科技有限公司 | 一种汇编语言到高级语言的代码转换方法和装置 |
CN104850775B (zh) * | 2014-02-14 | 2019-06-28 | 北京奇安信科技有限公司 | 一种应用程序安全性的鉴定方法和装置 |
CN105046117A (zh) * | 2015-06-30 | 2015-11-11 | 西北大学 | 一种具有指令集随机化的代码虚拟化软件保护系统 |
CN105138914B (zh) * | 2015-08-03 | 2018-02-16 | 南京大学 | 一种针对代码复用编程的软件安全性检测方法 |
CN106682505B (zh) * | 2016-05-04 | 2020-06-12 | 腾讯科技(深圳)有限公司 | 一种病毒检测方法、终端、服务器及系统 |
CN105930728B (zh) * | 2016-06-17 | 2019-05-10 | 浪潮(北京)电子信息产业有限公司 | 一种应用审查方法及装置 |
CN105975854B (zh) * | 2016-06-20 | 2019-06-28 | 武汉绿色网络信息服务有限责任公司 | 一种恶意文件的检测方法和装置 |
-
2019
- 2019-08-30 CN CN201910816817.9A patent/CN110515652B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102959556A (zh) * | 2010-07-22 | 2013-03-06 | 纳格拉影像股份有限公司 | 用于确保软件完整性的处理器实现的方法 |
CN102855119A (zh) * | 2012-07-26 | 2013-01-02 | 北京奇虎科技有限公司 | 一种可执行文件处理方法和装置 |
CN106855926A (zh) * | 2015-12-08 | 2017-06-16 | 武汉安天信息技术有限责任公司 | 安卓系统下的恶意代码检测方法、系统及一种移动终端 |
CN108563952A (zh) * | 2018-04-24 | 2018-09-21 | 腾讯科技(深圳)有限公司 | 文件的病毒检测方法、装置及存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN110515652A (zh) | 2019-11-29 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10242043B2 (en) | Software security via control flow integrity checking | |
Wang et al. | Undefined behavior: what happened to my code? | |
CN109643345B (zh) | 用于确定性代码流完整性保护的技术 | |
US10127379B2 (en) | Profiling code execution | |
US8701187B2 (en) | Runtime integrity chain verification | |
US20180211046A1 (en) | Analysis and control of code flow and data flow | |
US10229268B2 (en) | System and method for emulation-based detection of malicious code with unmet operating system or architecture dependencies | |
Ghaffarinia et al. | Binary control-flow trimming | |
US20130024676A1 (en) | Control flow integrity | |
CN109271789B (zh) | 恶意进程检测方法、装置、电子设备及存储介质 | |
JP7154365B2 (ja) | ソフトウェアコードをセキュアにするための方法 | |
US9900324B1 (en) | System to discover and analyze evasive malware | |
CN105260659A (zh) | 一种基于qemu的内核级代码重用型攻击检测方法 | |
JP6984710B2 (ja) | コンピュータ装置およびメモリ管理方法 | |
US20160171213A1 (en) | Apparatus and method for controlling instruction execution to prevent illegal accesses to a computer | |
CN105468965A (zh) | 一种动态堆栈内存管理方法 | |
Bernat et al. | Efficient, sensitivity resistant binary instrumentation | |
Hu et al. | A semantics-based hybrid approach on binary code similarity comparison | |
CN110515652B (zh) | 代码摘要的生成方法、装置和存储介质 | |
CN110717181A (zh) | 基于新型程序依赖图的非控制数据攻击检测方法及装置 | |
Tofighi-Shirazi et al. | Dose: Deobfuscation based on semantic equivalence | |
Banescu et al. | Detecting patching of executables without system calls | |
Oishi et al. | Self destructive tamper response for software protection | |
CN114637988A (zh) | 一种面向二进制的函数级软件随机化方法 | |
Farrelly et al. | SplITS: Split Input-to-State Mapping for Effective Firmware Fuzzing |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |