一种程序指令的执行方法及装置与流程

文档序号:26446032发布日期:2021-08-27 13:46阅读:89来源:国知局
一种程序指令的执行方法及装置与流程

本发明涉及微处理架构技术领域和虚拟机技术领域,尤其涉及一种程序指令的执行方法及装置。



背景技术:

虚拟机(vm,virtualmachine)是指一种字节码执行软件。例如,javavm是一种与java编程语言有关的虚拟机,由java语言编写的java代码经过编译工具转换成java字节码(bytecode)。java字节码可在javavm上运行。此外,基本上所有的脚本语言编写的程序都会由特定的vm来执行。但是,现有的大多数vm或者微处理器架构中,其指令执行并不完全安全,例如,在跳转指令执行时被攻击者修改指令访问地址,从而带来难以预计的安全问题。

因此,需要一种新的程序指令的执行方法。



技术实现要素:

本发明的实施例提供一种程序指令的执行方法和装置,相较于传统的指令执行方法,该方法通过在程序加载/编译阶段,对于预定函数建立保存了预定函数起始、结束地址,以及其中所有地址跳转指令的目标地址的跳转表,从而在程序执行时,基于跳转表验证跳转指令的跳转范围是否合法,根据验证结果确定是否允许跳转指令执行。利用该方法可以防止程序执行过程中的非法跳转,提高指令执行的安全性。

本发明为解决上述技术问题采用的技术方案为,一方面提供一种程序指令的执行方法,包括:

在执行第一程序之前,

针对第一程序中的若干预定函数,记录各预定函数的起始地址和结束地址,以及各预定函数中的所有地址跳转指令的目标地址;所述预定函数中包括第一函数和第二函数;

在执行第一程序时,

当在第一函数中执行第一地址跳转指令时,确定所述第一地址跳转指令的目标地址,是否处在已记录的第一函数的起始地址至结束地址之间、且处于已记录的第一函数的所有地址跳转指令的目标地址之中;

若结果为否,则中止执行第一地址跳转指令;

当在第一函数中执行第一函数调用指令时,确定第一函数调用指令的目标地址,是否为已记录的第一函数调用指令访问的第二函数的起始地址;

若结果为否,则中止执行第一函数调用指令。

优选地,所述执行第一程序之前,为编译/加载第一程序时;

所述针对第一程序中的若干预定函数,记录各预定函数的起始地址和结束地址,以及各预定函数中的所有地址跳转指令的目标地址,包括:

针对第一程序中的若干预定函数建立各自对应的跳转表,在所述跳转表中记录其对应的函数的起始地址和结束地址,以及该函数中所有地址跳转指令的目标地址。

具体地,所述当在第一函数中执行第一地址跳转指令时,确定所述第一地址跳转指令的目标地址,是否处在已记录的第一函数的起始地址至结束地址之间、且处于已记录的第一函数的所有地址跳转指令的目标地址之中,包括:

当在第一函数中执行第一地址跳转指令时,确定所述第一地址跳转指令的目标地址,是否处在第一函数对应的跳转表中记录的,第一函数的起始地址至结束地址之间、以及所有地址跳转指令的目标地址之中;

所述当在第一函数中执行第一函数调用指令时,确定第一函数调用指令的目标地址,是否为已记录的第一函数调用指令访问的第二函数的起始地址,包括:

当在第一函数中执行第一函数调用指令时,确定所述第一函数调用指令的目标地址,是否为第一函数调用指令访问的第二函数对应的跳转表中记录的第二函数的起始地址。

具体地,所述方法还包括,

在跳转表中记录其对应的预定函数中的所有地址跳转指令的目标地址时,在所述跳转表中建立所述目标地址的索引,以及将所述跳转指令指向的对象由目标地址替换为该目标地址的索引;

所述确定所述第一地址跳转指令的目标地址,是否处在第一函数对应的跳转表中记录的,所有地址跳转指令的目标地址之中,包括:

确定第一地址跳转指令指向的所述索引,是否在第一函数对应的跳转表中包括的索引的范围内。

优选地,第一地址跳转指令为jump指令,第一函数调用指令为call指令。

优选地,所述程序指令为字节码指令,通过虚拟机执行。

具体地,所述虚拟机为java虚拟机。

优选地,所述程序指令为微处理器指令,通过微处理器执行。

第二方面,提供一种程序指令的执行装置,包括:

预处理单元,配置为,在执行第一程序之前,针对第一程序中的若干预定函数,记录各预定函数的起始地址和结束地址,以及各预定函数中的所有地址跳转指令的目标地址;所述预定函数中包括第一函数和第二函数;

第一指令判断单元,配置为,在执行第一程序时,当在第一函数中执行第一地址跳转指令时,确定所述第一地址跳转指令的目标地址,是否处在已记录的第一函数的起始地址至结束地址之间、且处于已记录的第一函数的所有地址跳转指令的目标地址之中;

第一指令终止单元,配置为,若结果为否,则中止执行第一地址跳转指令;

第二指令判断单元,配置为,当在第一函数中执行第一函数调用指令时,确定第一函数调用指令的目标地址是否为已记录的第一函数调用指令访问,的第二函数的起始地址;

第二指令终止单元,配置为,若结果为否,则中止执行第一函数调用指令。

第三方面,提供一种计算机可读存储介质,其上存储有计算机程序,当所述计算机程序在计算机中执行时,令计算机执行权利要求1-8中任一项的所述的方法。

附图说明

为了更清楚说明本发明实施例的技术方案,下面将对实施例描述中所需使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1为本发明实施例提供的一种程序指令的执行方法的流程图;

图2为本发明实施例提供的一种函数的函数体示意图;

图3为本发明实施例提供的一种函数的跳转表的示意图;

图4为本发明实施例提供的一种程序指令的执行装置的结构图;

具体实施方式

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

当前,无论是通过vm执行的脚本语言的字节码指令,还是微处理器指令,都会包含若干类引起程序非顺序执行的跳转指令。比如,jmp指令,作用为跳转到地址;call指令,作用为函数调用;ret指令,作用为函数返回。而在大多数vm或者微处理器架构中,jmp/call的目标地址可以是整个指令空间。因此,攻击者可以在这些指令运行时,通过修改指令的访问地址,跳转到原有的目标地址之外的地址,从而带来安全上的隐患,比如修改call指令的目标地址(通常函数调用的目标地址为其目标函数的起始地址),使得call指令直接访问目标函数的中间位置,从而避开通常位于函数开头的验证代码,也就是说避开了目标函数的安全验证,根据目标函数的功能的重要性程度,攻击者的这种攻击会带来与之对应的安全问题。

为了解决上述技术问题,本发明实施例提供了一种程序指令的执行方法。图1为本发明实施例提供的一种程序指令的执行方法的流程图。如图1所示,该方法的流程至少包括:

步骤11,在执行第一程序之前,针对第一程序中的若干预定函数,记录各预定函数的起始地址和结束地址,以及各预定函数中的所有地址跳转指令的目标地址;预定函数中包括第一函数和第二函数。

在不同的实施例中,第一程序可以是不同种类的指令构成的程序。例如,在一个实施例中,第一程序为字节码程序,由字节码指令构成,通过虚拟机执行。注意,本说明书中所述虚拟机不是指操作系统虚拟化技术中的虚拟机,而是指可用于执行字节码指令的虚拟机。

在更具体的实施例中,所述虚拟机可以为不同种类的虚拟机,在一个例子中,该虚拟机可以为java虚拟机。在其他的例子,该虚拟机也可以是其它类别的可执行字节码的虚拟机。

在一个实施例中,第一程序也可以是微处理器指令构成的程序,微处理器指令可以通过微处理器执行,即可以通过硬件来执行。

通常在执行程序之前,会对程序进行编译和/或加载操作,所以可以在对程序进行编译或加载时,记录其中预定函数的起始、结束地址和函数中指令跳转地址。因此,在一个实施例中,所述执行第一程序之前具体可以为编译/加载第一程序时。

在不同的实施例中,预定函数可以是第一程序中的全部/部分函数,还可以根据预定的规则来确定。在一个实施例中,可以针对第一程序中的若干预定函数建立各自对应的跳转表,在所述跳转表中记录其对应的函数的起始地址和结束地址,以及该函数中所有地址跳转指令的目标地址;所述预定函数中包括第一函数和第二函数。

在一个实施例中,可以在跳转表中记录其对应的预定函数中的所有地址跳转指令的目标地址时,在跳转表中建立所述目标地址的索引,以及将地址跳转指令指向的对象由目标地址替换为该目标地址的索引。在一个例子中,还可以在跳转表中设置例如为跳转模式的标识,用于确定跳转表中是否建立了所述目标地址的索引,并在地址跳转指令运行中根据所述索引确定其目标地址。

图2为本发明实施例提供的一种函数的函数体示意图,如图2所示,该函数中包括3个地址跳转指令(图3中为3个cond.jmp条件跳转指令,既满足一定条件下进行地址跳转的指令),分别指向地址(该实施例中为相对于函数起始地址的偏移地址)10、25和21。可以在程序编译和加载时,针对该函数生成如图3所示的跳转表,该跳转表中记录了该函数的起始(base)、结束地址,以及各个地址跳转指令指向的目标地址,即地址10、25和21。图3所示实施例中,跳转表中还包括设置跳转模式的标识,跳转模式可以包括例如为0/1的两种模式,其中0模式,指示在执行时,地址跳转指令的目标是一个访问地址(例如为相对函数起始地址的偏移地址);1模式,指示在执行时,地址跳转指令的目标指向跳转表的索引。在一个例子中,索引可以以0开始,例如在图3的表中,索引0(图3中未示出)可以指向第一个跳转地址10。

步骤12,在执行第一程序时,当在第一函数中执行第一地址跳转指令时,确定所述第一地址跳转指令的目标地址,是否处在已记录的第一函数的起始地址至结束地址之间、且处于已记录的第一函数的所有地址跳转指令的目标地址之中。

在上述建立跳转表的实施例中,可以在第一函数中执行地址跳转指令时,确定所述第一地址跳转指令的目标地址,是否处在第一函数对应的跳转表中记录的,第一函数的起始地址至结束地址之间、以及所有地址跳转指令的目标地址之中。

在上述在跳转表中建立跳转地址索引的实施例中,可以确定地址跳转指令指向的索引,是否在第一函数对应的跳转表中包括的索引的范围内。

在上述利用java虚拟机执行指令的实施例中,第一地址跳转指令可以为jump指令。在利用其他虚拟机或微处理器执行指令的实施例中,第一地址跳转指令也可以是其它虚拟机或微处理器中用于进行地址跳转的指令,本说明书对此不作限制。

步骤13,若步骤12中得到的确定结果为否,则中止执行第一地址跳转指令。

该步骤中,若步骤12中得到的确定结果为否,也就是说,第一地址跳转指令的目标地址不处于程序执行前已记录的第一函数的起始地址至结束地址之间、或者不处于已记录的第一函数所有地址跳转指令的目标地址之中(例如为跳转表中记录的),则中止第一地址跳转指令的执行。

如此,一方面可以防止第一函数中地址跳转指令访问函数外的地址,从而防止攻击者在程序运行时,修改地址跳转指令的目标地址,非法访问其它程序或函数正在合法使用的地址区域。另一方面,通过在执行前记录的精确的地址跳转列表,对运行时的第一函数中地址跳转指令可以访问的地址,进行精确验证和限定。

在一个实施例中,若步骤12中得到的确定结果为是,则继续执行第一地址跳转指令。在上述在跳转表中建立跳转地址索引的实施例中,可以根据第一地址跳转指令指向的跳转表中的索引,从跳转表中查找其目标地址,进而根据该目标地址,执行地址跳转指令。

步骤14,当在第一函数中执行第一函数调用指令时,确定第一函数调用指令的目标地址,是否为已记录的第一函数调用指令访问的第二函数的起始地址。

在上述建立跳转表的实施例中,可以在第一函数中执行第一函数调用指令时,确定所述第一函数调用指令的目标地址,是否为第一函数调用指令访问的第二函数对应的跳转表中记录的第二函数的起始地址。

在上述在跳转表建立地址跳转指令索引的实施例中,可以确定第一地址跳转指令指向的所述索引,是否在第一函数对应的跳转表中包括的索引的范围内。

在上述利用java虚拟机执行指令的实施例中,第一函数调用指令可以为call指令。在利用其他虚拟机或微处理器执行指令的实施例中,第一地址跳转指令也可以是其它虚拟机或微处理器中用于进行函数调用的指令,本说明书对此不作限制。

在一个实施例中,若第一函数调用指令的目标地址指示的访问函数,为不确定是否具有对应跳转表的第三函数,可以先检查第三函数是否存在对应的跳转表,若检查结果为不存在,则直接根据第一函数调用指令的目标地址,执行第一函数调用指令。

步骤15,若步骤14中确定结果为否,则中止执行第一函数调用指令。

该步骤中,若步骤14中得到的确定结果为否,也就是说,第一函数调用指令的目标地址不是第二函数的起始地址,则中止第一函数调用指令的执行。

如此,可以防止第一函数调用指令执行时访问第二函数的起始位置以外的其它位置。从而防止攻击者在程序运行时,修改函数调用指令的目标地址,非法跳转到其它函数的非入口地址区域,从而例如避开了其它函数通常在入口地址之后安全验证代码的检验。

在一个实施例中,若步骤14中得到的确定结果为是,则继续执行第一函数调用指令。

根据又一方面的实施例,提供了一种程序指令的执行装置。图2为本发明实施例提供的一种程序指令的执行装置的结构图,如图4所示,该装置400包括:

预处理单元41,配置为,在执行第一程序之前,针对第一程序中的若干预定函数,记录各预定函数的起始地址和结束地址,以及各预定函数中的所有地址跳转指令的目标地址;所述预定函数中包括第一函数和第二函数;

第一指令判断单元42,配置为,在执行第一程序时,当在第一函数中执行第一地址跳转指令时,确定所述第一地址跳转指令的目标地址,是否处在已记录的第一函数的起始地址至结束地址之间、且处于已记录的第一函数的所有地址跳转指令的目标地址之中;

第一指令终止单元43,配置为,若结果为否,则中止执行第一地址跳转指令;

第二指令判断单元44,配置为,当在第一函数中执行第一函数调用指令时,确定第一函数调用指令的目标地址,是否为已记录的第一函数调用指令访问的第二函数的起始地址;

第二指令终止单元45,配置为,若结果为否,则中止执行第一函数调用指令。

根据又一方面的实施例,还提供一种计算机可读介质,包括存储于其上的计算机程序,所述计算机在运行时执行上述的方法。

上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。

专业人员应该还可以进一步意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。

结合本文中所公开的实施例描述的方法或算法的步骤可以用硬件、处理器执行的软件模块,或者二者的结合来实施。软件模块可以置于随机存储器(ram)、内存、只读存储器(rom)、电可编程rom、电可擦除可编程rom、寄存器、硬盘、可移动磁盘、cd-rom、或技术领域内所公知的任意其它形式的存储介质中。

以上所述的具体实施方式,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施方式而已,并不用于限定本发明的保护范围,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

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