一种程序执行完整性保护方法和系统的制作方法
【专利摘要】本发明公开了一种程序执行完整性保护方法,包括:根据跳转指令,将程序分割成顺序执行的程序块,在每个程序块的起始位置插入校验值标识CK_FLAG和校验值CK_VALUE;在程序运行时,进行实时程序块校验值计算,并和预先计算好的程序块校验值进行比较,在程序块受到破坏或者没有按照预期执行程序块时给出警报信号。
【专利说明】
一种程序执行完整性保护方法和系统
技术领域
[0001]本发明涉及程序保护技术领域,尤其涉及一种程序执行完整性保护方法和系统。
【背景技术】
[0002]在处理器运行程序代码时,由于各种故障或者有意的安全攻击,程序代码的执行流程或结果会和程序设计人员的预期不符,程序执行完整性受到破坏。在高安全应用的场合,需要有一种机制保护程序执行的完整性。
【发明内容】
[0003]为解决现有存在的技术问题,本发明实施例期望提供一种程序执行完整性保护方法和系统。
[0004]为实现上述发明目的,本发明实施例采用以下方式来实现:
[0005]本发明实施例提供了一种程序执行完整性保护方法,其特征在于,所述方法包括:
[0006]根据跳转指令,将程序分割成顺序执行的程序块,在每个程序块的起始位置插入校验值标识CK_FLAG和校验值CK_VALUE;
[0007]在程序运行时,进行实时程序块校验值计算,并和预先计算好的程序块校验值进行比较,在程序块受到破坏或者没有按照预期执行程序块时给出警报信号。
[0008]上述方案中,插入的校验值标识CK_FLAG为以下类型:处理器指令集中没有用到的编码,调试指令或编译器不会用到的指令,扩展的处理器指令码。
[0009]上述方案中,所述校验值CK_VALUE是根据处理器顺序执行的程序块指令码计算得出的校验值,且在校验值计算时,从程序块的第一条指令计算到程序块的末尾指令,校验值计算包含了程序块末尾指令。
[0010]上述方案中,所述校验值计算采用如下方式之一:异或、循环冗余校验CRC、相加取模。
[0011]上述方案中,在校验值CK_VALUE计算时,读取文字池的指令读取到的文字池数据作为程序块的一部分来计算校验值。
[0012]上述方案中,所述在程序运行时,进行实时程序块fe验值计算,并和预先计算好的程序块校验值进行比较,包括:
[0013]a)从处理器执行的程序中识别校验值标识、校验值和跳转指令;
[0014]b)维护两个校验值,即从校验值CK_VALUE提取的预期校验值GS和实时计算出的计算校验值CS;
[0015]c)在遇到校验值标识时,获知被保护程序块的开始,并比较当前GS和CS是否相等,如果不等,给出程序执行出错的警报信号。
[0016]上述方案中,所述方法还包括:在程序运行时,识别跳转指令,并计算处理器的预期跳转地址,与处理器产生的跳转地址比对,如果不等,给出程序执行出错的警报信号。
[0017]上述方案中,所述方法还包括:
[0018]当中断发生时,保存预期校验值GS和计算校验值CS,校验值保存到存储器或者寄存器中;中断服务程序执行时,进行中断服务程序内的程序块检查;中断返回后,恢复被中断程序块的预期校验值GS和计算校验值CS,继续中断前的检查。
[0019]本发明实施例还提供了一种程序执行完整性保护系统,所述系统包括:程序分割器和程序监视器,
[0020]所述程序分割器,用于根据跳转指令,将程序分割成顺序执行的程序块,在每个程序块的起始位置插入校验值标识CK_FLAG和校验值CK_VALUE;
[0021 ]所述程序监视器,用于在程序运行时,进行实时程序块校验值计算,并和预先计算好的程序块校验值进行比较,在程序块受到破坏或者没有按照预期执行程序块时给出警报信号。
[0022]上述方案中,插入的校验值标识CK_FLAG为以下类型:处理器指令集中没有用到的编码,调试指令或编译器不会用到的指令,扩展的处理器指令码。
[0023]上述方案中,所述校验值CK_VALUE是根据处理器顺序执行的程序块指令码计算得出的校验值,且在校验值计算时,从程序块的第一条指令计算到程序块的末尾指令,校验值计算包含了程序块末尾指令。
[0024]上述方案中,所述校验值计算采用如下方式之一:异或、循环冗余校验CRC、相加取模。
[0025]上述方案中,所述程序监视器进一步用于,在校验值CK_VALUE计算时,读取文字池的指令读取到的文字池数据作为程序块的一部分来计算校验值。
[0026]上述方案中,所述程序监视器进一步用于执行以下操作:
[0027]a)从处理器执行的程序中识别校验值标识、校验值和跳转指令;
[0028]b)维护两个校验值,即从校验值CK_VALUE提取的预期校验值GS和实时计算出的计算校验值CS;
[0029]c)在遇到校验值标识时,获知被保护程序块的开始,并比较当前GS和CS是否相等,如果不等,给出程序执行出错的警报信号。
[0030]上述方案中,所述程序监视器进一步用于,在程序运行时,识别跳转指令,并计算处理器的预期跳转地址,与处理器产生的跳转地址比对,如果不等,给出程序执行出错的警?艮?言^ O
[0031]上述方案中,所述程序监视器进一步用于,当中断发生时,保存预期校验值GS和计算校验值CS,校验值保存到存储器或者寄存器中;中断服务程序执行时,进行中断服务程序内的程序块检查;中断返回后,恢复被中断程序块的预期校验值GS和计算校验值CS,继续中断前的检查。
[0032]本发明实施例提供的一种程序执行完整性保护方法和系统,能够有效检测程序执行过程中发生的错误,提高处理器执行程序的安全性。本发明实施例通过把程序分割成具有校验值的受保护的程序块,在程序运行时,进行实时程序块校验值计算,并和预先计算好的程序块校验值比较,在程序块受到破坏或者没有按照预期执行程序块时给出警报信号。更进一步,本发明实施例识别跳转指令,计算处理器的预期跳转地址,和处理器的跳转地址比对;并在中断发生时,进行校验值的保存和恢复。
【附图说明】
[0033]图1为本发明实施例的实现结构图;
[0034]图2为本发明实施例中具有校验值的程序块的结构图。
【具体实施方式】
[0035]下面结合附图和具体实施例对本发明的技术方案进一步详细阐述。
[0036]在处理器或存储器发生故障或者遇到安全攻击时,会发生各种指令错误或跳转错误,导致程序实时的运行态和程序设计预期不符合,破坏程序执行完整性。本发明实施例提出的一种保护程序运行安全性的方法,能够对程序执行完整性提供保护。
[0037]本发明实施例的方法通过把程序分割成具有校验值的受保护的程序块,在程序运行时,进行实时程序块校验值计算,并与预先计算好的程序块校验值比较,在程序块受到破坏或者没有按照预期执行程序块时给出警报信号。更进一步的,本发明实施例的方法识别跳转指令,计算处理器的预期跳转地址,与处理器的跳转地址比对;并在中断发生时,进行校验值的保存和恢复。
[0038]本发明实施例提出了一种程序执行完整性保护方法,该方法包括以下几部分内容:程序分割和校验值插入;程序块校验值计算和比对;跳转地址计算和比对;校验值保存和恢复。
[0039]程序指令分成两大类,即产生程序跳转的跳转指令和顺序执行的非跳转指令。根据跳转指令,能把程序分割成顺序执行的程序块。
[0040]程序分割和校验值插入是指根据跳转指令,把程序分割成顺序执行的程序块。一个程序块内的指令都是顺序执行的,每个程序块的结束是一条跳转指令;在每个程序块起始处,插入校验值标识(CK_FLAG)和校验值(CK_VALUE)。
[0041]插入的校验值标识(CK_FLAG)是但不限于如下类型:处理器指令集中没有用到的编码,调试指令或编译器不会用到的指令,扩展的处理器指令码等。
[0042]校验值(CK_VALUE)表示的是根据处理器顺序执行的程序块指令码计算得出的校验值,校验值计算时,从程序块的第一条指令,计算到程序块的末尾指令,校验值计算包含了程序块末尾指令;校验值计算采用但不限于如下方式:异或(X0R)、CRC、相加取模等。
[0043]程序分割时,对长的程序块,为了提高保护效果,通过插入校验值标识,把一个大程序分割成两个或多个小程序块,此时程序块不再以跳转语句作为块结尾。
[0044]校验值(CK_VALUE)计算时,读取文字池的指令读取到的文字池数据作为程序块的一部分计算校验值,这样可以保护文字池数据。
[0045]程序监视器被设计用来完成程序块校验值计算和比对。
[0046]程序监视器具有如下能力:
[0047]a)从处理器执行的程序中识别校验值标识、校验值和跳转指令;
[0048]b)维护两个校验值,从校验值(CK_VALUE)提取的预期校验值GS和实时计算出的计算校验值CS;
[0049]c)程序监视器初始工作时,预期校验值GS和实时计算出的计算校验值CS相等;
[0050]d)当遇到校验值标识时,程序监视器获知被保护程序块的开始,并比较当前GS和CS是否相等,如果不等,给出程序执行出错的警报信号;
[0051]e)当遇到校验值标识时,提取校验值(CK_VALUE)到预期校验值GS,跟踪处理器的运行,实时计算随后指令的校验值保存到计算校验值CS。
[0052]f)跟踪程序块的执行,直到遇到跳转指令或者新的校验值标识,说明当前受保护程序块运行结束,程序监视器比较实时计算出的程序块的计算校验值CS和已经提取到的预期校验值GS是否相等,如果不等,给出程序执行出错的警报信号;若相等,复位GS和CS到相等的初始值。
[0053]程序监视器除了程序块校验值计算和比对外,还具有跳转地址计算和比对能力,程序监视器识别跳转指令,并计算处理器的预期跳转地址,和处理器产生的跳转地址比对,如果不等,给出程序执行出错的警报信号。
[0054]在处理器运行过程中,中断会随时改变处理器的运行路径,受保护的程序块执行过程有可能被中断打断。程序监视器具有校验值保存和恢复能力。当中断发生时,程序监视器保存预期校验值GS和计算校验值CS,校验值保存到存储器或者寄存器中。中断服务程序执行时,进行中断服务程序内的程序块检查。中断返回后,恢复被中断程序块的预期校验值GS和计算校验值CS,继续中断前的检查。
[0055]该方法为程序执行提供了很强的完整性保护,很好的检测指令漏取、指令重复取、指令码错误、取到错误地址的指令、错误跳转等错误。
[0056]下面以处理器为Cortex-MO为例,说明本发明方法的【具体实施方式】。
[0057]图1给出了本发明实施例的实现结构图。程序代码经过编译后,被处理成具有校验值的程序块(001)。图2显示了具有校验值的程序块的结构图。程序块A、B、C是程序代码中3个受校验值保护的程序块,每个程序块开头是校验值标识CK_FLAG和该程序块的校验值CK_VALUE_A,CK_VALUE_B,CK_VALUE_C。程序块的结尾是跳转指令或者顺序执行指令。如果程序块以顺序执行指令结尾,那么在该顺序指令之后一定是一个校验值标识。
[0058]在Cortex-MO指令集中,可以选择UDF指令或者BKPT指令作为校验值标识。UDF指令是一条未定义指令,BKPT指令是调试指令,这两条指令都不会出现在正常程序中,适合用来作为校验值标识。
[0059]校验值由程序块A内部的指令码顺序计算得到;校验值CK_VALUE_B是由程序块B内部的指令码顺序计算得到;校验值0(_¥六0^_(:是由程序块C内部的指令码顺序计算得到。(:0代^-10中,使用0)1?〈6,〈1&1316>指令加载〈1&1316>处定义的文字池常量到寄存器中,如果程序块内部有这样的指令,<lable>处定义的文字池常量也计算到程序块校验值里。计算校验值的方法是CRC或者相加取模等。
[0060]程序代码被分割处理为受保护程序块001后,存储到存储器002中,处理器003从存储器002读取程序块001,执行其中的指令,程序块001的指令也会送到程序监视器004中。程序监视器004能够识别程序块001中的校验值标识和校验值。当遇到校验值标识时,表示一个受保护的程序块的开始。监视器提取校验值,保存到其内部的预期校验值GS中。在处理器003执行随后程序块内部的指令码时,监视器同步实时计算指令码的校验值,并把校验值保存到计算校验值CS中。当遇到下一个校验值标识或者跳转指令时,表示一个受保护的程序块结束。程序监视器004识别到受保护的程序块结束后,比较预期校验值GS和计算校验值CS是否相等,如果不相等,则给出程序执行出错警报,该警报信息用来产生复位或者中断。
[0061]处理器003执行跳转指令的同时,程序监视器004也会计算出跳转的目标地址,并把该目标地址和处理器产生的跳转地址进行比对,如果不相等,给出程序执行出错警报。
[0062]如果受保护的程序块执行过程被中断打断,则在处理器003执行中断程序前,程序监视器004会停止被中断程序块校验值的计算,并在保存被中断程序块的预期校验值GS和计算校验值CS后,复位预期校验值GS和计算校验值CS到相等值。在处理器003执行中断程序期间,如果中断程序中存在受保护的程序块,则程序监视器004会跟踪校验中断程序中的受保护程序块。处理器003执行完中断程序返回到被中断的程序块时,程序监视器004首先恢复被中断程序块的预期校验值GS和计算校验值CS,然后在处理器003执行被中断的程序块时,继续进行指令码的校验值计算。
[0063]综上所述,本发明实施例通过把程序分割成具有校验值的受保护的程序块,在程序运行时,进行实时程序块校验值计算,并和预先计算好的程序块校验值比较,在程序块受到破坏或者没有按照预期执行程序块时给出警报信号。更进一步,本发明实施例识别跳转指令,计算处理器的预期跳转地址,和处理器的跳转地址比对;并在中断发生时,进行校验值的保存和恢复。通过实施本发明实施例,能够有效检测程序执行过程中发生的错误,提高处理器执行程序的安全性。
[0064]以上所述,仅为本发明的【具体实施方式】,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以所述权利要求的保护范围为准。
【主权项】
1.一种程序执行完整性保护方法,其特征在于,所述方法包括: 根据跳转指令,将程序分割成顺序执行的程序块,在每个程序块的起始位置插入校验值标识CK_FLAG和校验值CK_VALUE ; 在程序运行时,进行实时程序块校验值计算,并和预先计算好的程序块校验值进行比较,在程序块受到破坏或者没有按照预期执行程序块时给出警报信号。2.根据权利要求1所述程序执行完整性保护方法,其特征在于,插入的校验值标识CK_FLAG为以下类型:处理器指令集中没有用到的编码,调试指令或编译器不会用到的指令,扩展的处理器指令码。3.根据权利要求1所述程序执行完整性保护方法,其特征在于,所述校验值CK_VALUE是根据处理器顺序执行的程序块指令码计算得出的校验值,且在校验值计算时,从程序块的第一条指令计算到程序块的末尾指令,校验值计算包含了程序块末尾指令。4.根据权利要求3所述程序执行完整性保护方法,其特征在于,所述校验值计算采用如下方式之一:异或、循环冗余校验CRC、相加取模。5.根据权利要求1所述程序执行完整性保护方法,其特征在于,在校验值CK_VALUE计算时,读取文字池的指令读取到的文字池数据作为程序块的一部分来计算校验值。6.根据权利要求1所述程序执行完整性保护方法,其特征在于,所述在程序运行时,进行实时程序块校验值计算,并和预先计算好的程序块校验值进行比较,包括: a)从处理器执行的程序中识别校验值标识、校验值和跳转指令; b)维护两个校验值,即从校验值CK_VALUE提取的预期校验值GS和实时计算出的计算校验值CS; c)在遇到校验值标识时,获知被保护程序块的开始,并比较当前GS和CS是否相等,如果不等,给出程序执行出错的警报信号。7.根据权利要求1所述程序执行完整性保护方法,其特征在于,所述方法还包括:在程序运行时,识别跳转指令,并计算处理器的预期跳转地址,与处理器产生的跳转地址比对,如果不等,给出程序执行出错的警报信号。8.根据权利要求1所述程序执行完整性保护方法,其特征在于,所述方法还包括: 当中断发生时,保存预期校验值GS和计算校验值CS,校验值保存到存储器或者寄存器中;中断服务程序执行时,进行中断服务程序内的程序块检查;中断返回后,恢复被中断程序块的预期校验值GS和计算校验值CS,继续中断前的检查。9.一种程序执行完整性保护系统,其特征在于,所述系统包括:程序分割器和程序监视器, 所述程序分割器,用于根据跳转指令,将程序分割成顺序执行的程序块,在每个程序块的起始位置插入校验值标识CK_FLAG和校验值CK_VALUE; 所述程序监视器,用于在程序运行时,进行实时程序块校验值计算,并和预先计算好的程序块校验值进行比较,在程序块受到破坏或者没有按照预期执行程序块时给出警报信号。10.根据权利要求9所述程序执行完整性保护系统,其特征在于,所述程序监视器进一步用于执行以下操作: a)从处理器执行的程序中识别校验值标识、校验值和跳转指令; b)维护两个校验值,即从校验值CK_VALUE提取的预期校验值GS和实时计算出的计算校验值CS; c)在遇到校验值标识时,获知被保护程序块的开始,并比较当前GS和CS是否相等,如果不等,给出程序执行出错的警报信号。
【文档编号】G06F21/52GK106022107SQ201510718900
【公开日】2016年10月12日
【申请日】2015年10月30日
【发明人】袁永锋, 陈波涛, 路宝珠
【申请人】北京中电华大电子设计有限责任公司