專利名稱:一種在安全環境中生成代碼提高軟件保護強度的方法
技術領域:
本發明涉及軟件版權保護技術,特別涉及到基于即時編譯的軟件保護方法。
背景技術:
計算機軟件由于具有數字化的特征,因此很容易被復制和非法使用,軟件保護技術就是用來保護軟件版權、避免軟件被非法使用的技術。針對計算機軟件進行破解的主要方法就是調試,通過調試了解軟件運行的流程和邏輯,然后加以篡改,實現對軟件破解,由于運行計算機軟件的計算機硬件和操作系統平臺信息是公開的,并且都提供了對調試器的支持以便進行正常的軟件調試,因此,在這種環境下很難避免軟件被調試,所以,軟件保護的一個重要發展方向就是構造安全的運行環境,在安全環境中運行軟件的部分代碼,這樣,針對軟件進行分析就必須先分析出安全環境,提高了破解的難度。例如常見的虛擬機保護技術,使用未公開架構的虛擬機來運行軟件的部分代碼,破解者要調試這部分軟件代碼就必須分析出虛擬機的指令集。安全環境顯著提高了軟件調試的難度,特別是對于將安全環境置于智能卡硬件或者遠程服務器的情況,幾乎不可能對受保護的部分進行調試,從而可以實現非常高的保護強度。然而,由于構造安全環境要比構造普通的環境考慮的情況更加復雜,在安全環境中運行代碼的速度會大幅度降低,例如某些虛擬機保護方法甚至會使軟件的運行速度下降1000倍以上,且如果軟件本體和在安全環境中運行的代碼之間相互訪問頻繁的情況下,軟件的運行效率還會降低,從而降低安全環境這種軟件保護方式的可用性。
發明內容
本發明提供一種在安全環境中生成代碼提高受保護軟件保護強度的方法,所述安全運行環境是可運行代碼、具有安全防范功能、難以進行調試的計算機運行環境,
其中所述安全環境中運行代碼生成模塊,所述代碼生成模塊根據源輸入邏輯描述生成對應邏輯的可執行代碼;其中,所述受保護軟件中具有調用模塊;
所述方法包括如下步驟:
抽取受保護軟件中的部分代碼;
將所述部分代碼轉換為源輸入邏輯描述;
在所述受保護軟件中被抽取代碼的位置插入調用模塊;
當所述受保護軟件運行到被抽取代碼的位置時,所述調用模塊將調用安全環境,報告運行環境信息;
所述安全環境中的所述代碼生成模塊根據所述運行環境信息生成與所述運行環境相關的執行代碼;
將生成的與運行環境相關的所述執行代碼填充到所述被抽取代碼的位置;
所述受保護軟件執行所述執行代碼。
根據本發明的一個方面,所述安全環境包括但不限于虛擬機、智能卡、遠程服務器。根據本發明的一個方面,每次生成的執行代碼不完全相同。根據本發明的一個方面,所述生成的執行代碼是完成相同的功能的等效代碼。根據本發明的一個方面,在執行完所述執行代碼之后,將受保護軟件中的這部分生成的執行代碼清除。
附圖1為按照本發明的在安全環境中生存代碼的軟件保護方法的一優選實施例的流程示意圖。
具體實施例方式為使本發明的目的、技術方案及優點更加清楚明白,以下參照附圖并舉實施例,對本發明進一步詳細說明。有鑒于此,本發明提供了一種利用安全環境動態生成軟件代碼的軟件保護方法和系統,可以在基本不影響軟件運行效率的情況下獲得相對較高的安全性。本發明包括安全運行環境,運行在安全環境中的代碼生成模塊,受保護軟件中加入的調用模塊。所述安全運行環境是可運行代碼,但是具有安全防范功能、難以進行調試的計算機運行環境,例如運行在受保護軟件所在進程中的虛擬機、智能卡、遠程服務器等。所述代碼生成模塊可以根據源輸入邏輯描述生成對應邏輯的可執行代碼。所述受保護軟件中的調用模塊用于替代被抽取的代碼,當運行到被抽取代碼的位置時,調用模塊調用安全環境,提交運行環境信息。步驟A,將受保護軟件中的部分代碼抽取出來,并轉換為代碼生成模塊的源輸入邏輯描述,而且在被抽取代碼的位置插入調用模塊。步驟B,當受保護軟件運行到被抽取代碼的位置時,調用模塊將調用安全環境,報告運行環境信息,安全環境中的代碼生成模塊根據運行環境信息生成與運行環境相關的執行代碼。步驟C,將生成的代碼填充到被抽取的位置,軟件執行此代碼。其中,根據本發明的一種實施方式,在上述步驟B中,每次生成的代碼可以不完全相同,例如用等效的指令完成相同的功能,使用不同的優化方式,這可以增加調試和分析的難度。其中,根據本發明的一種實施方式,在步驟C之后,還存在步驟D,執行完生成的代碼之后,將受保護軟件中的這部分生成的代碼清除,降低被調試和分析的風險。其中,根據本發明的一種實施方式,受保護軟件中的調用模塊可通過其他方式替代,比如通過加載器的方式來加載執行。運行環境相關的代碼指的是所述代碼運行依賴當前運行環境,一旦環境變化,代碼就不能運行,例如代碼中可以有當前CPU的特有指令(比如CPU型號等與當前計算機相關信息),或者使用絕對文件存儲位置(比如文件在硬盤盤符下的絕對路徑),通過多種此類方法的組合使用之后,其他計算機運行這些代碼幾乎是不可能的,甚至同一臺機器重新運行都可能存在問題。本實施例中安全環境是遠程服務器。本實施例中在服務器內部生成執行代碼,服務器外部不知道具體代碼信息,也不知道相關代碼生成規則,并且每次都是由服務器根據環境相關信息生成的代碼,而且服務器端處于遠程,無法對服務器進行調試,因此遠程服務器是安全的運行環境。代碼生成模塊使用開源的GCC,(S卩,GNU Compiler Collection,中文術語為GNU編譯器套裝,是一套由GNU開發的編程語言編譯器),相對應的,從受保護軟件中抽取的代碼用GCC的源文件方式保存在遠程服務器上。根據本發明的一個實施方式,所述抽取操作可以根據指定的方式進行自動抽取或者進行人工抽取。根據本發明的一個實施方式,可按照C語言原始程序.c格式保存。根據本發明的一個實施方式,另外也可以根據需求或規劃自行定制保存位置。根據本發明的一個實施方式,假設要保護的軟件中存在如下函數代碼: int foo(int a)
{
b = a + I;return b;
}
此時需要保護“b = a + 1;”,同時將% = a + I;”在該函數代碼中原來的位置處替換為對安全環境的調用secureCallO。一旦替換之后,則該函數代碼變為:int foo(int a)
{
secureCall () ; /* 調用安全環境*/ return b;
}
其中,secureCall ()函數內部功能如下:
發送環境信息 接收字節碼 執行字節碼
當軟件運行到secureCall ()的時候,secureCall ()負責和安全環境通信。根據本發明的一個實施方式,首先secureCall ()調用安全環境,向安全環境報告原受保護軟件的運行環境信息(如操作系統信息、地址、CPU型號等特有指令信息),安全環境中代碼生成模塊根據接收到的運行環境信息生成與運行環境相關的執行代碼,然后seacureCall ()內部接收該執行代碼并將代碼填充到被抽取的位置,繼而軟件順序執行此代碼。此時,代碼生成器GCC將“b = a + I ; ”編譯成合適的目標平臺代碼,比如,根據本發明的一個實施方式,代碼生成器GCC編譯成的代碼與原受保護軟件的運行環境一致,比如在x86機器上將代碼編譯生成對應的可執行的x86指令。secureCall ()通過調用安全環境取得由安全環境生成并返回的與運行環境相關的執行代碼,然后將這些執行代碼放在本地的內存中執行。由于生成的代碼和軟件的運行環境完全一致,因此效率的下降不多。根據本發明的一個實施方式,關于代碼動態變化,對于“b = a + I;”可以生成多條等價指令,包括但不限于:
1.ADD EAX, I ;//寄存器EAX的值加I
2.1NC EAX;//寄存器EAX等于寄存器EAX加I
3.SUB EAX, OxFFFFFFFF//寄存器EAX等于寄存器EAX減去-1,即為寄存器EAX等于寄存器EAX加I。顯然,每次運行的指令都不一樣,因此更加難以分析。上述代碼動態變化部分已有說明,比如:對于上述b=a+l,第一次運行時生成“ADD EAX, I”指令,第二次運行時生成“INCEAX”指令,這些指令是等價的,每次運行動態生成不同的等價指令,代碼動態變化增加了分析的難度。關于環境相關指令(如CPU特有指令,系統信息等),當CPU具有浮點協處理器的時候,可以生成浮點協處理器指令完成計算(浮點協處理器也稱為數字或算術協處理器,具有一個旨在大量數字操作的特殊指令集,專門用來進行浮點數運算),或者使用特定的內存地址作為變量a和b的臨時存儲區域,這都可以使指令和當前的運行環境相關。本發明的核心思想是將軟件一部分代碼抽取到一個安全環境中,運行至該部分代碼時,安全環境根據軟件運行環境相關信息動態生成執行代碼并填補回軟件中,軟件繼續正常運行。安全環境中依賴當前軟件運行環境相關信息(如cpu型號,地址等指令信息)動態生成代碼。一旦運行環境變化,軟件無法運行。安全環境能夠保證外部人員無法調試、破解,保證外部人員不知道安全環境中抽取的代碼信息,也不知道相關代碼的生成規則,每次動態生成都依賴運行環境相關信息。智能卡、虛擬機等運行環境也可以作為安全環境,對于本領域的技術人員而言,根據本發明的內容,在智能卡、虛擬機上完全能夠實現類似的軟件保護方法,其具體實現內容根據具體的智能卡、虛擬機不同而略有不同,但其核心的保護思想與上述內容相同,因此不再贅述。以上所述僅為本發明的較佳實施例而已,并非用于限定本發明的保護范圍。凡在本發明的精神和原則之內,所作的任何修改、等同替換以及改進等,均應包含在本發明的保護范圍之內。
權利要求
1.一種在安全環境中生成代碼提高受保護軟件保護強度的方法,所述安全運行環境是可運行代碼、具有安全防范功能、難以進行調試的計算機運行環境, 其中所述安全環境中運行代碼生成模塊,所述代碼生成模塊根據源輸入邏輯描述生成對應邏輯的可執行代碼;其中,所述受保護軟件中具有調用模塊; 所述方法包括如下步驟: 抽取受保護軟件中的部分代碼; 將所述部分代碼轉換為源輸入邏輯描述; 在所述受保護軟件中被抽取代碼的位置插入調用模塊; 當所述受保護軟件運行到被抽取代碼的位置時,所述調用模塊將調用安全環境,報告運行環境信息; 所述安全環境中的所述代碼生成模塊根據所述運行環境信息生成與所述運行環境相關的執行代碼; 將生成的與運行環境相關的所述執行代碼填充到所述被抽取代碼的位置; 所述受保護軟件執行所述執行代碼。
2.根據權利要求1所述的方法,其特征在于,所述安全環境是虛擬機。
3.根據權利要求1所述的方法,其特征在于,所述安全環境是智能卡。
4.根據權利要求1所述的方法,其特征在于,所述安全環境是遠程服務器。
5.根據權利要求1所述的方法,其特征在于,每次生成的執行代碼不完全相同。
6.根據權利要求5所述的方法,其特征在于,所述生成的執行代碼是完成相同的功能的等效代碼。
7.根據權利要求1所述的方法,其特征在于,在執行完所述執行代碼之后,將受保護軟件中的這部分生成的執行代碼清除。
全文摘要
本發明公開了一種基于運行時在安全環境中生成動態代碼的軟件保護方法,通過在安全環境中即時生成與非安全運行環境相關的代碼,在非安全運行環境中運行生成的代碼,從而提高軟件調試和分析的難度,還可以避免使用安全環境運行代碼引起的性能損失,本方法基本沒有性能損失,且能夠提供較好的安全性,具有非常大的實用價值。
文檔編號G06F21/12GK103106356SQ201310040228
公開日2013年5月15日 申請日期2013年2月1日 優先權日2013年2月1日
發明者不公告發明人 申請人:北京深思洛克軟件技術股份有限公司