蘭勇 龔捷 劉亦歆
摘要:計算機安全領(lǐng)域中,軟件保護(hù)一直是很熱門的研究課題,針對軟件開發(fā)者來說希望自己的軟件在采用軟件和硬件加密的技術(shù)后不能夠被修改或破解。但是任何的軟件破解者只要花費足夠的資源和精力,幾乎所有的軟件都能夠被破解和修改。如何提高軟件的保護(hù)能力,提高軟件的安全性是一個迫在眉睫的問題。該文主要分析常見的軟件保護(hù)方法,以及介紹PE文件格式,同時提出了基于混合的軟件殼保護(hù)模型。
關(guān)鍵詞:加密;加殼;脫殼;MAC;PE文件
中圖分類號:TP311 文獻(xiàn)標(biāo)識碼:A 文章編號:1009-3044(2014)05-1081-05
常見的軟件保護(hù)方式包括硬加密和軟加密兩種方式。硬件加密主要是采用加密狗、盤保護(hù)兩種方式。軟加密保護(hù)主要是充分利用計算機硬盤序列號、CPU序列號、MAC等唯一性,利用軟件將硬件的唯一性綁定到一起,有效的形成軟件保護(hù)。常見的軟件保護(hù)包括:軟件水印、注冊驗證、反跟蹤、軟件加殼保護(hù);隨著目前軟件技術(shù)的發(fā)展,以及惡意軟件感染能力的增強,采用傳統(tǒng)的軟件保護(hù)方式針對安全性要求高的軟件來說保護(hù)效果不夠明顯,所以需要提出新的軟件保護(hù)方式。軟件開發(fā)者通常會自主開發(fā)軟件加密算法和用戶賬號統(tǒng)一管理工具來提高軟件的安全性。
1 硬加密方式
常用的硬加密通常采用的方式是將被保護(hù)的軟件與硬件加密鎖有效的綁定到一起,比如一些重要的敏感數(shù)據(jù)、key file授權(quán)文件、加密算法等都存儲到硬件加密鎖中。一般根據(jù)使用CPU的不同分為普通加密鎖和智能加密鎖。
硬加密雖然從安全性上來說比較高,但是缺點還是比較明顯:
1)對于升級、維護(hù)比較難以管理;
2)由于需要硬件設(shè)備,所以成本偏高,主要包括生產(chǎn)、運輸、安裝等成本;
3)影響用戶體驗,因為需要安裝相應(yīng)硬件的設(shè)備驅(qū)動和硬件設(shè)備。
2 軟加密方式
軟加密是指使用軟件方法來進(jìn)行各種加密保護(hù),隨著軟件保護(hù)技術(shù)的發(fā)展越來越多的軟加密技術(shù)已經(jīng)出現(xiàn),比如常見的:注冊碼保護(hù)方式、功能菜單限制保護(hù)、使用時間限制保護(hù)、采用網(wǎng)絡(luò)驗證機制、驗證文件保護(hù)、反跟蹤技術(shù)保護(hù)、軟件加殼保護(hù)機制等。
2.1基于注冊碼保護(hù)機制
注冊碼其實就是序列號保護(hù)機制,本質(zhì)為防止軟件被盜版而采取的保護(hù)措施。用戶通常從網(wǎng)絡(luò)上下載一個試用版本的軟件,在使用時間上有限制,如果時間過期后,就必須注冊才能夠繼續(xù)使用,使用者必須將自己的身份證號碼或手機號提供給軟件公司,然后軟件開發(fā)公司利用用戶的信息通過注冊機計算出一個有效的、唯一的序列號。用戶再利用計算出的序列號和用戶信息輸入軟件中,如果信息合法那么相應(yīng)的限制被取消。整個過程從數(shù)學(xué)的角度看其實就是映射關(guān)系。常見的映射關(guān)系有四種,如表1:
表1 序列號映射函數(shù)
2.2基于菜單功能限制保護(hù)機制
基于菜單功能限制保護(hù)的軟件保護(hù)機制,主要用于軟件的demo版本,部分菜單功能被限制不能夠使用,通常有兩種方式方法一:使用版本的軟件和正式版本的軟件本身完全不同,使用版本的軟件在菜單中對于的功能實現(xiàn)函數(shù)根本就沒有,也就是只有正式版本中才有相應(yīng)的功能處理函數(shù)。方法二:使用版本和正式版本實質(zhì)上是一樣的,只是將功能菜單設(shè)置為非激活狀態(tài)或隱藏,只有用戶成功升級為正式用戶后,被限制的功能才會解除。對于破解者來說,只需要想辦法如何打開這些受限的菜單功能模塊代碼上。
2.3基于時間限制保護(hù)策略
基于時間限制的軟件保護(hù)機制主要包括兩種方式:1、總使用時間限制;2單次使用時間限制。
總使用時間限制主要是針對試用版本的軟件在試用時間上的限制,比如某個軟件試用期限為30天,如果用戶超過軟件試用期的時間,此軟件用戶就不能夠再使用了。
第二種方式,主要是指用戶單次使用試用版過程中的使用時間的限制,比如使用版本的軟件單次使用的時間為20分鐘,20分鐘后就不停的彈出提示用戶購買升級為正式用戶。
2.4基于key-file文件保護(hù)機制
Key-file(注冊文件保護(hù))文件保護(hù)機制,用戶不需要輸入序列號或注冊碼等信息,充分利用文件來保存驗證信息實現(xiàn)軟件安全性保護(hù)。這種方式其實是序列號保護(hù)機制的變形,只是驗證信息保存在文件中,通常key-file文件中的文件格式都是軟件開發(fā)者自行定義的,從原理上來說通常與軟件的配置文件(通常xml格式)有點類似。用戶升級為正式用戶后,軟件開發(fā)者會提供一個key-file文件,你只需要把這個文件放到特定的目錄安裝目錄下面,下次啟動軟件的時候會自動尋找驗證用戶的合法性。
2.5基于軟件保護(hù)殼的保護(hù)機制
基于加殼技術(shù)的軟件保護(hù)主要是對可執(zhí)行文件進(jìn)行加密、壓縮。對要保護(hù)的軟件加上一個外殼,同時PE文件任然能夠正常運行。外殼程序主要負(fù)責(zé)把受保護(hù)的軟件解壓解密到內(nèi)存中,并且控制權(quán)交還給原程序。整個過程用戶不清楚也不并清楚該執(zhí)行過程,并且程序的運行速度也沒有明顯的影響。整過過程針對用戶來說是透明的。
3 PE文件結(jié)構(gòu)
PE文件對于研究軟件保護(hù),分析、掌握可執(zhí)行文件的組織結(jié)構(gòu)及其執(zhí)行原理是很有必要的。Windows系統(tǒng)中的“WINNT.H”文件中包含PE文件的詳細(xì)格式,常見的PE文件包括:.EXE、.DLL、.OCX、.SYS、.COM 等類型的文件。這種類型的文件在磁盤上的存儲格式是有一定的規(guī)律的。
從總體上看PE文件分為五大部分:1、Dos Header;2、PE Header;3、Section Table;4、Section;5 調(diào)試信息。如圖1所示:
圖1 IPE文件結(jié)構(gòu)圖
可執(zhí)行文件加載器加載文件的時候,并不是一次把可執(zhí)行文件一次性裝入內(nèi)存中,而是通過循環(huán)遍歷文件的內(nèi)部結(jié)構(gòu)來判斷那一部分的內(nèi)容被映射到內(nèi)存中。當(dāng)文件被加載到內(nèi)存中,內(nèi)存和外存中的文件數(shù)據(jù)結(jié)構(gòu)已經(jīng)發(fā)生了變化。通??蓤?zhí)行文件在內(nèi)存映射文件中各數(shù)據(jù)塊之間的相對偏移地址已經(jīng)發(fā)生了改變,同時科技將內(nèi)存映射文件偏移與外存文件偏移進(jìn)行轉(zhuǎn)換(如圖2):
圖2 外存與內(nèi)存映像結(jié)構(gòu)圖
4 加殼軟件保護(hù)模型
軟件殼其實就是一段可執(zhí)行代碼用于防止軟件被非法的使用、修改、拷貝等的程序,當(dāng)可執(zhí)行文件加載到內(nèi)存后,外殼程序首選獲得程序的控制權(quán),然后解壓加密還原PE文件,最后把控制權(quán)交還給原PE文件。此模型除了采用代碼亂序,還有加密算法和防破解的分析技術(shù),增強了防止破解者修改程序的能力。
從技術(shù)層面上分析目前殼軟件的發(fā)展現(xiàn)狀:
1)多次加殼。從語義上來說就是對PE文件進(jìn)行多次加殼,達(dá)到增強軟件的保護(hù)強度。就軟件保護(hù)而言,并不是加殼的次數(shù)與保護(hù)強度成正比的。
2)偽裝加殼。通常通過改變文件自身的特征屬性來偽裝自己,從而干擾軟件破解者的分析能力,如果用戶沒有正確的分辨出外殼的類型,破解的時候?qū)⒒ㄙM巨大的資源和時間,TrickySigner是目前比較流行的偽裝加殼工具。
3)代碼混淆加殼?,F(xiàn)在JAVA中間代碼的保護(hù)就采用的這種方法,目前.net Obfuscator程序上也采用這種保護(hù)方式。
4)代碼變化加殼。這種方式主要是采取合適的算法對代碼進(jìn)行代碼變化,原程序運行的時候外殼程序就需要把亂序的原程序恢復(fù)為正常的。從靜態(tài)反匯編后看到的代碼全是亂序的。
4.1 加殼原理
加殼的原理:1)對PE文件各section區(qū)塊壓縮和加密;2)添加解密和解壓程序到新的section區(qū)塊中,以及添加區(qū)塊頭到區(qū)塊表中;3)最后修改原程序的入口地址;加殼結(jié)構(gòu)如圖3:
圖3 加殼結(jié)構(gòu)
4.2外殼加載
外殼的加載過程如圖4:
1)保存程序的入口參數(shù)
2)獲取殼要用的API地址
3)解密原程序中的所有區(qū)塊的數(shù)據(jù)
4)初始化IAT
5) 重定位
6)HOOK-API
7) 跳轉(zhuǎn)到源程序的入口地址
圖4 加殼可執(zhí)行文件的執(zhí)行過程
4.3基于混合的軟件保護(hù)模型
常見的脫殼步驟為:首先找到可執(zhí)行原程序的入口地址,再dump可執(zhí)行文件的映像,從加殼后的可執(zhí)行文件自身來看不管什么時候最終都要轉(zhuǎn)入原程序的入口地址。由于殼技術(shù)本身的要求我們不可能隱藏入口點的地址。那么我們可以采取的方式是讓脫殼者即使dump了可執(zhí)行文件也沒法還原程序。基于這個特性本文采用了基于混合的軟件加殼保護(hù)模型,將原程序和外殼有效的混合到一起。
圖5 基于混合的軟件保護(hù)模型
從圖5中可以看出即使脫殼者查找到程序的入口地址,同時dump可執(zhí)行文件的內(nèi)存映像,也很難還原原程序文件。因為一旦把殼脫了原程序部分代碼也脫掉了。這樣就很難還原原代碼從而達(dá)到保護(hù)軟件的目的。
此模型主要是采用代碼亂序的技術(shù)。此技術(shù)就是把原程序打亂,讓脫殼者很難分析和破解。達(dá)到外殼和原程序相互混合的目的,增加軟件的安全性。此模型除了采用代碼亂序技術(shù)以外,也結(jié)合花指令技術(shù)、反-反匯編技術(shù)、以及結(jié)構(gòu)化異常處理技術(shù)等來增強被分析、破解的軟件保護(hù)技術(shù)。
4.3.1模型系統(tǒng)架構(gòu)圖
原可執(zhí)行文件處理包括添加殼程序和可執(zhí)行文件重組工程:將需要加殼的文件從磁盤加載到內(nèi)存中去,接著對可執(zhí)行文件內(nèi)存映射每個相關(guān)頭、區(qū)塊進(jìn)行處理。
外殼程序: 加殼后的PE文件首先運行殼程序時候,會對原來的可執(zhí)行文件進(jìn)行循環(huán)校驗,同時對原加密的區(qū)塊數(shù)據(jù)進(jìn)行解密,以及重建輸入表,原程序亂序處理,最后還是跳轉(zhuǎn)到原程序的入口地址。如上頁圖6。
此保護(hù)模型主要由加密部分、外殼部分、外殼添加部分、可執(zhí)行文件處理部分構(gòu)成,詳細(xì)的加殼程序流程如圖7所示:
圖7 系統(tǒng)加殼流程圖
5 結(jié)論
該文首先分析了軟件加密的兩種方式:硬加密和軟加密,同時詳細(xì)的介紹了當(dāng)前比較流行的軟件加密的幾種方式。然后采用軟件殼的軟件保護(hù)方式,分析PE文件的結(jié)構(gòu),提出基于混合的代碼保護(hù)模型。假如外殼程序與原程序融合的越緊密,那么起到保護(hù)軟件的作用就越顯著。
參考文獻(xiàn):
[1] 李文.基于殼技術(shù)的軟件保護(hù)研究[D].電子科技大學(xué),2012:43-44.
[2] 楊新柱.可執(zhí)行文件格式分析與應(yīng)用[D].北京郵電大學(xué),2009:30-34.
[3] 梁曉.惡意代碼行為自動化分析的研究與實現(xiàn)[D].電子科技大學(xué),2008.
[4] Bruce Schneier,“Security-FOCUS:Attack Trends”,QUEUE,June2005.
[5] Hodong Lee,“The construction and principal of executable file of windows systems”,Hanvit Media,2005.6.