專利名稱:一種基于改進的一次一密亂碼本的軟件保護方法
技術領域:
本發(fā)明屬于軟件加密解密保護技術領域,具體是一種基于改進的一次一密亂碼本的軟件保護方法。
背景技術:
軟件盜版是指非法拷貝并轉售軟件。盜版給整個軟件產業(yè)帶來巨大的損失。盜版者最基本的技術手段就是通過逆向工程來破解程序,進而對軟件進行非法的篡改,用來去掉軟件中的合法性自檢程序片斷等軟件保護手段。從技術上對軟件進行保護,有著重要的工程應用價值,為了增加盜版者進行逆向工程的難度,提出過混淆技術,抗反匯編技術,反調試技術。然而,沒有任何一種技術在理論上是不可攻破的。軟件保護的意義在于增加盜版者的法律風險或者增加工程上非法復制軟件的技術難度。簡單的抗反匯編技術,通過在目標文件中增加無用的隨機字節(jié)來迷惑反匯編器,相對容易破解。使用加密技術來保護軟件,對程序進行加密,運行前自動解密。這樣由于可執(zhí)行程序的磁盤映像中保存的是加密后的程序,反匯編器由于無法獲得程序的明文就無法進行反匯編操作。然而使用加密技術進行軟件保護,面臨著2個必須解決的難題①加密后的軟件要在運行時自行解密,帶來運行時開銷,對大型的可執(zhí)行程序更為嚴重,有較長的啟動延時。②程序最終要轉化成處理器能夠理解的二進制代碼流,一方面要對處理器暴露這些信息,另一方面對攻擊者隱藏這些信息,這是一個兩難問題。通常攻擊者對被加密軟件的攻擊并不是針對密碼算法的攻擊,而是通過逆向工程手段破解軟件的自引導程序片斷,找到密鑰進行解密,或者,直接利用自引導程序解密之后形成的存儲器中的映像。
通過加密來保護軟件,是防止盜版者通過逆向工程破解程序的一種有效方式。傳統(tǒng)加密保護方式,運行時解密開銷大,又由于采用一次性解密方式,易受到攻擊而直接從存儲器中獲得解密后的程序映像。
發(fā)明內容
本發(fā)明的目的是提供一種基于改進的一次一密亂碼本的軟件加密方法。本發(fā)明方法摒棄了傳統(tǒng)的一步解密的方式,在運行時通過即時解碼器以函數為單位一步步解密軟件,僅對一次運行中必須的部分解密,使得攻擊者難以獲得完整的解密后程序,難以篡改并繞過未解密部分中的軟件保護功能,增強了抗攻擊性,在運行效果上,由于解密分散進行,就解決了啟動延時長的問題。用基于一次一密加密技術,與傳統(tǒng)的對稱密鑰加密算法相比,進一步減少了運行時開銷,使得該技術在目前處理器上可以流暢運行。該方法增強了基于加密的軟件保護的實用性,增大了破解的難度。
本發(fā)明實現(xiàn)上述發(fā)明目的所采用的技術方案如下本方法包括加密和解密兩個過程,加密過程包括以下步驟a.為當前處理函數在改進的一次一密亂碼本中隨機選取加密密鑰,在全局數據結構“已加密函數表”中標記該函數已被加密處理,并記錄加密密鑰;b.在函數體之前為函數添加一個跳板;c.掃描當前處理函數的每一條指令,對于函數調用做特殊處理,為其增加傳遞隱式參數的指令;
d.對函數體的指令逐條掃描結束后,使用步驟a中產生的密鑰對函數體使用改進的一次一密亂碼本加密。
解密過程是在軟件運行時,每個函數當第1次被調用的時候進行解密操作,即時解碼器負責解密每個函數,解密后的函數體仍在主存中原來的位置,然后把函數體前面的跳板打上補丁去掉,當第2次執(zhí)行的時候直接執(zhí)行解密后的函數體,無須再次解密。
所述步驟a中的一次一密亂碼本是一個足夠大的二進制密鑰池K,設其大小為N個字節(jié),每個字節(jié)的編址為0,1,…,N-1;這個二進制密鑰池中的密鑰為N個介于
之間的隨機數。
所述步驟a中密鑰的選取過程如下首先生成一個
之間的隨機數x,以K[x]作為密鑰的第一個字節(jié),然后根據被加密方法體的二進制編碼長度,選取K[x]的后續(xù)字節(jié),如果到達密鑰池的結尾,則從密鑰池的開始位置繼續(xù)選取,直到密鑰長度等于被加密方法體的二進制編碼長度。
所述步驟c中隱式參數是指被調用函數的加密密鑰,如果被調用函數已經在此之前被加密保護,則加密密鑰可以從全局數據結構“已加密函數表”中獲得,對于被調用函數還沒有被加密的情況,遞歸調用本算法首先處理被調用函數。
所述步驟d中使用后的一次一密亂碼本以某種形式存在于加密后的程序當中,可以以明文的形式,也可以以使用某種加密算法加密后的密文形式存在。
所述解密過程中用于解密的具體密鑰(密鑰在亂碼本中的起始位置)并不以明文的形式在代碼中存在,而是由被解密函數的調用者在調用時作為一個隱式參數來提供。
與普通加密方法相比,本發(fā)明軟件保護方法的優(yōu)點在于
1、在運行時通過即時解碼器以函數為單位一步步揭開隱藏在軟件中的秘密。僅對一次運行中必須的部分解密,使得攻擊者難以獲得完整的解密后程序,難以篡改并繞過未解密部分中的軟件保護功能,增強了抗攻擊性。
2、在運行效果上,由于解密分散進行,就解決了啟動延時長的問題。用基于一次一密加密技術,與對稱密鑰加密算法相比,進一步減少了運行時開銷,使得該技術在目前處理器上可以流暢運行。該方法增強了基于加密的軟件保護的實用性,增大了破解的難度。
3、用于解密的具體密鑰并不以明文的形式在代碼中存在,而是由被解密函數的調用者在調用時作為一個隱式參數來提供。所以只有解密了一個函數的某一調用者才可以進一步解密被調用的函數。
4、即時解密技術一步步揭開隱藏在代碼中的秘密。在軟件的執(zhí)行過程中,沒有使用到的軟件片斷的邏輯不會被揭秘,這就避免了攻擊者一次性通過調試器等工具獲得解密后應用程序在主存中的映像。
5、即時解密技術僅僅對一次運行中需要的代碼進行解密,對沒有運行到的代碼并不解密,這又進一步減少了解密所需的時間。與傳統(tǒng)的一次性解密方法相比較,解密的操作分為多次進行,也有效地減小了軟件啟動的時間。由于采用退化的一次一密亂碼本加解密,解密的運算僅僅是簡單的異或操作,即使對于交互性應用也感覺不到明顯的延時。
圖1是解密過程示意圖;圖2是本方法和傳統(tǒng)軟件加密保護方法的運行時間開銷比較圖。
具體實施例方式
下面結合附圖對本發(fā)明作進一步說明。
本發(fā)明方法是采用用改進的一次一密亂碼本來實現(xiàn)軟件加密的。一次一密亂碼本使用一個大的不重復的真隨機密鑰字母集,這個密鑰字母集被稱為亂碼本。本發(fā)明方法是將一次一密亂碼本加密算法進行推廣,用二進制數字組成的一次密亂碼本代替由字母組成的一次一密亂碼本,用異或代替明文字母加法。解密時只需對照一次一密亂碼本再次異或即可。在使用加密方法對軟件進行保護時,解密是在軟件運行時自動完成的,所以解密時間要占用軟件的運行時間。用一次一密亂碼本,解密的操作僅僅是一個簡單的異或操作,與傳密碼算法相比,解密時間有大幅提高。改進的一次一密亂碼本,是一個足夠大的二進制密鑰池K,設其大小為N個字節(jié),每個字節(jié)的編址為0,1,…,N-1。這個二進制密鑰池中的密鑰為N個介于
之間的隨機數。對軟件的加密保護,以程序中的函數為單位,對每個函數體分別加密,并且在密鑰池中隨機選取不同的密鑰。密鑰的選取過程如下,生成一個
之間的隨機數x,以K[x]作為密鑰的第一個字節(jié),根據被加密方法體的二進制編碼長度,選取K[x]的后續(xù)字節(jié),如果到達密鑰池的結尾,則從密鑰池的開始位置繼續(xù)選取,直到密鑰長度等于被加密方法體的二進制編碼長度。設程序中共有方法F個,即使攻擊者清楚加密保護算法的原理,但是如果無法準確獲得每個方法的密鑰,而嘗試破解軟件需要進行F×N次試驗,而且每次試驗結果是否正確很難判斷,從而無法自動完成。由于N是足夠大的數,并且在一個實際的軟件中F一般也很大,這就使破解加密的嘗試在實際的工程中不可行。對于軟件的保護并不依賴于算法的保密性是本算法的一個良好性質。
軟件加密過程如下,從軟件的入口函數開始,以函數為單位遞歸進行①為當前處理函數隨機選取加密密鑰,在全局數據結構“已加密函數表”中標記該函數已被加密處理,并記錄加密密鑰。②在函數體之前為函數添加一個跳板。③掃描當前處理函數的每一條指令,對于函數調用做特殊處理,為其增加傳遞隱式參數的指令。這個隱式參數為被調用函數的加密密鑰。如果被調用函數已經在此之前被加密保護,則加密密鑰可以從全局數據結構“已加密函數表”中獲得。對于被調用函數還沒有被加密的情況,遞歸調用本算法首先處理被調用函數。④對函數體的指令逐條掃描結束后,使用①中產生的密鑰對函數體使用亂碼本加密。退化的一次一密亂碼本就以某種形式存在于加密后的程序當中。可以以明文的形式,也可以以使用某種加密算法加密后的密文形式存在。本發(fā)明的健壯性不依賴于保守亂碼本的秘密,由于每個方法采用不同密鑰加密,即使獲得亂碼本也難以輕易破解。這與傳統(tǒng)的使用一個密鑰加密軟件,并且依靠保守密鑰的秘密來防范破解的方法是本質不同的。傳統(tǒng)的基于加密的軟件保護方法,在軟件自引導的時候,一次性對軟件進行解密。這種方法的一個顯著弱點是解密后的軟件以明文的形式存在于主存當中,很容易讓攻擊者通過調試器等工具直接從主存獲得解密后的軟件。本發(fā)明方法采用即時解密技術,每個函數當第1次被調用的時候才進行解密操作,解密結束之后交處理器執(zhí)行。本發(fā)明在每個加密后的函數體的前面都添加了一個跳板,調用即時解碼器。即時解碼器負責在運行時解密每個函數,解密后的函數體仍在主存中原來的位置,只不過前面的跳板已經被打上補丁去掉,當第2次執(zhí)行的時候直接執(zhí)行解密后的函數體,無須再次解密,如圖1所示。
用于解密的具體密鑰(密鑰在亂碼本中的起始位置)并不以明文的形式在代碼中存在,而是由被解密函數的調用者在調用時作為一個隱式參數來提供。所以只有解密了一個函數的某一調用者才可以進一步解密被調用的函數。即時解密技術一步步揭開隱藏在代碼中的秘密,在軟件的執(zhí)行過程中,沒有使用到的軟件片斷的邏輯不會被揭秘,這就避免了攻擊者一次性通過調試器等工具獲得解密后應用程序在主存中的映像?,F(xiàn)代軟件的功能是強大而復雜的,一個軟件系統(tǒng)可以完成若干項主要功能,軟件的一次運行僅使用其中一部分功能。并且軟件中有很大一部分的邏輯是用來處理各種異常和例外情況的,在通常情況下這些代碼并不運行。這就保證了一個攻擊者,即使多次運行軟件也很難把軟件解密完全。未被解密的代碼中,就可以隱藏用于軟件合法性自檢和自毀的程序片斷。這些程序片斷如果不被盜版者成功的去除,盜版的非法拷貝的使用價值就會大大降低?,F(xiàn)代軟件是龐大的,即時解密技術僅僅對一次運行中需要的代碼進行解密,對沒有運行到的代碼并不解密,這又進一步減少了解密所需的時間。與傳統(tǒng)的一次性解密方法相比較,解密的操作分為多次進行,也有效地減小了軟件啟動的時間。由于采用退化的一次一密亂碼本加解密,解密的運算僅僅是簡單的異或操作,即使對于交互性應用也感覺不到明顯的延時。
為了驗證基于退化的一次一密亂碼本的軟件加密技術和即時解密技術在運行時開銷方面的優(yōu)勢,將其與傳統(tǒng)的軟件加密保護方法進行了比較。選擇不同大小的應用程序映像,以考察不同規(guī)模應用程序應用這項技術的可行性。對于使用的加密算法,采用了本文中建議的退化的一次一密亂碼本加密,標準DES,3DES。而沒有采用基于公開密鑰的RSA等算法,這是因為軟件實現(xiàn)的RSA算法比DES算法要慢100倍[2],運行時開銷過大。使用AMD Athlon XP 2500+處理器512 MDDR存儲器的計算機為試驗平臺,DES、3DES算法采用cryptlib的高效軟件實現(xiàn),所得試驗數據如圖2中所示。其中,DES,3DES,OTP分別對應采用相應算法一次性解密的總時間,其后的列對應著采用JIT(Just-In-Time,運行時編譯執(zhí)行)方式解密一個函數的平均時間。對于現(xiàn)代的微處理器,其計算能力已很強大。對于對稱密鑰加密和一次一密亂碼本加密的解密時間均有不錯的實驗結果。對于較小的應用程序,即使用DES/3DES進行加密并一次解密也不會帶來大的啟動時延。對于較大的應用程序,用DES/3DES進行加密并且一次解密就會略感時延,這就體現(xiàn)出一次一密亂碼本比DES、3DES分別快約3倍、9倍的優(yōu)勢。使用即時解密更能大大縮短啟動時延,用上述3種算法啟動時時延均不明顯。解密每個函數的時間根據采用的加密算法而變化,以一次一密亂碼本最短。對于交互式應用,用一次一密亂碼本加密JIT解密方式,運行中無停滯感。對于對稱密鑰加密,如用JIT解密,運行時偶有停滯感,這是集中解密造成的時延。
權利要求
1.一種基于改進的一次一密亂碼本的軟件保護方法,本方法包括加密和解密兩個過程,其特征是所述加密過程步驟如下a.為當前處理函數在改進的一次一密亂碼本中隨機選取加密密鑰,在全局數據結構“已加密函數表”中標記該函數已被加密處理,并記錄加密密鑰;b.在函數體之前為函數添加一個跳板;c.掃描當前處理函數的每一條指令,對于函數調用做特殊處理,為其增加傳遞隱式參數的指令;d.對函數體的指令逐條掃描結束后,使用步驟a中產生的密鑰對函數體使用改進的一次一密亂碼本加密;所述解密過程是在軟件運行時,每個函數當第1次被調用的時候進行解密操作,即時解碼器負責解密每個函數,解密后的函數體仍在主存中原來的位置,然后把函數體前面的跳板打上補丁去掉,當第2次執(zhí)行的時候直接執(zhí)行解密后的函數體,無須再次解密。
2.根據權利要求1所述的軟件保護方法,其特征是所述步驟a中的一次一密亂碼本是一個足夠大的二進制密鑰池K,設其大小為N個字節(jié),每個字節(jié)的編址為0,1,…,N-1;這個二進制密鑰池中的密鑰為N個介于
之間的隨機數。
3.根據權利要求1或2所述的軟件保護方法,其特征是所述步驟a中密鑰的選取過程如下首先生成一個
之間的隨機數x,以k[x]作為密鑰的第一個字節(jié),然后根據被加密方法體的二進制編碼長度,選取K[x]的后續(xù)字節(jié),如果到達密鑰池的結尾,則從密鑰池的開始位置繼續(xù)選取,直到密鑰長度等于被加密方法體的二進制編碼長度。
4.根據權利要求1所述的軟件保護方法,其特征是所述步驟c中隱式參數是指被調用函數的加密密鑰,如果被調用函數已經在此之前被加密保護,則加密密鑰可以從全局數據結構“已加密函數表”中獲得,對于被調用函數還沒有被加密的情況,遞歸調用本算法首先處理被調用函數。
5.根據權利要求1所述的軟件保護方法,其特征是所述步驟d中使用后的一次一密亂碼本以某種形式存在于加密后的程序當中,可以以明文的形式,也可以以使用某種加密算法加密后的密文形式存在。
6.根據權利要求1所述的軟件保護方法,其特征是所述解密過程中用于解密的具體密鑰(密鑰在亂碼本中的起始位置)并不以明文的形式在代碼中存在,而是由被解密函數的調用者在調用時作為一個隱式參數來提供。
全文摘要
本發(fā)明公開一種基于改進的一次一密亂碼本的軟件保護方法。本方法包括加密和解密兩個過程,摒棄了傳統(tǒng)的一步解密的方式,在運行時通過即時解碼器以函數為單位一步步解密軟件,僅對一次運行中必須的部分解密,使得攻擊者難以獲得完整的解密后程序,難以篡改并繞過未解密部分中的軟件保護功能,增強了抗攻擊性,在運行效果上,由于解密分散進行,就解決了啟動延時長的問題。用基于一次一密加密技術,與傳統(tǒng)的對稱密鑰加密算法相比,進一步減少了運行時開銷,使得該技術在目前處理器上可以流暢運行。該方法增強了基于加密的軟件保護的實用性,增大了破解的難度。
文檔編號G06F21/00GK1952949SQ20061012229
公開日2007年4月25日 申請日期2006年9月22日 優(yōu)先權日2006年9月22日
發(fā)明者馬識佳, 羅笑南 申請人:中山大學