用于监控程序流程的方法

文档序号:6493931阅读:197来源:国知局
专利名称:用于监控程序流程的方法
技术领域
本发明涉及计算机程序安全领域,尤其是用于在一段计算机程序的执行中检测不可接受步骤的一种方法和设备,其中该程序能够用一种低级或者高级语言编写。
在一段用低级语言编写的程序中,依据一种结构非常接近于那些实际由计算机处理器部分执行的指令的结构来编制命令。该程序在能够被执行之前仅仅需要进行编译。低级语言,通称为机器代码,特别用于编程微处理器或者微控制器。微控制器是仅仅能够执行少量特定指令的处理器。特别地,它们用于装备智能卡(银行信用卡、电话卡、提供服务接入的卡,等等)以及用于控制工业或者家庭装置。
在一段用高级语言编写的程序中,命令具有一个接近于自然语言的结构,但另一方面更远离了处理器所使用的结构。以这样的语言写成的命令在它们能够以指令形式被处理器执行之前,必须首先进行解释,也就是说要被转换为机器代码命令。
这样任何计算机程序都会产生一系列适于它用于的处理器、微处理器或者微控制器的指令。
通常,一段程序的指令由一个处理器以一个指令计数器所控制的次序执行,如将结合附

图1简要描述的那样。
一段程序的编译指令以连续的指令块Inst.1、Inst.2、Inst.3、……、Inst.n(其中n是一个整数)为单位、以代码或者微码的形式装载到一个指令寄存器2中。在这个寄存器2中,每条指令都由一个特定地址进行标识。在该例子中,这些指令Inst.1、Inst.2、Inst.3、……、Inst.n的地址分别被指定为Ad.1、Ad.2、Ad.3、……、Ad.n。这些指令从指令寄存器2中读取出来并且被连续地装载到处理器4里以便在一个指令计数器6的控制下在那儿执行,其中该指令计数器本身由处理器4控制。为了这个目的,该指令计数器6具有一个地址指针8,用来指示寄存器2的地址Ad.1、……、Ad.n,而在一个指令序列的执行期间必须从该寄存器2中读取要载入到处理器4中的指令。指针8的位置相对于指令寄存器2中的地址,因此会随着这些指令的执行而改变。
在图1描绘的例子中,在寄存器2中的这些指令Inst.1、Inst.2、Inst.3、……、Inst.n必须从第一条指令Inst.1到第n条指令Inst.n连续地执行,即以一种线性方式执行。这样指令计数器6的指针8最初指定寄存器2的地址为Ad.1,而且相应指令Inst.1的数据10-1被载入到处理器4中。当处理器4命令指令计数器6提供下一条指令(在这种情况下是Inst.2)时,所述计数器将指针8的位置增加一个地址更换单元以便指定地址Ad.2。重复这个过程,并且当指针8指定地址Ad.n以便载入最后一条指令Inst.n的数据10-n(虚线)时,结束这个过程。
以一种线性方式执行的一系列指令不包含任何“跳转”,“跳转”脱离了指针8关于连续地址的顺序增长。这就是这种情况,例如,以微码形式的指令序列如下所示lda ttxamulbset 3,tsta n换句话说,这个序列将以一种线性方式执行,当从一条指令转移到另一条指令时,指令计数器6增加一个地址更换单元。
然而,一段程序的执行需要跳转到位于寄存器2中存在的指令线性序列之外的指令,这是正常的。这样的跳转能够由一条用于载入位于该序列之外一个地址上的数据的指令产生,或者是由一条称为开关指令、用于条件执行随后命令的指令产生。
一条导致跳转的指令使得下面这个过程变得必要即在指令计数器6处,确定在这个跳转之后的下一条指令在寄存器2中的地址,并且将指针8定位到这个地址以便使位于那儿的指令或者数据被载入到处理器2中。
举例来说,序列ldatxabra label;jumpmul
bset 3,tsta nlabel rts将导致一个在对应于命令“jump”的代码位置的新值载入到指令计数器6中。
这种在命令下能够跳转到一个顺序系列地址之外的地址的事实会不幸地引起程序中不可接受的步骤。在程序中这样不可接受的步骤可以由该程序设备一个意外的误操作产生。然而,它也可以由一个旨在使程序设备功能偏离它要求功能的恶意操作产生。例如,在智能卡的情况下,通过创建或者修改跳转和/或开关指令来修改微处理器的程序编制,可以使载入错误数据(增加用一个银行或者电话卡授权的信贷,对访问某些服务的错误授权,等等)、或者恢复保存在存储器中的机密数据(存取码,关于该卡持有人的个人信息,等等)成为可能。
这是因为,即使当程序以一种固定的方式记录在一个半导体芯片上时,仍然有可能利用用于探测和测试组件的当前技术、使用具有焦点离子束或者FIB的工作站在该芯片的表面上(或者甚至在其中的低层上)创建探测触点。
这些探测点一旦被创建了,就使得使用专用的工作台、英语术语也称为“Probe station”放置探测针成为可能,这允许连续地读取一位(以及监控它随时间的变化)或者对其值进行一个外部修改。
特别地,在指令计数器6寄存器上放置触点,使得从外部载入当前正被执行的寄存器中值以及导致一个不是由程序设计员提供的转换成为可能。如上所述,这样的一个跳转自然会对应用程序安全产生有害的后果,例如当产生不完全计算时会导致保密数据的泄露。
还存在更基本、但是确信度较小的方法导致程序运行过程中的这种误操作。R.Anderson在一篇名为“Tamper resistance,a cautionarynote”的文章中给出一个例子。另一种技术包括利用故意导致的计算误差,以便从一个智能卡中提取诸如密匙之类的数据。这种技术在Boneh、DeMillo和Lipton等人于1996年10月31日在Bellcore Report上发表的、名为“On the Importance of Checking Computations”的文章中描述过。
当然,当要攻击的程序被解释而不是被编译时也会发生相同的现象。例如,如果攻击者设法造成在向解释器指示当前指令的解释器程序指针上的一个改变,这样则以Java或者BASIC语言编写的应用程序就能够偏移它的合法使用。
然而,当前的计算机系统没有进行特定设计以阻止在一个代码内不受控制的转换。恰恰相反,汇编语言已经被特定设计以允许程序员的最大自由。举例来说,在C语言中,使用由指针索引的执行,就有可能在一个函数的代码内进行跳转。
根据以一种不可接受的方式运行一段程序的这些问题,而不论它们是否由不想要的误操作或者由一个将该程序偏移其预期使用的意图所造成,本发明提出了一种方法用于在一段计算机程序的一系列指令执行中监控进程,该方法包括分析被传输到用于执行正被监控的程序的处理器的指令序列,而且利用和所述程序一起记录的参考数据验证这个分析的结果。
这样本发明使得如下过程成为可能即检验在考虑中的指令集里所包含的所有指令是否为了它们的执行的确已经传输到处理器中。如果情况是这样的话,就假定如此读取的指令将也已经被执行了。
该参考数据,例如能够是预先确定的一个值,以便只有当该指令序列中的所有指令事实上已经在该程序执行期间被分析过了时,才对应于在该监控方法期间产生的分析结果。
更可取地,该分析步骤包含如下子步骤从每条传输到处理器的指令中提取一个数据项,以及在每个这样提取的数据项上进行预定计算;而验证步骤包括将分析的结果和参考数据进行比较。
有利地是,验证步骤受到与监控装置有关的一个寄存器中包含的值和该参考值的一个硬接线比较的影响,其中后者能够以一种硬接线方式输入到该程序中,并在构成正被监控程序的代码掩蔽期间被一次固定(例如在一个ROM类型的固定存储器中)。
更可取地是,该验证由一条位于该程序中一个预定位置上的指令引起,这条指令包含上述的参考数据。
有利地是,当要被监控的指令集中的指令处于一个值、十六进制或者十进制时,在上述分析期间这些指令被当作简单的数字值对待。
这样用于监控一段计算机程序的一个指令序列执行的全程方法能够包含以下步骤
-在该程序的准备期间-在该程序一个指令序列中在至少一个预定位置上包含一个参考值,该值是依据适用于每条要被监控指令中的可识别数据的一个给定规则确定的;以及-在要被监控的部分程序的执行期间-获得在每条执行指令中的上述可识别数据;-对这样获得的上述可识别数据应用上述给定规则,以便建立一个验证值;以及-验证这个验证值其事实上相当于和程序一起记录的参考值。
在本发明的一个最佳实施例中,当检测到该验证值不等于参考值时,为中断该程序的运行预先采取了措施。如果检测到在验证值和参考值之间的这种不一致性达到了一个预定次数,则这个中断能够伴随着对将来包含被监控计算机程序的设备使用的无效作用。
有利地是,要被监控的指令集在为其而设的运行中不包括跳转,以便期望它包含的所有指令在所有设想的情况下执行。
当要被监控的程序或者程序的一部分包含了至少一个跳转时,就有可能为不包含跳转的指令集分别应用这个监控方法。
在一条指令取决于正被操作的数据产生至少一次跳转的情况下,也就是说在条件转换中,有可能分别为在该跳转之前没有跳转的一个指令集和在这个跳转之后没有跳转的至少一个指令集使用该监测方法。
在这种情况下,能够想象到,对于在一个跳转之前的指令集,为了进行旨在获得这个指令集验证值的分析,要求该跳转的指令(这条指令一般是一个切换之前的最后一条指令)要包含在这个指令集中,这样在执行该转移指令之前,这个指令集的正确运行就能够得到验证。
有利地是,在该方法前一次实施期间所获得的验证值在该方法的每次新实施中都被删去了。这个规定使得有可能容易地控制对一段程序中不同指令集、诸如那些由跳转分开的指令集的监控。特别地,这使得为由跳转分开的不同指令集实施使用相同初始条件验证值计算的方法成为可能。
在该方法的每次新实施中,能够通过一次简单的复位删去验证值。这个值还可以被另一个预定的初始值所替代。通过该被保护软件本身就能够激活这些复位或初始化操作。
有利地是,作为一系列值中的最后一个值获得该验证值,其中该系列值随着对该指令集中每一条相应指令的分析而连续改变。这种方法使得包含该监控方法运行的一个内部状态以及跟踪它的改变成为可能。
更可取地是,允许验证值这种改变的分析方式包括为每条跟随前一条指令的相应指令,对从正讨论指令中提取的值以及在前一条指令上执行相同操作获得的结果,计算一个操作结果。对于与第一条要被验证指令相关的计算,有可能把操作应用到从该第一条指令提取的数据以及一个预定值(其可能相当于重新初始化值或者上述的复位值)上,在缺少前一个操作结果的情况下,这能够用作一个“种子”值。
这样,通过使用一个适用于以同样方式用于从每一条正被讨论的指令中提取的数据上的递归算法,就有可能获得正确的验证值。此外,能够容易地选择该计算操作,以便只有当在计算期间所有指令的一些数据已经被考虑过,而且它们已经以一个规定的次序考虑过时,才能获得一个正确的验证值。
依据在数据加密领域本来已知的技术,这种计算操作能够是运用一个散列函数,诸如由联邦散列标准确定的SHA-1散列函数。在这种情况下,通过加密散列在最后执行的初始化之后执行的所有操作代码(被认为是数字值)以及地址,有可能在该监测方法的运行中实现上述的内部变化。
在一个变体中,有可能通过对在最后进行的初始化之后执行的所有操作代码和地址进行一个冗余度计算,而不一定是加密计算,来改变该验证值。举例来说,有可能使用CRC(英语称为cyclic redundancycheck)类型的算法。
当包含在相应指令中的数据是在其执行期间获得时,利用本发明就有可能通过中间值的计算获得比较值。利用这个方法,就没有必要保存每个从正被讨论指令集的指令中提取的值。这是因为,在一次中间值计算的最后,仅仅这个中间值用于计算下一个中间值(或者最后的值,其相当于验证值),而且不再考虑有可能产生它的数据项。这个方案使得实现本发明的装置节省存储空间成为可能。
作为一个变体,有可能保存该指令集的指令中包含的每个数据项,这些指令被认为是仅仅在必要时、例如在验证步骤中被执行并且实现该验证值的计算。
本发明还涉及一种用于监控一段计算机程序的一系列指令执行步骤的设备,其特征在于它具有用于分析指令序列的装置,其中该指令序列被传输到用于执行该被监控程序的处理器中,以及它还具有用于利用与所述程序一起记录的参考数据验证这个分析结果的装置。
有利地是,根据本发明的监控装置包含一个寄存器用于记录该验证值计算中的中间结果。这个寄存器能够适合于仅仅保持最后的当前中间结果。
能够预先采取措施,以允许在当前正被执行程序的命令下记录一个预定值或者一个复位。这样,该程序能够在该监控方法的每次新实施时要求关于该寄存器内容的一个初始条件,例如发生在该程序中的一次跳转之后。
该监控设备能够集成到一个用于执行被监控程序的设备中,或者被集成到包含被监控程序的被编程设备中。
本发明还涉及一种程序执行设备,例如一台计算机,一个具有微处理器或者微控制器的装置诸如一个智能卡阅读器或者一个用于读取以PCMCIA格式记录在一张卡上的程序的阅读器,该设备用于执行一段计算机程序的一系列指令,其特征在于它具有用于分析传输用以执行的指令序列的装置,以及用于验证这个分析的结果是否与该程序一起记录的参考数据符合的装置。
本发明还涉及一个程序设备,用于与上述的程序执行设备一起作用,并且包含一系列指令,其特征在于它还包括依据所述指令中包含的数据预先确定的参考数据,以及用于允许对由上述程序执行设备分析的指令序列进行一次验证。
该被编程设备,例如一个智能卡或者诸如一个ABS制动系统的机械控制设备,能够在一个ROM类型的固定存储器中包含被监控的程序。
有利地是,参考数据在程序代码屏蔽期间,只此一次以预先布线值的形式被记录在该存储器中。
本发明还涉及一种对用于执行一段程序、和上述被编程设备协同作用的设备进行编程的设备,其特征在于它包含装置用于,在该程序的一系列指令的至少一个预定位置上,输入一个参考值,该参考值依据一种预定模式、由在一个希望其执行被监控的指令集中的每条指令所包括的数据计算得到。
最后,本发明还涉及一个虚拟机或者解释器用于解释关键代码,其特征在于它实现了上述用于执行这个关键代码的监控方法。
上述用于监控、执行一段程序、或者编程的设备,或者装备有这样程序的设备能够装备实现上述监控方法不同的可能可选方面所必需的所有装置。
举例来说,有可能设想,在一个与一个智能卡相关的应用中,除了增加一个执行一段程序的微处理器之外,还附加一个硬件部件作为一个监控单元。这个单元的作用是监控任何不是由软件设计师提供的跳转不能够在执行期间发生。在这个例子中,该监控单元可以由寄存器组成,其中该寄存器的内容在任何时候都构成了该监控单元的内部状态。该监控单元的一个特定输入允许它被重置,这一般是通过清除该监控单元的内容来完成。这个操作可以在任何时候由正执行的软件激活,并且能够,例如,受到在汇编程序中增加一个新的操作码(例如“clr us”)的影响或者受到对保护组件的存储器中的一个数据位进行操作(例如setb 3,service)的影响。
在这个示例应用中,监控单元将它的内部状态与由保护软件提供的一个数据串进行比较。例如,这能够受到在该监控单元内复制该值(利用一个“Ida-sta”循环)的影响,其中所需软件利用该值来比较内部状态。一旦该值的复制已经结束,该监控单元把它与其内部状态相比较,并且采取以下的动作如果该监控单元的状态等于由该受保护软件呈现的值,则正常地继续执行,否则就停止该程序的执行(强迫用户重置该卡),有可能通过预先批准一个在EEPROM类型非易失性存储器中的错误执行计数器,在该计数器的值超过一个合理的极限(例如4)时,影响该卡的确定块。
该监控单元能够永久地保持从它最后一次复位之后执行的指令代码和地址的一个加密散列。
该监控机构能够应用于在一个虚拟机中的代码解释(例如Java“Byte code”类型)。编译程序能够计算一部分字节代码散列的值,其中该代码被集成到一个英语术语称为产品“class file”(类文件)的结构的属性中,并且添加到英语术语称为附加“opcodes”(操作码)的字节代码形成码中,其中该“opcodes”对应于监控单元的复位以及对应于验证操作的调用。该虚拟机将替代一个监控单元,并且当它遇到验证操作码时,相对类文件中包含的理论散列值,验证当前的散列值。
通过阅读以下仅作为举例而给出的最佳实施例的描述并结合附图,本发明将更清楚地得到理解,而且其优点和特征将更清楚地显露出来,其中——图1,已经介绍过了,是一个为了说明一个指令计数器在一段程序执行中作用的简化框图;——图2是一个程序执行设备的简化框图,旨在说明根据本发明第一实施例的一个监控单元的操作原理;——图3是依据本发明的监控方法的流程图;——图4是依据本发明的监控方法的一个变体的流程图;——图5是一个程序执行设备的简化框图,旨在说明依据本发明第二实施例的一个监控单元的操作原理;——图6是依据本发明、适于第二实施例的监控方法的流程图;——图7示意性地描述了具有转换的一段程序的指令集,该指令集还包含专用于该监控方法的指令。
本发明的原理将结合图2的框图加以说明,其中那些作用类似于图1中的那些方框的方框具有相同的标记,而且为简明起见将不再进行描述。
图2描述了一个程序执行设备20在广义上的基本元件。它能够是一台用于执行一段用高级语言编制的程序的计算机、一个微处理器或一个微控制器,后者在用低级语言编制的程序下运行。举例来说,执行设备20能够是一个用于管理银行业务或电话交易或者其它服务的智能卡阅读器。然后要被验证的程序被包含在该智能卡中。
为了使以下的描述更为具体,假定程序执行设备20基于一个微控制器型的处理器4。
该处理器4执行以微码形式保存在一个指令寄存器2中的一部分程序。这个程序部分的操作部分包含一个n条指令序列(其中n是一个大于1的整数),分别用Inst.1、Inst.2、Inst.3、……、Inst.n表示。构成这些指令的这些微码处于数字值形式,它们能够是十进制或者十六进制。
因此,能够以两种不同的方式考虑这样的一个值,分别带有一个数据项首先,作为一条指令,它表示该处理器(在这种情况下它将是指定的“代码值”);其次,作为一个简单的数字值能够进行算术运算处理(在这种情况下它将是指定的“数字值”Vinst.)。例如,第一条指令Inst.1等于40.这个数字是一个相当于一条由该处理器识别的指令的代码,但是它与该数字值40有相同的二进制结构。
在这些指令Inst.1、Inst.2、Inst.3、……、Inst.n中没有指令命令跳转到在这些指令执行的线性序列之外的其它指令。因此这个程序部分的正常和预期运行必然需要每一条指令连续地执行,从指令Inst.1开始并以指令Inst.n结束。这样,当指令寄存器2中的指令Inst.1到Inst.n被载入到处理器4中时,指令计数器6(已经描述过了)将它的指针8连续地定位在每一条指令的地址上。
根据本发明,程序执行设备20有一个监控单元22,它使得验证每一条指令Inst.1到Inst.n为了它们的执行的确已经被载入到处理器4中成为可能。它被功能连接在指令寄存器2和处理器4之间。因此,所有这些从指令寄存器2读取的指令在到达处理器4之前都要经过监控单元2。
在这个实例中,将监控单元22描述成被集成到程序执行设备20中。然而,当例如监控单元22被集成到一个在存储器中包含要监控的程序的智能卡中时,不用改变下面将要描述的这些原则,它同样能够和包含要监控程序的设备结合起来。
如以下更为详细的解释那样,监控单元22有一个寄存器24用于暂时地存储一个在指令Inst.1、Inst.2、Inst.3、……、Inst.n中包含的数据项,以及一个计算器26用于在这个数据项上执行运算。
监控单元的使用要求增加二条新指令到该程序的n条指令Inst.1、Inst.2、Inst.3、……、Inst.n中。第一条监控指令Inst.0放置在该程序的第一条指令Inst.1之前,第二条监控指令Inst.n+1放置在该程序的最后一条指令Inst.n之后。
在该程序n条指令的执行期间,对指令计数器6进行初始控制从而将它的指针8定位在第一条监控指令Inst.0的地址上。这条指令指示监控单元初始化一个包含在其寄存器24中的散列值VH。在该实例中,指令Inst.0简单地指示寄存器2使得值VH=0。它没有被传送到处理器4。
接下来,程序执行设备20进入该程序这些指令Inst.1、Inst.2、Inst.3、……、Inst.n的正常执行阶段。从指令寄存器2读取的每条指令首先被传送到监控单元22,在那儿它被认为是一个数字值。
每条指令的数字值由计算器26进行一个散列算法,诸如用联邦散列标准说明的SHA-1散列法。与一条指令Inst.i(其中i是一个从1到n的整数)相关的散列操作结果VHi被输入到寄存器24中。
这个VHi值用作下一条指令Inst.i+1散列操作的基础。然后,输入这样得到的关于指令Inst.i+1的散列结果VHi+1,来替代先前得到的散列结果VHi。
为经过监控单元22的每一条指令Inst.1、Inst.2、Inst.3、……、Inst.n都继续这个过程。
当执行最后一条指令Inst.n时,第二条监控指令Inst.n+1被载入到监控单元22中。这条指令有两个组分一个参考值Vref和用于计算器26的一个命令,用于将这个参考值Vref与输入到寄存器24中的最后一个散列结果进行比较。因此,这个最后值对应于从指令Inst.n(在该图中等于36)的数字值和为前一条指令Inst.n-1得到的散列结果VHn-1中获得的散列结果VHn。
因此,响应于第二条监控指令Inst.n+1,计算器26将寄存器22中的值VHn与在这条监控指令中指定的参考值Vref进行比较。
为了对应于指令Inst.1、Inst.2、Inst.3、……、Inst.n值的连续散列结果的预期值VHn,在该记录的程序的准备期间确定该参考值Vref。这个值Vref能够预先通过一个与监控单元22使用同样的过程,使用指令Inst.1、Inst.2、Inst.3、……、Inst.n的连续散列过程计算出来。
最好是,值Vref被存入到一个固定存储器以便使其不致于被一个恶意行为所修改。
如果当执行监控指令Inst.n+1时,监控单元22发现上述值Vref和VHn相同,则断定所有这些指令Inst.1、Inst.2、Inst.3、……、Inst.n为了它们的执行的确已经传送给处理器4。
相反,如果监控单元22发现值Vref和VHn不相同,则断定要么就是不是所有的这些指令Inst.1、Inst.2、Inst.3、……、Inst.n已经由该监控单元接收和传送,要么就是它们没有以预期的顺序接收和传送。在这种情况下,能够提供一个动作用于警告该程序的用户或所有者、或是阻止该程序继续运行。在该实例中,这样一个动作以一条用于中断该程序Int的指令形式从监控单元22传送给处理器4。
现在将结合图3中描绘的流程图对这种通过图2装置实现的监控方法进行描述。假定被监控的程序或程序部分通过分别在开始和末端包含第一和第二条监控指令为这种监控方法正确地做好了准备。
在初始阶段,监控单元22位于监控例程的开始处30,其中的第一个步骤32是等待第一条监控指令(Inst.0)。
当接收到第一条监控指令Inst.0时,监控单元22实施一个指令计数器和寄存器24初始化(通过复位)的步骤34。寄存器24的复位是一种在这个寄存器中放置一个“种子”值的方法以便开始一个散列操作序列,这将在随后加以说明。这些操作能够由第一条监控指令直接控制或是简单地由与监控单元22有关的例程起动。
在这个第一种情况中,复位能够受到在汇编指令中添加一条新操作码(例如“clr us”)、或是在程序执行设备20的存储器中操作一个给定位的影响。这样的一个命令能够是“Setb 3,service”。
在初始化步骤之后,监控单元22以一个单元为单位递增指令计数器(然后将这个计数器设置为n=1)(步骤36)。
接下来,在监控下的该程序或程序部分的第一条指令Inst.1从指令寄存器2中读取出来(步骤38)。如上所述,这条指令被监控单元22认为是一个允许算术运算的数字值。在图2的实施例中,这个值是40。
然后该第一条指令Inst.1的数字值用寄存器24中包含的值进行散列操作。就第一条指令来说,这个最后值是初始化值,即0。
众所周知,在此散列操作本质上是使一个数学运算符f(VHn-1,Vinst.n)作用于所讨论指令n的值上,其中VHn-1是记录在寄存器24中前一次散列操作的结果(或者就第一条指令来说是初始化值),而Vinst.n是所讨论指令n的数字值。
然后这个散列操作的结果VHn替代前一次的结果VHn-1记录在寄存器24中(步骤42)。应当注意到在每次散列操作中更新寄存器内容的过程使得永久保持自上次初始化以来执行的指令代码和地址的加密散列成为可能。
在这个散列操作的结尾,为了它的执行该指令传送给处理器4(步骤44)。
接下来监控单元22确定被监控的程序或程序部分是否包含另一条要执行的指令(步骤46)。
因此,该过程从n到n+1增量执行一个循环返回B1回到步骤36。然后下一条指令(Inst.2)的值将从指令寄存器2中读取出来,并以与用于指令Inst.1同样的方式进行散列操作。然而,一方面这次用指令Inst.2的数字值和在前一个散列操作期间获得的结果进行散列,即值VH1(n在这儿等于2),然后它进入寄存器24中。
以与用于第一条指令相同的方式进行该方法的步骤42到46。这样,分别为从指令寄存器2中读取的每一条指令Inst.1、Inst.2、Inst.3、……、Inst.n继续步骤组36到46的循环,对一条指令Inst.i(其中i是一个从1到n的整数)来说,利用寄存器24中的值VHni-1和值Vinst.i进行散列。
一旦所有的指令Inst.1、Inst.2、Inst.3、……、Inst.n已经由监控单元22这样处理过了,监控单元22就接收在正被监控的程序或程序部分的最后一条指令Inst.n之后的第二条监控指令Inst.n+1。
这第二条监控指令指示监控单元22从程序中提取参考值Vref(步骤48),并将寄存器24的内容与这个Vref值进行比较(步骤50)。借助于一个循环“lda-sta”能够影响这个命令。
应当说明的是通过执行步骤36到46的连续循环,目前包含在寄存器中的值是用前一次散列的结果VHn-1和指令n的数字值(在图2的实例中等于36)实现的散列结果VHn。
参考值Vref是在该程序的准备期间利用散列操作的知识预先确定的,以便使其等于监控单元22应该返回的值VHn,如果所有这些指令Inst.1、Inst.2、Inst.3、……、Inst.n的确被传送到处理器4的话。
因此,比较的结果使得核对这些指令Inst.1、Inst.2、Inst.3、……、Inst.n是否已经正确打开成为可能如果VHn=Vref(步骤52),假定所有这些指令实际上已经被传送到处理器4了。然后,就包含这些指令Inst.1、Inst.2、Inst.3、……、Inst.n的程序或程序部分来说,这个监控操作就终止了。
然后该监控过程返回到起始阶段30等待新的第一条监控指令。
另一方面,如果比较步骤50显示出这些比较值间不相同,则假定要么不是所有的指令Inst.1、Inst.2、Inst.3、……、Inst.n都已经被传送到处理器4,要么是没有以正确的次序进行传送(步骤54)。这是因为一个连续散列操作的结果取决于它们的执行次序。
在这种情况下,监控单元22要求一个动作(步骤56),诸如中断该程序和/或记录该程序未正确运行的事实。
现在将结合图4的流程图对上述监控方法的变体进行描述。依据这个变体,不是在监控单元22接收每条新指令期间执行一个散列操作,而是仅仅在第二条监控指令接收以后才执行所有的散列操作。在图4的流程图中,与先前结合图3描述的那些步骤相同的步骤带有相同的标记,而且为了简明起见,将不会对它们进行描述。
该监控方法就步骤30到38来说呈现先前的情况(图3和4)。在步骤38读取指令寄存器2中的指令Vinst.n的值之后,监控单元22继续进行这个值的记录(步骤39)。这个记录能够发生在计算器26的一个内部寄存器中、寄存器24的一个专用部分中、监控单元22的一个特定存储器(未显示)中、或者在监控单元22之外的一个存储器中,假如它能够被监控单元22访问的话。
接下来监控单元22继续进行先前描述的步骤44和46。将要注意到记录值Vinst.n的步骤39,处于逐个单元递增n、连接步骤46到步骤36的循环B1中,从而使每一个Vinst.n值都这样被记录,直到在步骤46中检测到第二条监控指令为止。
当这个第二条指令来到时,监控单元22读取参考值Vref(步骤48),并在步骤49依据与先前描述的图3步骤40和42相同的算法、基于先前记录的Vinst值集合,执行散列。那么最后的散列值VHn与在图3方法中的情况相同。应当注意到有可能颠倒步骤48和49的次序。
比较步骤50以及随后的那些步骤与图3中的那些步骤是相同的。
图5是依据本发明第二个实施例的监控单元22的简化框图。与参考图2和3描述的第一实施例相同的方式集成到程序执行设备20中,而且为了简明起见,关于其指令计数器6、指令寄存器2和处理器4的功能将不再重复。
依据第二实施例的监控单元22本质上不同于第一实施例中的监控单元,体现在它还具有一个存储器60,用来记录没有根据参考图3或4说明的标准正确执行的一系列指令Inst.1-Inst.n的发生次数。
在该实例中,存储器60是以一个带有电可擦内容的固定(非易失性)存储器(通常用英语术语EEPROM表示)的形式制造而成的。
存储器60功能上和计算器26相连接以便使它记录一个计数值VC,它在每次注意到一系列正被监控的指令一次不正确的执行时,逐个单元递增该计数值。这个计数值VC因此使得检测一系列指令不正确执行的数目以及据此进行动作成为可能,例如,如果这个数目超过一个阈值,则使包含该程序的设备(例如一个智能卡)的任何未来使用无效。
图6中的流程图给出了一个使用该计数值VC来监控执行该程序的设备的实例。这个实例包含图3中流程图的这组步骤30到54或是图4中的相似步骤。
继比较步骤52之后当监控单元22在步骤54检测到这些指令Inst.1-Inst.n的一个意外执行时,计算单元26增加存储器60中的计数值VC,最初为0,然后逐个单元递增(步骤62)。接下来它检查这样增加的计数值VC是否已经达到一个预定阈值VCthreshold(步骤64)。这个阈值VCthreshold对应于指令Inst.1-Inst.n被认为在为处理这样一个故障采取明确措施之前能够在编程设备中发生意外执行的次数。举例来说,在智能卡的情况中,适当数目的这种故障是能够接受(例如3或4)的,这有利于怀疑它是否是一种与阅读器(程序执行设备20)相关的瞬间损害情况,但是超过了这个数目就必须认为该卡已经被无意或者恶意损坏。在这种实现情况下,还可以为在编程设备(卡)中输入值VC做好准备,以便完全地将这些有故障执行的历史记录保留到程序设备中。
如果计数值VC低于阈值VCthreshold,则监控单元22如先前描述的那样用一个用于用户和/或操作系统的简单警告信息建立中断指令Int(步骤66),并将它传送到处理器4(步骤68)。
另一方面,如果计数值VC达到了阈值VCthreshold,则监控单元22如先前描述的那样用一条用于禁止包含以意外方式执行的这些指令的编程设备的任何未来使用的指令建立该中断指令Int(步骤70),并将它传送到处理器(步骤68)。在这种情况下,将使得仅仅在已经对存储器60重新编程之后就重新使用这个设备变得可能。其中这个存储器60是一个EEPROM或其它非易失性存储器的形式,这种重新编程很难以一种转移方式执行。
将会注意到程序中断指令Int伴随一个警告信息或未来使用无效指令进行传输,并且能够在处理器或者是在监控单元22中执行。
下面将结合图7描述依据本发明,监控单元22能够怎样用于监控一段提供跳跃或切换的程序。
在图7的实例中,程序执行设备20在指令寄存器2中包含一段用于处理器4的程序或程序部分,它包含三组指令-第一组指令Inst.EI1-1到Inst.EI1-j(其中j是一个大于1的整数),最后一条指令EI1-j是一个要求有条件地切换到随后两组中的一组或另外一组的代码;-第二组指令Inst.EI2-1到Inst.EI2k(其中k是一个大于1的整数);如果这两个条件中的第一个条件满足的话,就继有条件的切换指令EI1-j执行之后执行这组中的第一条指令Inst.EI2-1;以及-第三组指令Inst.EI3-1到Inst.EI31(其中k是一个大于1的整数);如果这两个条件中的第二个条件满足的话,就继有条件的切换指令EI1-j执行之后执行这组中的第一条指令Inst.EI3-1。
这三组指令EI1、EI2和EI3在它们的指令序列内部没有包含任何跳跃。(就第一组指令来说,在序列末端条件转移到指令EI1-j.)因此,分别对这三组指令来说,所有这些指令被设计为自第一条指令起连续地执行。
在程序准备期间,在每组指令EI1、EI2和EI3的头尾处分别增加以上结合图2所述的第一条监控指令和第二条监控指令。
然后对由组EI1、EI2和EI3组成的程序或程序部分的监控继续进行如下。
监控单元22首先定位于监控阶段的开始处(步骤30,图3)。
从执行第一组指令EI1开始这个过程。位于这组头部的第一条监控指令将首先被载入到监控单元22中。响应于这条指令,监控单元初始化它的指令计数器和它的散列值VH寄存器24(步骤34,图3),并依据图3中的步骤36到46分别为第一组指令的指令Inst.EI1-1到Inst.EI1-j继续进行散列过程。
因此控制转换的这组中的最后一条指令EI1-j也要进行由监控单元22进行散列以便被送到处理器4。
随后的指令是位于第一组指令EI1尾部的第二条监控指令(步骤46,图3),它带来了记录在寄存器24里的上一个散列值和与这第二条指令有关的参考值Vref之间的比较阶段。
如果在比较步骤50(图3)检测到这样记录的上一个散列值与参考值Vref不相符,则监控单元22继续进行程序中断步骤54和56(图3和4)或是步骤54到70(图6)。最好是,甚至在程序已经执行有条件的转换之前为这个中断发生采取措施。这能够例如通过采用已知的编程技术将转移指令和一条来自监控单元的等候验证指令相关联而实现。
如果在比较步骤50(图2)检测到这样记录的最后一个散列值实际上相当于参考值Vref,则监控单元批准由这组中最后一条指令EI1-j所确定的有条件转换的执行。然后该程序根据由这个最后一条指令定位的转换条件继续第二或第三组指令中的一个或另一个。
假定在该实例中这个条件转移促使转换到第二组指令执行。在这种情况下,指令计数器6使指令指针8直接从位于第一组指令EI1尾部的第二条监控指令传递到在第三组指令EI3头部的第一条监控指令。
监控单元将通过重新初始化指令计数器和寄存器24来执行这个新的第一条指令。因此,对这第三组指令的监控过程会以与第一组指令完全相同的方式继续进行。因此监控单元22将进行在这组中读取的每一条指令的连续散列,使用和第一组一样的一个“种子”值(这里相当于0)开始散列。这次第二条监控指令使得在执行中检测位于这个第一组指令的一个意外行为情况、以及在步骤56继续进行同一类型的动作成为可能。
应明白继转换指令和第一组指令执行之后,就转换到第三组的情况所给出的说明以绝对类似的方式适用于转换到第二组指令的情况。
有可能使监控单元22不仅能统计在包含转移的一段程序中异常步骤的数目,而且能统计产生它们的独立监控的指令组。
因此,依据第二个实施例的监控单元22(图5)能够在它的存储器60里记录下每个记录的中断所涉及的指令组。还有可能依据中断位于其中的指令组为程序的将来使用无效制定标准。
当然,应明白监控单元22能够与处理器4分离或是在功能上被集成到处理器4中。
最后,显然用方法描述的本发明的所有这些方面能够很容易地用实际装置来实现,反之亦然。同样地,应明白所描述的本发明还覆盖了一个实施例或另一实施例的变体的所有明显置换。
权利要求
1.一种用一段计算机程序中一系列指令(Inst.1-Inst.n)监控执行进程的方法,在于分析被送到用于执行该正被监控程序的处理器(4)的指令序列,并参考同上述程序一起记录的参考数据(Vref)来验证这个分析的结果。
2.如权利要求1所述的方法,其特征在于只有当该指令序列中的所有指令(Inst.1-Inst.n)实际上已经在程序运行期间被分析过了时,参考数据包括一个预先确立的值(Vref)以便对应于监控方法期间产生的这个分析的结果。
3.如权利要求1或2所述的方法,其特征在于指令序列(Inst.1-Inst.n)的上述分析包含从每条被传送到处理器(4)的指令中提取一个数据项,以及在这样提取的每个数据项上的预定计算(40,42);以及验证包含对该分析的结果与参考数据(Vref)的比较(50)。
4.如权利要求1到3中任一项所述的方法,其特征在于上述分析结果的验证是由被监控程序中的一条位于一预定存储单元的指令(Inst.n+1)所引起,这条指令包含与其正确执行受到监控的指令集(Inst.1-Inst.n)有关的参考数据(Vref)。
5.如权利要求1到4中任一项所述的方法,其特征在于当被监控的该指令集中的指令(Inst.1-Inst.n)是以一个值的形式例如以十六进制或十进制形式记录代码时,将这些指令考虑为一个数字值来实现这些指令的上述分析。
6.如权利要求1所述的方法,包含以下步骤-在被监控程序的准备期间-在该程序的一指令序列(Inst.1-Inst.n)中,在至少一个预定存储单元上包括一个依据一个预定规则确定的参考值(Vref),其中该规则适用于每条被监控指令中的可识别数据;以及-在被监控程序的执行期间-为了它的执行获得(38)在收到的每条指令中的上述可识别数据;-将上述预定规则应用(40,42)到这样获得的上述可识别数据上以便确定一个验证值(VHn);以及-验证(50)这个验证值实际上符合于和该程序一起记录的参考值。
7.如权利要求1到6中任一项所述的方法,其特征在于它还包含一个步骤(56),即如果分析显示正被监控的程序没有象期望的那样运行,则中断被监控程序的流程。
8.如权利要求1到7中任一项所述的方法,其特征在于它还包含一个步骤(70)即如果上述分析显示正被监控的程序没有以期望的方式运行预定次数,则使包含该被监控程序的设备的未来使用无效。
9.如权利要求1到8中任一项所述的方法,其特征在于被监控的指令集在它的预期流程中不包含跳转。
10.如权利要求1到8中任一项所述的方法,其特征在于当被监控的程序(EI1、EI2、EI3)或程序部分提供了至少一个跳转时,该监控方法被分别地应用到这个程序中两条连续指令之间不包含跳转的指令集。
11.如权利要求10所述的方法,其特征在于当被监控的程序包含一条依赖于操作数据而引起跳转的指令(EI1-j)时,分别为在该跳转之前的指令集(EI1),和在这个跳转之后的至少一个指令集(EI2,EI3)执行该监控方法。
12.如权利要求11所述的方法,其特征在于就提供一个跳转的一个指令集(EI1)来说,为了进行旨在获得用于这个指令集的验证值(VH)的分析,在这个指令集中包含指令(EI1-j)来控制这个跳转,这样就能在执行该跳转指令之前验证这个指令集的正确运行。
13.如权利要求1到12中任一项所述的方法,其特征在于该分析在对被监控的一个指令序列或一个指令集(EI1、EI2、EI3)的每个新监控之前重新初始化。
14.如权利要求13所述的方法,其特征在于对每个新监控的分析的重新初始化是清除或替换在前一个分析期间获得的验证值(VH)。
15.如权利要求13或14所述的方法,其特征在于监控分析的重新初始化是由保护软件本身控制的。
16.如权利要求1到15中任一项所述的方法,其特征在于该分析产生一个验证值(VH),其作为一系列值中的最后一个值而获得,它随着对该指令集中每一条分析指令(Inst.1-Inst.n)的分析的连续地改变,从而使包含该监控方法运行的内部状态以及跟踪它的变化成为可能。
17.如权利要求1到16中任一项所述的方法,其特征在于该分析是自前一条指令(Inst.n-1)之后分别为考虑中的每一条指令(Inst.n)计算(40,42)在值(VHn)和结果(VHn-1)上进行一个操作的结果,其中(VHn)由所述的指令获得,而(VHn-1)是对前一条指令执行同一个操作所获得的结果。
18.如权利要求1到17中任一项所述的方法,其特征在于该分析是从执行的最后一次初始化开始对由每条被监控指令获得的值循环应用一个散列函数f(VHn-1,Vinst.n)。
19.如权利要求1到17中任一项所述的方法,其特征在于该分析是通过对自实现的最后一次初始化以来执行的所有操作码和地址执行一个冗余度计算,不一定加密,而使验证值发生改变。
20.如权利要求1到19中任一项所述的方法,其特征在于该分析是当用作这个计算的相应指令的数据在这些指令执行期间获得时,通过计算连续的中间值来获得一个比较值(VCn)。
21.如权利要求1到19中任一项所述的方法,其特征在于该分析包含步骤当被监控的指令集(Inst.1-Inst.n)中的指令被执行时,保存从这些指令处获得的、为验证所必需的每个数据项;以及一旦必要的数据已经获得,就仅仅在必要的时间执行对来自于这些数据的验证值(VHn)的计算。
22.一种用于监控一段计算机程序中一系列指令(Inst.1-Inst.n)执行进程的设备,包含装置(22-26)用于分析被送到处理器(4)的指令序列,其中该处理器(4)用于执行该正被监控的程序;以及装置(26)用于通过参照和上述程序一起记录的参考数据(Vref)来验证这个分析的结果(VCn)。
23.如权利要求22所述的设备,适于执行如权利要求1到21中任何一个所述的监控方法,其特征在于它具有一个寄存器(24),用于记录由分析装置(26)实现的一个按链式计算的中间结果(VH)以便获得一个验证值(VHn)。
24.如权利要求23所述的设备,其特征在于它包含装置用于在被监控的一段程序的执行期间、例如在该程序中的一个跳转发生时,允许在传送的一条指令(Inst.n+1)的控制下记录一个预定值或是寄存器(24)的复位。
25.如权利要求22到24中任何一个所述的设备,其特征在于它包含装置(60)用于计算在正被监控的程序中由分析装置(26)确定的异常事件的数目;以及装置用于如果这个数字达到一个预定阈值(VCthreshold)则使要被监控的该程序的将来使用无效。
26.如权利要求22到25中任何一个所述的设备,其特征在于它被集成到包含要被监控的上述程序的一个被编程设备中,例如一个智能卡中。
27.如权利要求22到25中任何一个所述的设备,其特征在于它被集成到一个程序执行设备(20)中。
28.一种程序执行设备(20),用于执行一段计算机程序中的一系列指令(Inst.1-Inst.n),其特征在于它包含装置(22-26),用于分析被传送用于执行的指令序列;以及装置,用于通过参考和被监控的程序一起记录的参考数据(Vref)来验证这个分析的结果。
29.如权利要求28所述的程序执行设备(20),适于执行如权利要求1到21中任何一个所述的方法。
30.一种包含了一系列记录指令(Inst.1-Inst.n)的被编程设备,其特征在于它还包含预先确定的参考数据(Vref),作为一个被包含在上述指令中的数据函数,并用于允许对依据如权利要求1到21中任何一个分析的指令序列进行验证。
31.如权利要求30所述的设备,其特征在于它是一个智能卡的形式。
32.如权利要求30或31所述的设备,其特征在于参考数据(Vref)以一个预先布线的值或是固定在存储器中的值的形式被记录下来。
33.一种用于对一个依据权利要求30到32中任何一项被编程的设备进行编程的设备,其特征在于它包含装置,用于在该程序的一指令序列(Inst.1-Inst.n)中,在至少一个预定存储单元处输入一个参考值(Vref),该参考值(Vref)是依据一种预先确定的方式从包含在一指令集每条指令内的数据计算出来的,希望它监控控制该指令集的执行。
34.一种用于解释一个关键代码的虚拟机或解释器,其特征在于它执行如权利要求1到21中任何一个所述的方法用于这个关键代码的执行。
全文摘要
本发明涉及一种用于监控一段计算机程序的一系列指令(Inst.1-Inst.n)的执行流程的方法,包含:对被传送到处理器(4)的指令序列进行分析,其中该处理器用于执行被监控的程序;通过参考用上述程序记录的参考数据(Vref)对上述分析的结果进行验证。该参考数据能够以这种方式包含一个预先确定的值(Vref),以使只有当所有这些指令(Inst.1-Inst.n)在程序流程期间实际上已经被分析过了时它才与在监控过程中产生的分析的结果相符合。本发明还涉及一种用于监控程序执行的设备、依据上述监控原理进行操作的一种程序设备和一种编程设备。
文档编号G06F21/52GK1350675SQ00807379
公开日2002年5月22日 申请日期2000年1月24日 优先权日1999年3月9日
发明者P·吉拉尔, D·纳卡希, L·鲁索 申请人:格姆普拉斯公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1