首页> 中国专利> 分析解释例程的虚拟指令方法、装置、设备及存储介质

分析解释例程的虚拟指令方法、装置、设备及存储介质

摘要

本发明实施例公开了一种分析解释例程的虚拟指令方法、装置、设备及存储介质,其中,所述分析解释例程的虚拟指令方法,包括:将虚拟机保护的虚拟指令集进行简化和归类;简化和归类后分别形成为虚拟加载和存储指令、虚拟运算指令、虚拟退栈指令和虚拟空指令。通过分析每个虚指令解释例程的指令对局部变量区的读次数,对操作数栈的读次数和栈顶的改变值,以实现对虚指令的识别和宽分类目的。

著录项

  • 公开/公告号CN112199163A

    专利类型发明专利

  • 公开/公告日2021-01-08

    原文格式PDF

  • 申请/专利权人 常熟理工学院;

    申请/专利号CN202011114571.X

  • 发明设计人 乐德广;

    申请日2020-10-16

  • 分类号G06F9/455(20060101);G06F21/56(20130101);

  • 代理机构32231 常州佰业腾飞专利代理事务所(普通合伙);

  • 代理人滕诣迪

  • 地址 215500 江苏省苏州市常熟市南三环路99号

  • 入库时间 2023-06-19 09:30:39

说明书

技术领域

本发明涉及分析虚拟指令技术领域,也涉及信息安全、软件分析、逆向工程和计算机软件技术领域,尤指一种分析解释例程的虚拟指令方法、装置、设备及存储介质。

背景技术

虚拟机保护技术常常被木马等恶意程序利用进行免杀,增加恶意软件查杀工具分析和检测的难度和开销,如何有效查杀恶意程序减少其对用户的威胁,虚拟机保护的逆向分析恶意软件检测中具有至关重要的作用。在现有的虚拟机保护逆向分析研究成果中,有专家提出通过动态数据流分析、污点追踪和聚类分析等手段获取字节码语法语义信息。这种方法只能还原部分字节码的语义信息。有专家提出通过逆向虚拟机结构,简化被混淆指令,将虚拟机指令转换中间语言,然后将中间语言编译转换为对应的CPU指令的方法来还原被保护的代码。但是,这种方法要求虚拟机解释器的结构满足特点条件,所以其不具有通用性。有专家提出通过识别被保护软件的API调用,然后抽取出所有影响API参数的指令来近似表示程序的原始代码。这种方法只能得到影响API参数的指令,其并不能有效还原被保护程序语义。

发明内容

本发明实施例提供了一种分析解释例程的虚拟指令方法、装置、设备及存储介质,通过分析每个虚指令解释例程的指令对局部变量区的读次数,对操作数栈的读次数和栈顶的改变值,以实现对虚指令的识别和宽分类目的。

本发明实施例提供了一种分析解释例程的虚拟指令方法,包括:

将虚拟机保护的虚拟指令集进行简化和归类;

简化和归类后分别形成为虚拟加载和存储指令、虚拟运算指令、虚拟退栈指令和虚拟空指令。

进一步的,所述虚拟加载和存储指令涉及到一个变量或常量在局部变量表和操作数栈之间的传递;

所述虚拟运算指令的语义特征是它会去读操作数栈而不改变操作数栈顶;

所述虚拟退栈指令用于直接控制操作数栈,它会将变量从操作数栈出栈从而改变操作数栈顶值,且对局部变量表没有读写操作;

所述虚拟空指令vm_nop,其当操作数栈栈顶变化值为0、操作数栈读写次数为0且局部变量表读次数为0时,判定此解释例程没有执行任何操作。

进一步的,所述虚拟运算指令读操作数栈的次数是和根据算术符需要读操作数的个数一致的。

进一步的,所述简化和归类的方法,包括:以操作数栈栈顶的变化值为主判断依据,然后在其内部再进一步判断其他条件,从而判定该解释例程对应的指令类别。

进一步的,所述所述以操作数栈栈顶的变化值为主判断依据,然后在其内部再进一步判断其他条件,从而判定该解释例程对应的指令类别的方法,包括:

遍历所有的解释例程集合,判断操作数栈变化范围。

如果操作数栈变化范围小于0,则进一步判断局部变量表的读次数,如果大于0,则是Tload指令,等于0则是Tconst指令。

操作数栈变化值如果等于0,则进一步判断操作数栈的读次数,如果大于0,则是Tmath指令,如果等于0则是Tnop指令。

如果操作数栈变化值大于0,则进一步判断局部变量表的读次数,如果大于0,则是Tstore指令,等于0则是Tpop指令。

本发明实施例还提供一种分析解释例程的虚拟指令装置,包括:

简化和归类模块,用于将虚拟机保护的虚拟指令集进行简化和归类;

形成模块,用于简化和归类后分别形成为虚拟加载和存储指令、虚拟运算指令、虚拟退栈指令和虚拟空指令。

本发明实施例还提供一种分析解释例程的虚拟指令设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现所述分析解释例程的虚拟指令方法。

本发明实施例还提供一种计算机可读存储介质,存储有计算机可执行指令,所述计算机可执行指令用于执行所述分析解释例程的虚拟指令方法。

本发明实施例,其方法根据虚拟机解释器的解释例程执行特征,以及对每个虚指令解释例程的指令对局部变量区的读次数、操作数栈的读次数和栈顶的改变值分析,以实现对虚指令的逆向还原,有助于对虚拟机保护的恶意代码的语法和语义分析及检测。

本发明的其它特征和优点将在随后的说明书中阐述,并且,部分地从说明书中变得显而易见,或者通过实施本发明而了解。本发明的目的和其他优点可通过在说明书、权利要求书以及附图中所特别指出的结构来实现和获得。

附图说明

图1是本发明实施例的所述分析解释例程的虚拟指令方法的整体流程图;

图2是本发明实施例的分析解释例程的虚拟指令装置的结构图。

具体实施方式

下文中将结合附图对本发明的实施例进行详细说明。

在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行。并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。

有专家提出通过逆向虚拟机结构,简化被混淆指令,将虚拟机指令转换中间语言,然后将中间语言编译转换为对应的CPU指令的方法来还原被保护的代码。但是,这种方法要求虚拟机解释器的结构满足特点条件,所以其不具有通用性。有专家提出通过识别被保护软件的API调用,然后抽取出所有影响API参数的指令来近似表示程序的原始代码。这种方法只能得到影响API参数的指令,其并不能有效还原被保护程序语义。针对当前分析方法存在的不足,本发明实施例提出一种分析解释例程所对应的虚拟指令方法实现对虚拟机保护破解。

针对上述情况,本发明实施例提出一种分析解释例程的虚拟指令方法,包括:

步骤101,将虚拟机保护的虚拟指令集进行简化和归类。

步骤102,简化和归类后分别形成为虚拟加载和存储指令、虚拟运算指令、虚拟退栈指令和虚拟空指令。

其中,大多数的指令都包含了其所操作的数据类型信息,例如,iload指令用于从局部变量中加载int类型的数据到操作数栈中,对于大部分与数据类型相关的字节码指令来说,它们的操作码助记符中都有特殊的字符来表明该指令作用于那种数据类型,b代表对byte类型的数据操作,s代表short,i代表对int,l代码long,f代表float,d代表double。这里也采用类似的操作码助记符,对于没有助记符的长度以T开头加上对应的长度,比如操作数据的长度为6则用T6作为助记符,从操作数据的字长来判定不同的类型,而对相同字长的具体类型尚难以区分,比如4字节的int和float,8字节的long和double。当操作数栈变化值为-4时,即操作了一个4字节的数据,这里用i作为其助记符,完整表示即为iload。其他指令的表达参考上述助记符。

其中,在一个实施例中,第一类是所述虚拟加载和存储指令,这类指令涉及到一个变量或常量在局部变量表和操作数栈之间的传递;针对这类指令,它的典型特征分别是,vm_load加载指令将一个本地变量加载到操作数栈中,那么意味着对操作数栈会有一个压栈操作,即体现在操作数栈顶变化值为-4或-8,具体的绝对值与压栈变量的长度有关;另外,还会对局部变量区有1次读操作。所以,当分析一个解释例程对操作数栈栈顶的变化值为负数且对局部变量表的读写次数不为0,那么就推导其是一个vm_load加载指令。其中,当操作数栈顶变化之为-4时,为vm_iload表示将一个4字节长度的变量加载到操作数栈中。当操作数栈顶变化之为-8,为vm_lload表示将一个8字节长度的变量加载到操作数栈中。对应的,vm_store存储指令有一个出栈操作,操作数栈的变化值为4或8,且对局部变量区有1次写操作,其中vm_istore表示将一个4字节长度的数值从操作数栈存储到局部变量表中,vm_lstore表示将一个8字节长度的数值从操作数栈存储到局部变量表中。vm_const指令类似vm_load指令,不同的是加载的是常量,所以区别在于对局部变量区没有读写操作。其中,vm_sipush表示将一个2字节的常量加载到操作数栈中,vm_iconst表示4字节的常量加载到操作数栈,vm_lconst表示8字节的常量加载到操作数栈。

第二类指令是所述虚拟运算指令vm_math,虚拟运算指令的语义特征是它会去读操作数栈而不改变操作数栈顶;

在一个实施例中,所述虚拟运算指令读操作数栈的次数是和根据算术符需要读操作数的个数一致的。比如取反指令需要1个操作数,加法指令需要2个操作数,除法指令需要3个操作数。分别使用vm_math1、vm_math2和vm_math3表示有1,2和3个操作数的情况。

第三类指令是所述虚拟退栈指令vm_pop,用于直接控制操作数栈,它会将变量从操作数栈出栈从而改变操作数栈顶值,且对局部变量表没有读写操作;其中,当出栈变量的字长分别为2,4,6,8时,它们对应的指令分别为vm_sipop、vm_ipop、vm_T6pop和vm_dpop。

第四类指令是所述虚拟空指令vm_nop,其当操作数栈栈顶变化值为0、操作数栈读写次数为0且局部变量表读次数为0时,判定此解释例程没有执行任何操作。

对比JAVA虚拟机的虚拟指令分类,本发明实施例重点在于对虚拟加载和存储指令、虚拟算术指令和虚拟操作数栈管理指令的识别,而类型转换指令、对象的创建与操作、方法调用和返回、抛出异常和同步指令涉及到具体的语言语义层面,在做指令类比时,很难假设虚拟机保护也有对等类别的指令集。另外,本发明实施例的算法也未对控制转移指令进行展开逆向分析。

其中,根据如上所述,本发明实施例的方法的伪代码如下所示:

在一个实施例中,所述简化和归类的方法,包括:以操作数栈栈顶的变化值为主判断依据,然后在其内部再进一步判断其他条件,从而判定该解释例程对应的指令类别。

根据解释例程所对应的虚拟指令分析算法的伪代码,其流程如图1所示。

在一个实施例中,所述以操作数栈栈顶的变化值为主判断依据,然后在其内部再进一步判断其他条件,从而判定该解释例程对应的指令类别的方法,包括:

步骤201,遍历所有的解释例程集合,判断操作数栈变化范围。

步骤202,如果操作数栈变化范围小于0,则进一步判断局部变量表的读次数,如果大于0,则是Tload指令,表示将一个本地变量加载到操作数栈中。如果等于0,则是Tconst指令,表示将一个常量加载到操作数栈中。

步骤203,操作数栈变化值如果等于0,则进一步判断操作数栈的读次数,如果大于0,则是Tmath指令,表示一种算数运算指令。如果等于0,则是Tnop指令,表示空操作。

步骤204,如果操作数栈变化值大于0,则进一步判断局部变量表的读次数,如果大于0,则是Tstore指令,表示将一个数值从操作数栈存储到局部变量表中。如果等于0,则是Tpop指令,表示把变量从操作数栈弹出。

本发明实施例的虚拟加载指令逆vm_load和存储虚拟指令vm_istore逆向还原,这类指令涉及到一个变量或常量在局部变量表和操作数栈之间的传递。针对这类指令,它的典型特征分别是,vm_load加载指令将一个本地变量加载到操作数栈中,那么意味着对操作数栈会有一个压栈操作,即体现在操作数栈顶变化值为-4或-8,具体的绝对值与压栈变量的长度有关;另外,还会对局部变量区有1次读操作。所以,当分析一个解释例程对操作数栈栈顶的变化值为负数且对局部变量表的读写次数不为0,那么就推导其是一个vm_load加载指令,其中,当操作数栈顶变化之为-4时,为vm_iload表示将一个4字节长度的变量加载到操作数栈中,当操作数栈顶变化之为-8,为vm_lload表示将一个8字节长度的变量加载到操作数栈中。对应的,vm_store存储指令有一个出栈操作,操作数栈的变化值为4或8,且对局部变量区有1次写操作,其中vm_istore表示将一个4字节长度的数值从操作数栈存储到局部变量表中,vm_lstore表示将一个8字节长度的数值从操作数栈存储到局部变量表中。vm_const指令类似vm_load指令,不同的是加载的是常量,所以区别在于对局部变量区没有读写操作。其中,vm_sipush表示将一个2字节的常量加载到操作数栈中,vm_iconst表示4字节的常量加载到操作数栈,vm_lconst表示8字节的常量加载到操作数栈。

虚拟运算指令vm_math逆向还原,算术指令的语义特征是它会去读操作数栈而不改变操作数栈顶。读的次数根据算术符需要操作数的个数。比如取反指令需要1个操作数,加法指令需要2个操作数,除法指令需要3个操作数。分别使用vm_math1、vm_math2和vm_math3表示有1,2和3个操作数的情况。

虚拟操作数出栈指令vm_pop逆向还原,用于直接控制操作数栈,它会将变量从操作数栈出栈从而改变操作数栈顶值,且对局部变量表没有读写操作。其中,当出栈变量的字长分别为2,4,6,8时,它们对应的指令分别为vm_sipop、vm_ipop、vm_T6pop和vm_dpop。

虚拟空指令vm_nop逆向还原,当操作数栈栈顶变化值为0、操作数栈读写次数为0且局部变量表读次数为0时,判定此解释例程没有执行任何操作。

如图2所示,本发明实施例还提供一种分析解释例程的虚拟指令装置,包括:

简化和归类模块71,用于将虚拟机保护的虚拟指令集进行简化和归类;

形成模块72,用于简化和归类后分别形成为虚拟加载和存储指令、虚拟运算指令、虚拟退栈指令和虚拟空指令。

本发明实施例还提供一种分析解释例程的虚拟指令设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现所述分析解释例程的虚拟指令方法。

本发明实施例还提供一种计算机可读存储介质,存储有计算机可执行指令,所述计算机可执行指令用于执行所述分析解释例程的虚拟指令方法。

在本实施例中,上述存储介质可以包括但不限于:U盘、只读存储器(ROM,ReadOnlyMemory)、随机存取存储器(RAM,RandomAccessMemory)、移动硬盘、磁碟或者光盘等各种可以存储程序代码的介质。

本领域普通技术人员可以理解,上文中所公开方法中的全部或某些步骤、系统、装置中的功能模块/单元可以被实施为软件、固件、硬件及其适当的组合。在硬件实施方式中,在以上描述中提及的功能模块/单元之间的划分不一定对应于物理组件的划分;例如,一个物理组件可以具有多个功能,或者一个功能或步骤可以由若干物理组件合作执行。某些组件或所有组件可以被实施为由处理器,如数字信号处理器或微处理器执行的软件,或者被实施为硬件,或者被实施为集成电路,如专用集成电路。这样的软件可以分布在计算机可读介质上,计算机可读介质可以包括计算机存储介质(或非暂时性介质)和通信介质(或暂时性介质)。如本领域普通技术人员公知的,术语计算机存储介质包括在用于存储信息(诸如计算机可读指令、数据结构、程序模块或其他数据)的任何方法或技术中实施的易失性和非易失性、可移除和不可移除介质。计算机存储介质包括但不限于RAM、ROM、EEPROM、闪存或其他存储器技术、CD-ROM、数字多功能盘(DVD)或其他光盘存储、磁盒、磁带、磁盘存储或其他磁存储装置、或者可以用于存储期望的信息并且可以被计算机访问的任何其他的介质。此外,本领域普通技术人员公知的是,通信介质通常包含计算机可读指令、数据结构、程序模块或者诸如载波或其他传输机制之类的调制数据信号。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号