王小剛
(山西水利職業技術學院,山西 太原 030027)
現在大部分的加密軟件只是針對某種特殊的文件進行處理,并且只是使用簡單的加密手段,很容易被解密者破解;有一些高強度的加密軟件要求有昂貴硬件設備予以支持,這樣加密后的文件很不方便在別的機器上對文件進行解密操作;還有一些加密軟件是在利用系統的漏洞進行加密,一旦這些漏洞被修補,極易造成文件的丟失。
計算機病毒是指編制者在計算機程序中插入的破壞計算機功能或者破壞數據,影響計算機使用并且能夠自我復制的一組計算機指令或者程序代碼。試想可以用計算機病毒的原理,把插入的破壞計算機功能或數據的代碼換成具有解密特定數據能力的代碼,被注入病毒的文件可以看作是已加密好的數據,重新排列解密代碼和被加密數據的位置,只要有執行能力的代碼可以引導數據正確的解密,那么這種方法是行得通的。而且被加密的數據看成了一個整體,使用時將加密文件分離,這樣就不會有特定文件類型的限制了,再在這個基礎上輔以特定的加密算法,就可以對文件進行更強的保護了,杜絕了上面所屬加密方法的不足。
由于是將具有執行能力的文件注入到已加密好的文件中,運行時將它們分離,我們就把這種方法叫做捆綁的方法。利用這種方法就可以對文件進行加密了。
捆綁是將幾個東西用繩索等綁在一起,用在軟件中就是這樣的:想實現運行一個文件同時運行其他多個文件,必須要把多個文件“組合”成一個文件,而這一個文件還必須有“分解”的能力,這樣才能把捆綁起來的文件分離出來,使之正常運行。而“組合”也可以有多種形式,比如把要捆綁的文件一個一個地加到文件末尾,或者以資源形式組合到一個文件中,還有復雜一點的利用專用的安裝打包工具組合?;诶壥降奈募用苁褂玫氖堑谝环N組合方式,也稱為傳統式捆綁機。
這里把起捆綁并加密文件作用的程序叫做加密程序,它是一個可執行文件;要加密的文件經加密程序加
密后捆綁在事先寫好的具有解密能力的解密程序文件尾部,此時的文件稱為解密程序,具有解密引導功能的程序稱為解密引導程序。解密時,先執行具有解密能力的解密程序,從自身中分離出捆綁的那個需要解密的文件。
1.軟件設計
如何保護自己的文件不被非授權盜用的問題,始終困擾著每一個人。現在市面上充斥著各式各樣的加密軟件,用這些加密軟件可以加密用戶的文件,它通常是將待加密的文件作為純數據處理,加密后還需一個特定的解密軟件來針對這個加密后的文件進行解密,這樣做的缺點是顯而易見的:解密時需要解密程序存在,不易于在未裝有解密程序的平臺上解密,通用性差,一旦解密程序丟失,加密后的文件是難以恢復的;大量的加密軟件僅僅是針對PE可執行文件的,使得許多的其他文件沒法保護;另外,還有些軟件對數據的加密是利用系統的漏洞,這樣對數據是很不全的。這里通過捆綁的方法將解密程序同加密的數據作為一個整體,加密后的文件將生成一個可執行文件,而不是一個單純的數據亂碼,單純的數據很難判斷自身是否完整,這樣就使用戶確定文件的完整。當文件使用時,要求用戶擁有正確的密碼,開始使用時能夠和使用普通文件一樣使用,使用完畢以后該文件依然保持加密狀態,下次使用依然需要輸入密碼,解除了重復加解密的過程。
2.捆綁式加密技術實現語言及需解決的問題
Visual Basic軟件的功能極為強大,深受程序員喜歡。VB的P-code方式編譯的程序很難破解,因為我們跟蹤用這種方式編譯的程序時,看不到程序作者寫的程序,只能看到VB的程序,我們只能在微軟設計好的VB程序里面兜圈子,但是在兜圈子的過程中,作者的程序已經在執行了,并且由于它的開發速度快,適合于捆綁式文件加密技術的實現。
實現捆綁式的文件加密方法,需解決的幾個問題:(1)如何加入密碼檢測;(2)如何隱藏文件密碼;(3)
對正常用戶而言,不應造成使用不便。
3.運行需求
正常使用時不應出錯,若運行時遇到不可恢復的系統錯誤,也必須保證數據完好無損,要求系統運行時能夠保證正確性、可靠性。
1.用戶界面設計
基于捆綁式的文件加密程序采用了易上手的向導式界面,擁有較強的交互性。用戶依照步驟瀏覽找到待加密的文件,指定加密后文件的存儲位置以及文件名,最后設置文件的密碼。在用戶輸入密碼時,軟件系統將自動判斷密碼的強度,這樣可以幫助用戶選擇合適強度的密碼。
2.加密過程實現
當用戶選擇好加密的文件和加密后的文件位置之后,并輸入要設置的密碼后就可以進行程序的加密了。程序加密時,首先將要加密的文件以二進制的形式讀入一個文件大小的p1Array緩沖中,然后以用戶輸入的密碼作密匙對數組p1Array用事先寫好的算法進行數據加密,加密后的數據仍放在數組p1Array中。為了日后解密的方便,將解密引導程序放在p1Array的前面,用捆綁的形式,在我們運行解密程序時就可以對附在后面的數據文件進行解密了。為了達到跨機運行,就不得不把密碼寫入加密后的文件中,這里為了演示清楚,以“[Password]”為密碼存放開始的標志,將加密后的密碼信息放在“[Password]”后面,這樣還不夠,將來解密文件后,仍要保持文件的類型,將文件的擴展名放在“[FN]”后面,最后將解密引導程序+加密后的文件數據+[Password]+加密后的密碼+[FN]+未加密的文件擴展名保存為加密后的文件的尾部。
3.密碼加密的保存
若將密碼以明文的形式保存在加密文件中,很容易通過查看加密文件獲得密碼,那么這樣對加密文件是十分危險的,我們就必須對密碼進行加密保存。這里用MD5對密碼進行加密,這樣做的好處是它將產生一個固定長度為128位的信息摘要,有利于解密時密碼正確與否的判斷。
4.加密后加密文件完整性的判斷
加密后的文件很容易被那些破解者通過文件編輯器編輯,修改特定的代碼,以達到破解的目的,那么就必須預防這種破解手段,實現軟件代碼校驗,以防止被修改,比如用CRC或者MD5進行自身代碼完整性檢測。加密程序是加密文件的程序,同時也是一個用于在文件末尾增加stCRC特征碼的程序。特征碼用于保存所需的校驗標志位和校驗碼信息,在解密時將判斷校驗信息,經過這一處理,修改任何一處,解密軟件運行后會自動退出,給用戶程序沒有運行的假象,對于校驗信息的判斷將在解密引導程序中討論。
1.用戶界面及解密過程
因為加密后的文件是可執行的,只要雙擊就進入到了解密程序的引導界面,在這個界面中完成密碼驗證工作。當用戶輸入正確的解密密碼后就會觸發文件的解密的事件。解密程序從自身的程序中分解出經加密后的文件數據,然后把這些數據放入緩沖vbArray中,再對這一緩沖數組進行解密,最后將解密后的數據寫入預定的文件。在加密程序的設計中,已經對加密后的文件引入了文件完整性的校驗標志,那么解密程序執行時,首先就要判斷文件是否完整,如果校驗信息與標志不一致,就停止解密以保證數據安全。
2.加密文件的進一步保護
通過加密程序加密后的文件,它的加密強度還不是很強。由于解密引導程序同被加密的數據是捆綁在一起的,要保護加密的數據,就還要對解密引導程序進行一些安全處理,以防破解者通過跟蹤解密引導程序的方法得知解密密碼,所以對加密文件的進一步保護就等同于對解密引導程序的保護。以下是筆者對解密引導程序設計的一些保護方法:
(1)反調試Anti-Debug
檢測父進程反RING3調試器,我們知道WIN32系統一般軟件的父進程都是EXPLORE,而OllyDbg等RING3調試器對軟件進行調試時都是將它們的進程設為它的子進程,我們只要讓程序檢查父進程是否為EXPLORE.EXE就行,如果發現父進程不是EXPLORE.EXE,就自動退出。
(2)反靜態反匯編
對加密程序和解密引導程序加殼,增加程序的安全性,就會使靜態反匯編程序不能對程序進行匯編,從而保護代碼不被泄漏。
該軟件能在WindowsXP以及以上的WINDOWS操作系統平臺下運行,由于Windows操作系統使用的廣泛性,使得這一方法可以被廣泛地使用。它可以對任何想加密的文件(*.txt)、圖像文件(*.jpg,*.gif,*.bmp)、音樂文件、可執行文件等幾乎一切的文件進行加密。也就是說,你可以用它對各種文件進行加密,文本文件軟件使你要加密的文件最終生成一個可執行文件,當文件使用時,要求您輸入正確的密碼,文件使用時和使用普通文件一樣使用該文件,使用完畢以后該文件依然保持加密狀態,下次使用依然需要輸入密碼,該軟件解除了需要重復加解密的過程。
軟件充分考慮了用戶的操作,通過簡單幾步的界面選擇便可以達到加密文件的目的。
(二)測試分析及效果
1.用加密程序Server加密WINDOWS自帶的記事本Notepad.exe后的生成的文件記為NotepadJM.exe,運行加密后的文件并輸入正確的密碼可以成功地解密,并運行程序,軟件基本功能實現。
2.用Ultra Edit打開NotepadJM.exe文件,任意修改一個字節,然后運行該程序,一旦運行程序退出,程序的完整性檢查成功。
3.用目前流行的OllyDBG動態調試工具加載并運行NotepadJM.exe,調試器運行并使EIP指針轉到結束代碼,使得無法跟蹤軟件的解密過程,程序的反動態調試成功。
[1][美]Bruce Schneier.應用密碼學[M].吳世忠,祝世雄,張文政,等譯.北京:機械工業出版社,2000.
[2]武新華.加密解密全攻略(第3版)[M].北京:中國鐵道出版社,2010.
[3][美]Collberg,C.軟件加密與解密[M].北京:人民郵電出版社,2012.
[4]李良俊.Visual-Basic程序設計語言[M].北京:科學出版社,2011.