一種程序執(zhí)行完整性保護(hù)方法和系統(tǒng)的制作方法
【專利摘要】本發(fā)明公開了一種程序執(zhí)行完整性保護(hù)方法,包括:根據(jù)跳轉(zhuǎn)指令,將程序分割成順序執(zhí)行的程序塊,在每個(gè)程序塊的起始位置插入校驗(yàn)值標(biāo)識(shí)CK_FLAG和校驗(yàn)值CK_VALUE;在程序運(yùn)行時(shí),進(jìn)行實(shí)時(shí)程序塊校驗(yàn)值計(jì)算,并和預(yù)先計(jì)算好的程序塊校驗(yàn)值進(jìn)行比較,在程序塊受到破壞或者沒有按照預(yù)期執(zhí)行程序塊時(shí)給出警報(bào)信號(hào)。
【專利說明】
一種程序執(zhí)行完整性保護(hù)方法和系統(tǒng)
技術(shù)領(lǐng)域
[0001]本發(fā)明涉及程序保護(hù)技術(shù)領(lǐng)域,尤其涉及一種程序執(zhí)行完整性保護(hù)方法和系統(tǒng)。
【背景技術(shù)】
[0002]在處理器運(yùn)行程序代碼時(shí),由于各種故障或者有意的安全攻擊,程序代碼的執(zhí)行流程或結(jié)果會(huì)和程序設(shè)計(jì)人員的預(yù)期不符,程序執(zhí)行完整性受到破壞。在高安全應(yīng)用的場(chǎng)合,需要有一種機(jī)制保護(hù)程序執(zhí)行的完整性。
【發(fā)明內(nèi)容】
[0003]為解決現(xiàn)有存在的技術(shù)問題,本發(fā)明實(shí)施例期望提供一種程序執(zhí)行完整性保護(hù)方法和系統(tǒng)。
[0004]為實(shí)現(xiàn)上述發(fā)明目的,本發(fā)明實(shí)施例采用以下方式來實(shí)現(xiàn):
[0005]本發(fā)明實(shí)施例提供了一種程序執(zhí)行完整性保護(hù)方法,其特征在于,所述方法包括:
[0006]根據(jù)跳轉(zhuǎn)指令,將程序分割成順序執(zhí)行的程序塊,在每個(gè)程序塊的起始位置插入校驗(yàn)值標(biāo)識(shí)CK_FLAG和校驗(yàn)值CK_VALUE;
[0007]在程序運(yùn)行時(shí),進(jìn)行實(shí)時(shí)程序塊校驗(yàn)值計(jì)算,并和預(yù)先計(jì)算好的程序塊校驗(yàn)值進(jìn)行比較,在程序塊受到破壞或者沒有按照預(yù)期執(zhí)行程序塊時(shí)給出警報(bào)信號(hào)。
[0008]上述方案中,插入的校驗(yàn)值標(biāo)識(shí)CK_FLAG為以下類型:處理器指令集中沒有用到的編碼,調(diào)試指令或編譯器不會(huì)用到的指令,擴(kuò)展的處理器指令碼。
[0009]上述方案中,所述校驗(yàn)值CK_VALUE是根據(jù)處理器順序執(zhí)行的程序塊指令碼計(jì)算得出的校驗(yàn)值,且在校驗(yàn)值計(jì)算時(shí),從程序塊的第一條指令計(jì)算到程序塊的末尾指令,校驗(yàn)值計(jì)算包含了程序塊末尾指令。
[0010]上述方案中,所述校驗(yàn)值計(jì)算采用如下方式之一:異或、循環(huán)冗余校驗(yàn)CRC、相加取模。
[0011]上述方案中,在校驗(yàn)值CK_VALUE計(jì)算時(shí),讀取文字池的指令讀取到的文字池?cái)?shù)據(jù)作為程序塊的一部分來計(jì)算校驗(yàn)值。
[0012]上述方案中,所述在程序運(yùn)行時(shí),進(jìn)行實(shí)時(shí)程序塊fe驗(yàn)值計(jì)算,并和預(yù)先計(jì)算好的程序塊校驗(yàn)值進(jìn)行比較,包括:
[0013]a)從處理器執(zhí)行的程序中識(shí)別校驗(yàn)值標(biāo)識(shí)、校驗(yàn)值和跳轉(zhuǎn)指令;
[0014]b)維護(hù)兩個(gè)校驗(yàn)值,即從校驗(yàn)值CK_VALUE提取的預(yù)期校驗(yàn)值GS和實(shí)時(shí)計(jì)算出的計(jì)算校驗(yàn)值CS;
[0015]c)在遇到校驗(yàn)值標(biāo)識(shí)時(shí),獲知被保護(hù)程序塊的開始,并比較當(dāng)前GS和CS是否相等,如果不等,給出程序執(zhí)行出錯(cuò)的警報(bào)信號(hào)。
[0016]上述方案中,所述方法還包括:在程序運(yùn)行時(shí),識(shí)別跳轉(zhuǎn)指令,并計(jì)算處理器的預(yù)期跳轉(zhuǎn)地址,與處理器產(chǎn)生的跳轉(zhuǎn)地址比對(duì),如果不等,給出程序執(zhí)行出錯(cuò)的警報(bào)信號(hào)。
[0017]上述方案中,所述方法還包括:
[0018]當(dāng)中斷發(fā)生時(shí),保存預(yù)期校驗(yàn)值GS和計(jì)算校驗(yàn)值CS,校驗(yàn)值保存到存儲(chǔ)器或者寄存器中;中斷服務(wù)程序執(zhí)行時(shí),進(jìn)行中斷服務(wù)程序內(nèi)的程序塊檢查;中斷返回后,恢復(fù)被中斷程序塊的預(yù)期校驗(yàn)值GS和計(jì)算校驗(yàn)值CS,繼續(xù)中斷前的檢查。
[0019]本發(fā)明實(shí)施例還提供了一種程序執(zhí)行完整性保護(hù)系統(tǒng),所述系統(tǒng)包括:程序分割器和程序監(jiān)視器,
[0020]所述程序分割器,用于根據(jù)跳轉(zhuǎn)指令,將程序分割成順序執(zhí)行的程序塊,在每個(gè)程序塊的起始位置插入校驗(yàn)值標(biāo)識(shí)CK_FLAG和校驗(yàn)值CK_VALUE;
[0021 ]所述程序監(jiān)視器,用于在程序運(yùn)行時(shí),進(jìn)行實(shí)時(shí)程序塊校驗(yàn)值計(jì)算,并和預(yù)先計(jì)算好的程序塊校驗(yàn)值進(jìn)行比較,在程序塊受到破壞或者沒有按照預(yù)期執(zhí)行程序塊時(shí)給出警報(bào)信號(hào)。
[0022]上述方案中,插入的校驗(yàn)值標(biāo)識(shí)CK_FLAG為以下類型:處理器指令集中沒有用到的編碼,調(diào)試指令或編譯器不會(huì)用到的指令,擴(kuò)展的處理器指令碼。
[0023]上述方案中,所述校驗(yàn)值CK_VALUE是根據(jù)處理器順序執(zhí)行的程序塊指令碼計(jì)算得出的校驗(yàn)值,且在校驗(yàn)值計(jì)算時(shí),從程序塊的第一條指令計(jì)算到程序塊的末尾指令,校驗(yàn)值計(jì)算包含了程序塊末尾指令。
[0024]上述方案中,所述校驗(yàn)值計(jì)算采用如下方式之一:異或、循環(huán)冗余校驗(yàn)CRC、相加取模。
[0025]上述方案中,所述程序監(jiān)視器進(jìn)一步用于,在校驗(yàn)值CK_VALUE計(jì)算時(shí),讀取文字池的指令讀取到的文字池?cái)?shù)據(jù)作為程序塊的一部分來計(jì)算校驗(yàn)值。
[0026]上述方案中,所述程序監(jiān)視器進(jìn)一步用于執(zhí)行以下操作:
[0027]a)從處理器執(zhí)行的程序中識(shí)別校驗(yàn)值標(biāo)識(shí)、校驗(yàn)值和跳轉(zhuǎn)指令;
[0028]b)維護(hù)兩個(gè)校驗(yàn)值,即從校驗(yàn)值CK_VALUE提取的預(yù)期校驗(yàn)值GS和實(shí)時(shí)計(jì)算出的計(jì)算校驗(yàn)值CS;
[0029]c)在遇到校驗(yàn)值標(biāo)識(shí)時(shí),獲知被保護(hù)程序塊的開始,并比較當(dāng)前GS和CS是否相等,如果不等,給出程序執(zhí)行出錯(cuò)的警報(bào)信號(hào)。
[0030]上述方案中,所述程序監(jiān)視器進(jìn)一步用于,在程序運(yùn)行時(shí),識(shí)別跳轉(zhuǎn)指令,并計(jì)算處理器的預(yù)期跳轉(zhuǎn)地址,與處理器產(chǎn)生的跳轉(zhuǎn)地址比對(duì),如果不等,給出程序執(zhí)行出錯(cuò)的警?艮?言^ O
[0031]上述方案中,所述程序監(jiān)視器進(jìn)一步用于,當(dāng)中斷發(fā)生時(shí),保存預(yù)期校驗(yàn)值GS和計(jì)算校驗(yàn)值CS,校驗(yàn)值保存到存儲(chǔ)器或者寄存器中;中斷服務(wù)程序執(zhí)行時(shí),進(jìn)行中斷服務(wù)程序內(nèi)的程序塊檢查;中斷返回后,恢復(fù)被中斷程序塊的預(yù)期校驗(yàn)值GS和計(jì)算校驗(yàn)值CS,繼續(xù)中斷前的檢查。
[0032]本發(fā)明實(shí)施例提供的一種程序執(zhí)行完整性保護(hù)方法和系統(tǒng),能夠有效檢測(cè)程序執(zhí)行過程中發(fā)生的錯(cuò)誤,提高處理器執(zhí)行程序的安全性。本發(fā)明實(shí)施例通過把程序分割成具有校驗(yàn)值的受保護(hù)的程序塊,在程序運(yùn)行時(shí),進(jìn)行實(shí)時(shí)程序塊校驗(yàn)值計(jì)算,并和預(yù)先計(jì)算好的程序塊校驗(yàn)值比較,在程序塊受到破壞或者沒有按照預(yù)期執(zhí)行程序塊時(shí)給出警報(bào)信號(hào)。更進(jìn)一步,本發(fā)明實(shí)施例識(shí)別跳轉(zhuǎn)指令,計(jì)算處理器的預(yù)期跳轉(zhuǎn)地址,和處理器的跳轉(zhuǎn)地址比對(duì);并在中斷發(fā)生時(shí),進(jìn)行校驗(yàn)值的保存和恢復(fù)。
【附圖說明】
[0033]圖1為本發(fā)明實(shí)施例的實(shí)現(xiàn)結(jié)構(gòu)圖;
[0034]圖2為本發(fā)明實(shí)施例中具有校驗(yàn)值的程序塊的結(jié)構(gòu)圖。
【具體實(shí)施方式】
[0035]下面結(jié)合附圖和具體實(shí)施例對(duì)本發(fā)明的技術(shù)方案進(jìn)一步詳細(xì)闡述。
[0036]在處理器或存儲(chǔ)器發(fā)生故障或者遇到安全攻擊時(shí),會(huì)發(fā)生各種指令錯(cuò)誤或跳轉(zhuǎn)錯(cuò)誤,導(dǎo)致程序?qū)崟r(shí)的運(yùn)行態(tài)和程序設(shè)計(jì)預(yù)期不符合,破壞程序執(zhí)行完整性。本發(fā)明實(shí)施例提出的一種保護(hù)程序運(yùn)行安全性的方法,能夠?qū)Τ绦驁?zhí)行完整性提供保護(hù)。
[0037]本發(fā)明實(shí)施例的方法通過把程序分割成具有校驗(yàn)值的受保護(hù)的程序塊,在程序運(yùn)行時(shí),進(jìn)行實(shí)時(shí)程序塊校驗(yàn)值計(jì)算,并與預(yù)先計(jì)算好的程序塊校驗(yàn)值比較,在程序塊受到破壞或者沒有按照預(yù)期執(zhí)行程序塊時(shí)給出警報(bào)信號(hào)。更進(jìn)一步的,本發(fā)明實(shí)施例的方法識(shí)別跳轉(zhuǎn)指令,計(jì)算處理器的預(yù)期跳轉(zhuǎn)地址,與處理器的跳轉(zhuǎn)地址比對(duì);并在中斷發(fā)生時(shí),進(jìn)行校驗(yàn)值的保存和恢復(fù)。
[0038]本發(fā)明實(shí)施例提出了一種程序執(zhí)行完整性保護(hù)方法,該方法包括以下幾部分內(nèi)容:程序分割和校驗(yàn)值插入;程序塊校驗(yàn)值計(jì)算和比對(duì);跳轉(zhuǎn)地址計(jì)算和比對(duì);校驗(yàn)值保存和恢復(fù)。
[0039]程序指令分成兩大類,即產(chǎn)生程序跳轉(zhuǎn)的跳轉(zhuǎn)指令和順序執(zhí)行的非跳轉(zhuǎn)指令。根據(jù)跳轉(zhuǎn)指令,能把程序分割成順序執(zhí)行的程序塊。
[0040]程序分割和校驗(yàn)值插入是指根據(jù)跳轉(zhuǎn)指令,把程序分割成順序執(zhí)行的程序塊。一個(gè)程序塊內(nèi)的指令都是順序執(zhí)行的,每個(gè)程序塊的結(jié)束是一條跳轉(zhuǎn)指令;在每個(gè)程序塊起始處,插入校驗(yàn)值標(biāo)識(shí)(CK_FLAG)和校驗(yàn)值(CK_VALUE)。
[0041]插入的校驗(yàn)值標(biāo)識(shí)(CK_FLAG)是但不限于如下類型:處理器指令集中沒有用到的編碼,調(diào)試指令或編譯器不會(huì)用到的指令,擴(kuò)展的處理器指令碼等。
[0042]校驗(yàn)值(CK_VALUE)表示的是根據(jù)處理器順序執(zhí)行的程序塊指令碼計(jì)算得出的校驗(yàn)值,校驗(yàn)值計(jì)算時(shí),從程序塊的第一條指令,計(jì)算到程序塊的末尾指令,校驗(yàn)值計(jì)算包含了程序塊末尾指令;校驗(yàn)值計(jì)算采用但不限于如下方式:異或(X0R)、CRC、相加取模等。
[0043]程序分割時(shí),對(duì)長(zhǎng)的程序塊,為了提高保護(hù)效果,通過插入校驗(yàn)值標(biāo)識(shí),把一個(gè)大程序分割成兩個(gè)或多個(gè)小程序塊,此時(shí)程序塊不再以跳轉(zhuǎn)語句作為塊結(jié)尾。
[0044]校驗(yàn)值(CK_VALUE)計(jì)算時(shí),讀取文字池的指令讀取到的文字池?cái)?shù)據(jù)作為程序塊的一部分計(jì)算校驗(yàn)值,這樣可以保護(hù)文字池?cái)?shù)據(jù)。
[0045]程序監(jiān)視器被設(shè)計(jì)用來完成程序塊校驗(yàn)值計(jì)算和比對(duì)。
[0046]程序監(jiān)視器具有如下能力:
[0047]a)從處理器執(zhí)行的程序中識(shí)別校驗(yàn)值標(biāo)識(shí)、校驗(yàn)值和跳轉(zhuǎn)指令;
[0048]b)維護(hù)兩個(gè)校驗(yàn)值,從校驗(yàn)值(CK_VALUE)提取的預(yù)期校驗(yàn)值GS和實(shí)時(shí)計(jì)算出的計(jì)算校驗(yàn)值CS;
[0049]c)程序監(jiān)視器初始工作時(shí),預(yù)期校驗(yàn)值GS和實(shí)時(shí)計(jì)算出的計(jì)算校驗(yàn)值CS相等;
[0050]d)當(dāng)遇到校驗(yàn)值標(biāo)識(shí)時(shí),程序監(jiān)視器獲知被保護(hù)程序塊的開始,并比較當(dāng)前GS和CS是否相等,如果不等,給出程序執(zhí)行出錯(cuò)的警報(bào)信號(hào);
[0051]e)當(dāng)遇到校驗(yàn)值標(biāo)識(shí)時(shí),提取校驗(yàn)值(CK_VALUE)到預(yù)期校驗(yàn)值GS,跟蹤處理器的運(yùn)行,實(shí)時(shí)計(jì)算隨后指令的校驗(yàn)值保存到計(jì)算校驗(yàn)值CS。
[0052]f)跟蹤程序塊的執(zhí)行,直到遇到跳轉(zhuǎn)指令或者新的校驗(yàn)值標(biāo)識(shí),說明當(dāng)前受保護(hù)程序塊運(yùn)行結(jié)束,程序監(jiān)視器比較實(shí)時(shí)計(jì)算出的程序塊的計(jì)算校驗(yàn)值CS和已經(jīng)提取到的預(yù)期校驗(yàn)值GS是否相等,如果不等,給出程序執(zhí)行出錯(cuò)的警報(bào)信號(hào);若相等,復(fù)位GS和CS到相等的初始值。
[0053]程序監(jiān)視器除了程序塊校驗(yàn)值計(jì)算和比對(duì)外,還具有跳轉(zhuǎn)地址計(jì)算和比對(duì)能力,程序監(jiān)視器識(shí)別跳轉(zhuǎn)指令,并計(jì)算處理器的預(yù)期跳轉(zhuǎn)地址,和處理器產(chǎn)生的跳轉(zhuǎn)地址比對(duì),如果不等,給出程序執(zhí)行出錯(cuò)的警報(bào)信號(hào)。
[0054]在處理器運(yùn)行過程中,中斷會(huì)隨時(shí)改變處理器的運(yùn)行路徑,受保護(hù)的程序塊執(zhí)行過程有可能被中斷打斷。程序監(jiān)視器具有校驗(yàn)值保存和恢復(fù)能力。當(dāng)中斷發(fā)生時(shí),程序監(jiān)視器保存預(yù)期校驗(yàn)值GS和計(jì)算校驗(yàn)值CS,校驗(yàn)值保存到存儲(chǔ)器或者寄存器中。中斷服務(wù)程序執(zhí)行時(shí),進(jìn)行中斷服務(wù)程序內(nèi)的程序塊檢查。中斷返回后,恢復(fù)被中斷程序塊的預(yù)期校驗(yàn)值GS和計(jì)算校驗(yàn)值CS,繼續(xù)中斷前的檢查。
[0055]該方法為程序執(zhí)行提供了很強(qiáng)的完整性保護(hù),很好的檢測(cè)指令漏取、指令重復(fù)取、指令碼錯(cuò)誤、取到錯(cuò)誤地址的指令、錯(cuò)誤跳轉(zhuǎn)等錯(cuò)誤。
[0056]下面以處理器為Cortex-MO為例,說明本發(fā)明方法的【具體實(shí)施方式】。
[0057]圖1給出了本發(fā)明實(shí)施例的實(shí)現(xiàn)結(jié)構(gòu)圖。程序代碼經(jīng)過編譯后,被處理成具有校驗(yàn)值的程序塊(001)。圖2顯示了具有校驗(yàn)值的程序塊的結(jié)構(gòu)圖。程序塊A、B、C是程序代碼中3個(gè)受校驗(yàn)值保護(hù)的程序塊,每個(gè)程序塊開頭是校驗(yàn)值標(biāo)識(shí)CK_FLAG和該程序塊的校驗(yàn)值CK_VALUE_A,CK_VALUE_B,CK_VALUE_C。程序塊的結(jié)尾是跳轉(zhuǎn)指令或者順序執(zhí)行指令。如果程序塊以順序執(zhí)行指令結(jié)尾,那么在該順序指令之后一定是一個(gè)校驗(yàn)值標(biāo)識(shí)。
[0058]在Cortex-MO指令集中,可以選擇UDF指令或者BKPT指令作為校驗(yàn)值標(biāo)識(shí)。UDF指令是一條未定義指令,BKPT指令是調(diào)試指令,這兩條指令都不會(huì)出現(xiàn)在正常程序中,適合用來作為校驗(yàn)值標(biāo)識(shí)。
[0059]校驗(yàn)值由程序塊A內(nèi)部的指令碼順序計(jì)算得到;校驗(yàn)值CK_VALUE_B是由程序塊B內(nèi)部的指令碼順序計(jì)算得到;校驗(yàn)值0(_¥六0^_(:是由程序塊C內(nèi)部的指令碼順序計(jì)算得到。(:0代^-10中,使用0)1?〈6,〈1&1316>指令加載〈1&1316>處定義的文字池常量到寄存器中,如果程序塊內(nèi)部有這樣的指令,<lable>處定義的文字池常量也計(jì)算到程序塊校驗(yàn)值里。計(jì)算校驗(yàn)值的方法是CRC或者相加取模等。
[0060]程序代碼被分割處理為受保護(hù)程序塊001后,存儲(chǔ)到存儲(chǔ)器002中,處理器003從存儲(chǔ)器002讀取程序塊001,執(zhí)行其中的指令,程序塊001的指令也會(huì)送到程序監(jiān)視器004中。程序監(jiān)視器004能夠識(shí)別程序塊001中的校驗(yàn)值標(biāo)識(shí)和校驗(yàn)值。當(dāng)遇到校驗(yàn)值標(biāo)識(shí)時(shí),表示一個(gè)受保護(hù)的程序塊的開始。監(jiān)視器提取校驗(yàn)值,保存到其內(nèi)部的預(yù)期校驗(yàn)值GS中。在處理器003執(zhí)行隨后程序塊內(nèi)部的指令碼時(shí),監(jiān)視器同步實(shí)時(shí)計(jì)算指令碼的校驗(yàn)值,并把校驗(yàn)值保存到計(jì)算校驗(yàn)值CS中。當(dāng)遇到下一個(gè)校驗(yàn)值標(biāo)識(shí)或者跳轉(zhuǎn)指令時(shí),表示一個(gè)受保護(hù)的程序塊結(jié)束。程序監(jiān)視器004識(shí)別到受保護(hù)的程序塊結(jié)束后,比較預(yù)期校驗(yàn)值GS和計(jì)算校驗(yàn)值CS是否相等,如果不相等,則給出程序執(zhí)行出錯(cuò)警報(bào),該警報(bào)信息用來產(chǎn)生復(fù)位或者中斷。
[0061]處理器003執(zhí)行跳轉(zhuǎn)指令的同時(shí),程序監(jiān)視器004也會(huì)計(jì)算出跳轉(zhuǎn)的目標(biāo)地址,并把該目標(biāo)地址和處理器產(chǎn)生的跳轉(zhuǎn)地址進(jìn)行比對(duì),如果不相等,給出程序執(zhí)行出錯(cuò)警報(bào)。
[0062]如果受保護(hù)的程序塊執(zhí)行過程被中斷打斷,則在處理器003執(zhí)行中斷程序前,程序監(jiān)視器004會(huì)停止被中斷程序塊校驗(yàn)值的計(jì)算,并在保存被中斷程序塊的預(yù)期校驗(yàn)值GS和計(jì)算校驗(yàn)值CS后,復(fù)位預(yù)期校驗(yàn)值GS和計(jì)算校驗(yàn)值CS到相等值。在處理器003執(zhí)行中斷程序期間,如果中斷程序中存在受保護(hù)的程序塊,則程序監(jiān)視器004會(huì)跟蹤校驗(yàn)中斷程序中的受保護(hù)程序塊。處理器003執(zhí)行完中斷程序返回到被中斷的程序塊時(shí),程序監(jiān)視器004首先恢復(fù)被中斷程序塊的預(yù)期校驗(yàn)值GS和計(jì)算校驗(yàn)值CS,然后在處理器003執(zhí)行被中斷的程序塊時(shí),繼續(xù)進(jìn)行指令碼的校驗(yàn)值計(jì)算。
[0063]綜上所述,本發(fā)明實(shí)施例通過把程序分割成具有校驗(yàn)值的受保護(hù)的程序塊,在程序運(yùn)行時(shí),進(jìn)行實(shí)時(shí)程序塊校驗(yàn)值計(jì)算,并和預(yù)先計(jì)算好的程序塊校驗(yàn)值比較,在程序塊受到破壞或者沒有按照預(yù)期執(zhí)行程序塊時(shí)給出警報(bào)信號(hào)。更進(jìn)一步,本發(fā)明實(shí)施例識(shí)別跳轉(zhuǎn)指令,計(jì)算處理器的預(yù)期跳轉(zhuǎn)地址,和處理器的跳轉(zhuǎn)地址比對(duì);并在中斷發(fā)生時(shí),進(jìn)行校驗(yàn)值的保存和恢復(fù)。通過實(shí)施本發(fā)明實(shí)施例,能夠有效檢測(cè)程序執(zhí)行過程中發(fā)生的錯(cuò)誤,提高處理器執(zhí)行程序的安全性。
[0064]以上所述,僅為本發(fā)明的【具體實(shí)施方式】,但本發(fā)明的保護(hù)范圍并不局限于此,任何熟悉本技術(shù)領(lǐng)域的技術(shù)人員在本發(fā)明揭露的技術(shù)范圍內(nèi),可輕易想到變化或替換,都應(yīng)涵蓋在本發(fā)明的保護(hù)范圍之內(nèi)。因此,本發(fā)明的保護(hù)范圍應(yīng)以所述權(quán)利要求的保護(hù)范圍為準(zhǔn)。
【主權(quán)項(xiàng)】
1.一種程序執(zhí)行完整性保護(hù)方法,其特征在于,所述方法包括: 根據(jù)跳轉(zhuǎn)指令,將程序分割成順序執(zhí)行的程序塊,在每個(gè)程序塊的起始位置插入校驗(yàn)值標(biāo)識(shí)CK_FLAG和校驗(yàn)值CK_VALUE ; 在程序運(yùn)行時(shí),進(jìn)行實(shí)時(shí)程序塊校驗(yàn)值計(jì)算,并和預(yù)先計(jì)算好的程序塊校驗(yàn)值進(jìn)行比較,在程序塊受到破壞或者沒有按照預(yù)期執(zhí)行程序塊時(shí)給出警報(bào)信號(hào)。2.根據(jù)權(quán)利要求1所述程序執(zhí)行完整性保護(hù)方法,其特征在于,插入的校驗(yàn)值標(biāo)識(shí)CK_FLAG為以下類型:處理器指令集中沒有用到的編碼,調(diào)試指令或編譯器不會(huì)用到的指令,擴(kuò)展的處理器指令碼。3.根據(jù)權(quán)利要求1所述程序執(zhí)行完整性保護(hù)方法,其特征在于,所述校驗(yàn)值CK_VALUE是根據(jù)處理器順序執(zhí)行的程序塊指令碼計(jì)算得出的校驗(yàn)值,且在校驗(yàn)值計(jì)算時(shí),從程序塊的第一條指令計(jì)算到程序塊的末尾指令,校驗(yàn)值計(jì)算包含了程序塊末尾指令。4.根據(jù)權(quán)利要求3所述程序執(zhí)行完整性保護(hù)方法,其特征在于,所述校驗(yàn)值計(jì)算采用如下方式之一:異或、循環(huán)冗余校驗(yàn)CRC、相加取模。5.根據(jù)權(quán)利要求1所述程序執(zhí)行完整性保護(hù)方法,其特征在于,在校驗(yàn)值CK_VALUE計(jì)算時(shí),讀取文字池的指令讀取到的文字池?cái)?shù)據(jù)作為程序塊的一部分來計(jì)算校驗(yàn)值。6.根據(jù)權(quán)利要求1所述程序執(zhí)行完整性保護(hù)方法,其特征在于,所述在程序運(yùn)行時(shí),進(jìn)行實(shí)時(shí)程序塊校驗(yàn)值計(jì)算,并和預(yù)先計(jì)算好的程序塊校驗(yàn)值進(jìn)行比較,包括: a)從處理器執(zhí)行的程序中識(shí)別校驗(yàn)值標(biāo)識(shí)、校驗(yàn)值和跳轉(zhuǎn)指令; b)維護(hù)兩個(gè)校驗(yàn)值,即從校驗(yàn)值CK_VALUE提取的預(yù)期校驗(yàn)值GS和實(shí)時(shí)計(jì)算出的計(jì)算校驗(yàn)值CS; c)在遇到校驗(yàn)值標(biāo)識(shí)時(shí),獲知被保護(hù)程序塊的開始,并比較當(dāng)前GS和CS是否相等,如果不等,給出程序執(zhí)行出錯(cuò)的警報(bào)信號(hào)。7.根據(jù)權(quán)利要求1所述程序執(zhí)行完整性保護(hù)方法,其特征在于,所述方法還包括:在程序運(yùn)行時(shí),識(shí)別跳轉(zhuǎn)指令,并計(jì)算處理器的預(yù)期跳轉(zhuǎn)地址,與處理器產(chǎn)生的跳轉(zhuǎn)地址比對(duì),如果不等,給出程序執(zhí)行出錯(cuò)的警報(bào)信號(hào)。8.根據(jù)權(quán)利要求1所述程序執(zhí)行完整性保護(hù)方法,其特征在于,所述方法還包括: 當(dāng)中斷發(fā)生時(shí),保存預(yù)期校驗(yàn)值GS和計(jì)算校驗(yàn)值CS,校驗(yàn)值保存到存儲(chǔ)器或者寄存器中;中斷服務(wù)程序執(zhí)行時(shí),進(jìn)行中斷服務(wù)程序內(nèi)的程序塊檢查;中斷返回后,恢復(fù)被中斷程序塊的預(yù)期校驗(yàn)值GS和計(jì)算校驗(yàn)值CS,繼續(xù)中斷前的檢查。9.一種程序執(zhí)行完整性保護(hù)系統(tǒng),其特征在于,所述系統(tǒng)包括:程序分割器和程序監(jiān)視器, 所述程序分割器,用于根據(jù)跳轉(zhuǎn)指令,將程序分割成順序執(zhí)行的程序塊,在每個(gè)程序塊的起始位置插入校驗(yàn)值標(biāo)識(shí)CK_FLAG和校驗(yàn)值CK_VALUE; 所述程序監(jiān)視器,用于在程序運(yùn)行時(shí),進(jìn)行實(shí)時(shí)程序塊校驗(yàn)值計(jì)算,并和預(yù)先計(jì)算好的程序塊校驗(yàn)值進(jìn)行比較,在程序塊受到破壞或者沒有按照預(yù)期執(zhí)行程序塊時(shí)給出警報(bào)信號(hào)。10.根據(jù)權(quán)利要求9所述程序執(zhí)行完整性保護(hù)系統(tǒng),其特征在于,所述程序監(jiān)視器進(jìn)一步用于執(zhí)行以下操作: a)從處理器執(zhí)行的程序中識(shí)別校驗(yàn)值標(biāo)識(shí)、校驗(yàn)值和跳轉(zhuǎn)指令; b)維護(hù)兩個(gè)校驗(yàn)值,即從校驗(yàn)值CK_VALUE提取的預(yù)期校驗(yàn)值GS和實(shí)時(shí)計(jì)算出的計(jì)算校驗(yàn)值CS; c)在遇到校驗(yàn)值標(biāo)識(shí)時(shí),獲知被保護(hù)程序塊的開始,并比較當(dāng)前GS和CS是否相等,如果不等,給出程序執(zhí)行出錯(cuò)的警報(bào)信號(hào)。
【文檔編號(hào)】G06F21/52GK106022107SQ201510718900
【公開日】2016年10月12日
【申請(qǐng)日】2015年10月30日
【發(fā)明人】袁永鋒, 陳波濤, 路寶珠
【申請(qǐng)人】北京中電華大電子設(shè)計(jì)有限責(zé)任公司