李璇 李林鵬 李理
摘要
從軟件保護角度出發,研究對可執行文件進行加密與壓縮操作,僅在載入內存后才對其進行解密操作,能夠很好地保護軟件信息。提供多種軟件保護方案,兼顧用戶體驗與其實用性、安全性。既對軟件進行加密保護措施,又不影響其使用。
關鍵詞
軟件保護;加殼技術;軟件水印
中圖分類號: G633.6 ? ? ? ? ? ? ? ? ? ? ? ?文獻標識碼: A
DOI:10.19694/j.cnki.issn2095-2457.2020.04.83
0 引言
隨著應用軟件提供的服務越來越普及,各種惡意軟件往往附加在正常軟件上惡意傳播,危害信息安全;另一方面,為了保護軟件不隨意被他人“借鑒”,必須對軟件中的核心算法和機密數據進行保護。那么研究軟件加殼技術實現反調試、反附加等功能,從而增加破解難度,阻礙逆向分析,實現軟件保護是相當有必要的。
就目前的破解技術來看,單一的軟件保護技術已經無法抵擋破解技術的攻擊,因此我們需要進行多種技術的糅合。目前最常用的保護技術是加殼,有加密殼和壓縮殼等,但最常用的還是兩者結合起來。此外,還有代碼虛擬技術,通過構造一個虛擬機,產生一些模擬代碼來模擬被保護代碼的執行,產生出與保護代碼相同的結果,這樣就很大程度上阻止了源代碼的泄露。這種代碼虛擬技術幾乎是目前最好的保護技術,但其復雜程度與開發難度相當高。
1 軟件加殼系統的總體設計
軟件加殼系統主要包括三個部分,即Shell部分、加殼部分和水印部分。下面將具體介紹他們的結構與相關技術。
1.1 Shell部分設計
Shell需要先于源程序獲取控制權,Shell可以修改源可執行文件的組織結構,從而能更早控制該程序,對加密后的原程序進行解密,且不影響源程序代碼的正常運行。Shell的作用是模擬操作系統裝載PE文件,在這個過程中,額外添加解密、解壓縮等步驟的過程。所以在運行被保護程序時,實際是先運行了Shell部分的程序代碼。
Shell部分獲取了程序控制權后,需要將加密后的部分依次解密、解壓縮,確保其在內存中可以被操作系統識別并執行,在Shell部分處理完畢后,再將程序控制權轉給源程序,繼續執行源程序部分的代碼。
1.2 加殼部分設計
加殼部分主要對PE文件進行操作,對各區段結構內容進行壓縮混淆,增加靜態分析難度。加殼確保被保護軟件在計算機上存儲時是加密狀態的,雖然加殼不能完全防止靜態分析,但是可以對其進行混淆。靜態分析加殼后的程序時,不能直接獲取被保護軟件的總體結構與具體函數等信息。這樣就可以提高被保護程序的安全性。
但是加殼后的程序需要先進行解密與解壓操作,才可正常使用。因此采用的加密與壓縮算法就需要根據實際情況來選擇,有的軟件需求強度高一些的算法,這樣就會使運行時等候時間變長;有的軟件對啟動速度有要求,就可以選擇加密流程較為簡單的算法,即起到了一定的保護作用,又不影響程序的正常啟動。在本程序中,也提供了多種加密與壓縮算法可供選擇。
進行加殼操作時,需要先判斷其是否是PE文件。若是,就使用PE解析器對其進行解析,方便后續操作。程序中的一些特殊數據,如TLS(Thread Local Storage)、數字證書信息等,在運行的時候是不會被加載進入內存的,因此在加殼時,需要隔離這部分數據,使后續加密壓縮時不影響數據。接下來需要對IAT進行處理,首先需要破壞源程序的IAT和重定位表,將其換一個形式存儲。由于修復IAT和重定位表是脫殼時的重要步驟,因此對于IAT和重定位表,破壞得越徹底,脫殼難度就越大。對于源程序的各個區段,對其進行加密壓縮操作,可以選擇不同的加密算法和壓縮算法。隨后需要對資源段中的數據進行處理,將如圖標版本信息等特殊數據隔離,其他資源段的數據進行壓縮。待各區段處理完畢后,將所有區段進行融合,進行統一處理,這樣就減少了區塊間隙的個數,進一步縮小文件體積。最后,將shell引導段寫入PE文件,以保shell代碼在源程序之前運行。
1.3 水印部分總體設計
水印部分采用動態水印技術。動態水印技術主要分為執行狀態水印、數據結構水印和復活節彩蛋水印。
執行狀態水印對內存地址走向進行編碼生成水印,有時也會根據指令執行順序來生成水印,通過控制地址和操作碼順序的統計特性來執行水印檢測。實施起來較為困難。數據結構水印通過輸入特定信息激發程序將水印信息隱藏在諸如堆、棧或者全局變量域的程序狀態中當所有信息都輸入完成之后,通過檢測程序變量的當前值來進行水印提取。但是這種水印無法承受迷亂變換的攻擊。復活節彩蛋水印不需要檢測,通過可以顯示版權信息的輸入產生輸出。但水印隱蔽性較差,可以通過調試軟件輕松跟蹤和刪除。
綜合上述三種動態水印技術,本系統選擇將水印嵌入到函數中。通過想要加入的版權信息生成等長的數據,將數據與原代碼中的常量結合,只有給定一定輸入,水印信息才能被產生并計算出來。由于這種水印是隨著程序的運行才產生的,能承受各種變形攻擊。并且,在源程序函數數量較多時,很難定位到該水印函數,即使被發現了,如果試圖修改,程序性能也會受到影響。
水印算法分為水印信息處理、水印分割、構造水印函數、水印嵌入和水印提取五個部分。
設計水印信息包括軟件指紋、軟件所有者、發行方信息、授權方信息、時間戳、備注。由于信息不等長,不便于之后對數據的處理,所以需要對水印信息進行一些提前處理,將其變為等長的數據。由此想到可以計算信息的MD5摘要值后嵌入程序。
2 軟件加殼技術的應用
2.1 游戲產業的應用
在當前的計算機游戲產業中,盜版程序或一些外掛程序將在游戲發布后的幾天或幾周內出現。玩家希望可以盡快地體驗新的游戲玩法,這使得游戲的大部分線上收入是在游戲上市后的較短時間內獲得的。如果盜版游戲很快出現,就會嚴重影響游戲的收入。同時外掛插件程序會影響游戲的公平性,導致外掛泛濫、玩家流失。因此,游戲的開發商們為了自身收益與玩家的體驗,總是在游戲中應用軟件保護技術。
2.2 軟件注冊的應用
如果程序的價值很高,且主要銷售途徑是向公司銷售。公司盜版的損失遠大于個人盜版。如果公司購買了一份軟件,卻能讓100人同時使用,就大大影響了軟件收入。因此需要軟件保護技術,來阻止對軟件的惡意破解行為,使其只能按正規形式購買軟件并使用。這樣就有效地保護了開發者的合法權益。
2.3 電子授權技術
電子授權技術是基于軟件的加密方式,分為序列號和軟件許可兩種。該方法的優點是不需要硬件設備,就可以實現軟件的電子發行。缺點是受網絡限制較大,如果沒有網絡,就需要手動計算相關信息,再獲取序列號導入系統。
軟件加密行業的發展與軟件行業的發展是密不可分的。大的發展環境下,提供軟件產品的方式已經從線下轉為線上。因此,軟件加密技術也要向著線上發展。就目前的情況而言,加密鎖技術的發展空間較小,基于硬件的不便利性使其將會漸漸被電子授權方式所取代。
電子授權技術正在從序列號方式轉向軟件許可的方式,認證方法也從手動驗證變為自動驗證。提出的授權管理概念,使電子授權技術發展為授權認證、授權管理和信息統計的綜合平臺,軟件開發商的授權信息化能力有了很大的提高。
3 結語
本系統使用C語言編寫,內聯匯編代碼,在Windows 10操作系統下運行。提供軟件加殼功能,對可執行文件進行加密與壓縮操作,僅在載入內存后才對其進行解密操作,能夠很好地保護軟件信息。同時添加了軟件水印與軟件指紋技術,使被保護程序帶有軟件所有者身份信息與軟件開發授權信息等,進一步保障軟件所有者版權。
參考文獻
[1]段鋼.加密與解密第四版[M].北京:電子工業出版社,2018.
[2]范潔.軟件特征和軟件水印在軟件保護中的應用研究[J].計算機應用與軟件,2018.
[3]李志飛.一種基于安全注冊碼的加密軟件設計[J].中國科技信息,2018.
[4]許金超.基于內存操作的動態軟件水印算法[J].通信學報,2017.
[5]林小華.基于加密和即時解密的軟件保護分析[J].自動化與儀器儀表,2016.