一種程序執行完整性保護方法和系統的制作方法
【專利摘要】本發明公開了一種程序執行完整性保護方法,包括:根據跳轉指令,將程序分割成順序執行的程序塊,在每個程序塊的起始位置插入校驗值標識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日
【發明人】袁永鋒, 陳波濤, 路寶珠
【申請人】北京中電華大電子設計有限責任公司