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