高 曉
(福建江夏學(xué)院電子信息科學(xué)系,福州350108)
隨著計算機逐步地深入人們的學(xué)習(xí)、生活和工作等方方面面,軟件行業(yè)也得到了迅速的發(fā)展,但同時我們也看到軟件盜版現(xiàn)象日益猖獗,計算機的信息安全面臨著越來越嚴重的威脅。軟件開發(fā)者為了維護自身以及軟件購買人的利益,保護科研成果、技術(shù)和版權(quán),有必要對軟件進行加密保護,然而另有一些軟件人員為提高自己的編程水平或其他目的,會針對出現(xiàn)的保護方式進行跟蹤分析,找出相應(yīng)的方法或制作出破解工具軟件破解軟件的保護。這樣,隨著軟件業(yè)的發(fā)展,相互對立的軟件保護技術(shù)和破解技術(shù)也發(fā)展壯大了起來。本文就軟件的破解和保護進行簡單的探索與分析。
破解是擊敗、繞過或清除各種拷貝保護機制的“暗黑藝術(shù)”。最初,破解主要是針對注冊序列號、硬件密鑰等的軟件保護方案,近來,破解也被應(yīng)用于數(shù)字版權(quán)管理技術(shù)——致力于保護電影、音樂唱片和書籍等受版權(quán)保護的資料。破解與逆向工程有著密切的聯(lián)系,想要攻擊任何一種基于軟件的保護機制,破解者首先必須要準確地了解這種保護機制是如何工作的。這里我們舉個破解范例說明破解的過程。
1.1.1 CrackerMe程序的VC++實現(xiàn)
可以看出,如過我們能夠改變IsVerify的判斷流程,那么整個流程的運行結(jié)果將會發(fā)生顛覆。原來正確的授權(quán)碼將變成錯誤的,而原來不正確的輸入將變成正確的。
1.1.2 逆向分析CrackerMe
我們可以啟用逆向工具軟件OD,并加載CrackerMe.exe文件,通過逆向代碼分析定位到內(nèi)存地址0x00401103處的JNE語句為if(IsVerify==1)判斷的跳轉(zhuǎn)代碼,對應(yīng)的機器碼為0x75 0x34(圖1)。
圖1 暴力破解位置
機器碼0x75表示JNE(不相等則跳),而機器碼0x74表示JE(相等則跳),因此,如果我們有辦法把位于內(nèi)存地址0x00401103處的0x75改成0x74,那么顛覆代碼的目標將會實現(xiàn)。
1.1.3 CrackerMe的PE架構(gòu)
我們使用LordPE軟件查看CrackerMe.exe的PE文件架構(gòu)(圖2),如入口地址(程序運行開始的地方、鏡像基址(裝載基址)、代碼基址等)。
圖2 LordPE查看Cracker.exe的PE文件布局
從中我們已經(jīng)獲得了足夠的信息(圖3),包括:
圖3 LordPE查看Cracker.exe的區(qū)段表
(1)JNE在內(nèi)存中的地址(VA)0x00401103;
(2)裝載基址0x00400000;
(3).text區(qū)段的節(jié)偏移為0。
根據(jù)文件偏移地址=VA-裝載基址-節(jié)偏移,得到內(nèi)存地址0x00401103對應(yīng)的PE文件偏移地址為0x00001103。
1.1.4 CrackerMe的修改
使用UE對CrackerMe.exe的PE文件進行修改,將文件偏移地址為0x00001103處的0x75改為0x74(圖4~5)。
圖4 修改前原PE文件
圖5 修改后PE文件
在此用OD打開CrackMe.exe,可以看到內(nèi)存地址0x00401103處的0x75變成了0x74(圖6)。代碼也發(fā)生了變化。
圖6 用OD加載修改后的CrackMe.exe
至此,我們已經(jīng)完成了一次破解,使軟件的代碼流程發(fā)生了變化。
軟年破解的方法和具體流程有很多種,不管哪種破解方法,基本上都遵循以下幾個步驟[1]:
(1)查看軟件是否加殼。所謂“加殼”,就是用專門的工具或方法在應(yīng)用程序上加入一段如同保護層一樣的代碼,使原程序失去本來面目,從而防止程序被非法修改和反匯編。軟件加殼的主要目的有兩個:一是保護,二是壓縮。
(2)如果有殼的話,就脫殼。為了對軟件代碼進行分析,去除其中的保護信息和干擾信息,還原軟件的本來面目,這個過程稱為脫殼。可以使用脫殼軟件或手動的方式對軟件進行脫殼,常用的脫殼軟件有ProcDump、GUW32和UN-PACK等。手動脫殼需要熟悉PE文件格式,同時還需要借助于一些輔助工具,如W32Dasm、LordPE、文件位置計算器、沖擊波等,技術(shù)含量比較高。
(3)使用Ollydebug調(diào)試要破解的軟件程序。OD是一款集成了反匯編分析、十六進制編輯、動態(tài)調(diào)試等多種功能于一身的功能強大的調(diào)試器。通過查看反匯編的程序代碼,找到軟件的注冊過程、軟件的加密算法等,進而通過跳轉(zhuǎn)軟件的運行流程達到破解軟件的目的或編寫注冊機完成軟件的注冊。
(4)修改程序。根據(jù)找到的關(guān)鍵代碼,使用十六進制編輯器或匯編編輯功能來修改這些關(guān)鍵機器碼或匯編代碼。
(5)制作注冊機。掌握了軟件的加密算法后,可以自行制作出一個注冊機,用來生成注冊碼,完成軟件的注冊,比如可以用Delphi來編寫注冊機,徹底完成軟件的破解。
常用的軟件破解工具有:PEiD,SoftICE,IDA Pro和W32Dasm。W32Dasm和IDA等工具適合分析程序文件,不能對分析的程序進行修改,如果需要對可執(zhí)行文件進行編輯和修改等,需要使用專門的編輯工具,比較常用的十六進制編輯器有Hiew、Ultra Edit、Hex Workshop和 WinHex等,這些軟件都有很優(yōu)異的二進制代碼編輯能力。
1.3.1 暴力破解法
是一種針對于密碼的破譯方法,根據(jù)組合原理,將數(shù)字、字母的組合逐個推算、測試直到找出真正的密碼為止。理論上利用這種方法可以破解任何一種密碼,對于簡單的密碼破解,是很有效果的,但耗時長,且當密碼比較復(fù)雜時(數(shù)字與字母組合),就不容易破解了,這時常常采用字典檔和密碼規(guī)則設(shè)定來減少這種遍歷。
1.3.2 注冊機破解法[2]。
注冊機是一個專門用于分析修改軟件內(nèi)部程序信息的專用軟件,分為內(nèi)存注冊機和算法注冊機兩種,內(nèi)存破解法就是先加載破解程序(內(nèi)存注冊機),再通過它去讀取內(nèi)存中軟件的注冊碼,或修改內(nèi)存中軟件相關(guān)的某些數(shù)據(jù),來達到破解軟件的目的。內(nèi)存注冊機在使用時需導(dǎo)入原程序文件安裝目錄下,點擊后自動運行,完成破解原程序文件的注冊信息。內(nèi)存注冊機的版本必須與所要破解的原文件版本相一致,否則不能起到破解作用。算法注冊機是在破解者分析了軟件的注冊碼算法后,制作出來的一種可以自動生成軟件注冊碼的程序。通過用戶提供的注冊信息計算出軟件的注冊碼或注冊序列號,再將該序列號填入原程序文件注冊序列號欄中完成注冊。算法注冊機在使用時,不需導(dǎo)入原程序文件的安裝目錄下,可以存放在硬盤任何位置。
1.3.3 補丁破解法
補丁破解法是指用相關(guān)的補丁程序來修改軟件,以達到破解軟件的目的,此方法一般是破解軟件的驗證注冊碼或時間,基本上都是修改原程序的判斷語句。
1.3.4 文件注冊法[3]
是一種把自己的軟件注冊內(nèi)容放到一定的地方,為自己和別人用到注冊內(nèi)容的時候提供方便,常見的文件注冊法有注冊表導(dǎo)入和注冊文件兩種方法。注冊表導(dǎo)入是通過運行存放軟件注冊碼的.reg注冊表文件進行注冊,破解的操作步驟是先安裝軟件,然后雙擊它的.reg破解文件,出現(xiàn)是否導(dǎo)入注冊表的詢問窗口后,點擊“確定”完成注冊。注冊文件的注冊方式是將注冊文件復(fù)制到軟件的安裝目錄,當軟件運行時自動讀取注冊文件里的信息來驗證注冊的正確性。
軟件加密技術(shù)主要實現(xiàn)以下4個功能:
(1)防止非法復(fù)制,軟件在使用過程中無法完整復(fù)制,即使軟件被復(fù)制了也無法得到完整可用數(shù)據(jù),不能使用。
(2)防非授權(quán)安裝使用,主要是在非授權(quán)的情況下用戶即使得到軟件完整文件也無法安裝使用。
(3)防惡意分析攻擊,軟件一經(jīng)售出,程序文件就在使用者手中,需要防止使用者惡意分析軟件以實現(xiàn)非法復(fù)制和分析。
(4)數(shù)據(jù)訪問控制,用戶在使用過程中對數(shù)據(jù)應(yīng)有不同級別的訪問權(quán)限,禁止沒有取得相應(yīng)授權(quán)的用戶越權(quán)訪問數(shù)據(jù)。
根據(jù)軟件保護是否依賴特定的硬件,分為硬加密軟件保護和軟加密軟件保護。
2.2.1 磁盤檢查保護[4]
最早的磁盤保護是檢查KeyDisk軟盤,程序通過檢查KeyDisk中的加密磁道來確認用戶是否合法。光盤保護同樣注重反拷貝、反刻錄功能,現(xiàn)行的保護法有:光盤狗技術(shù),通過識別光盤上在壓制生產(chǎn)時自然產(chǎn)生的特征來區(qū)分是否原版盤,在翻制光盤時該特征無法提取和復(fù)制;CPPM技術(shù),通過在盤片的導(dǎo)入?yún)^(qū)放置密鑰來對光盤保護;CD_Protector軟件加密技術(shù),用可執(zhí)行文件上的外殼判斷運行的光盤上是否有加密后產(chǎn)生的軌道,將光盤內(nèi)容拷到硬盤上不能使用,只有通過安裝才行;FreeLock加密數(shù)據(jù)光盤,在正常的數(shù)據(jù)軌道后加上一個壞軌或多個與正常軌交替出現(xiàn)的壞軌,使目前大部分刻錄軟件因無法判別來源光盤的格式而拒絕復(fù)制;隱藏目錄技術(shù),用刻錄軟件和十六進制編輯器將存放保密文件的目錄隱藏起來,使其在 Windows和DOS下均不能進入此目錄,只有通過一個有口令的程序調(diào)用才能進入。
2.2.2 加密狗、加密鎖[5]
加密狗是一種插在計算機USB口或并口上的軟硬件結(jié)合的加密產(chǎn)品,通過對軟件與數(shù)據(jù)的保護防止知識產(chǎn)權(quán)被非法使用,在基于硬件的軟件保護上具有很高的安全性。軟件開發(fā)者可以通過接口函數(shù)和軟件狗進行數(shù)據(jù)交換來檢查加密狗是否插在接口上。加密狗內(nèi)置單片機電路,包含有專用于加密的算法軟件,該軟件被寫入單片機后,就不能再被讀出,這樣就保證了加密狗硬件不能被復(fù)制。同時,加密算法是不可預(yù)知、不可逆的,使得加密狗具有判斷、分析的處理能力,增強了主動的反解密能力。
基于軟件的軟件保護也叫軟加密,這是一種不依賴于硬件的保護。目前比較常用的有以下幾種方式。
2.3.1 用戶訪問密碼保護
最簡單的一種軟件保護方式,通過給授權(quán)用戶提供合法的注冊用戶名和密碼,使其獲的對軟件的使用權(quán)。這種保護方式最容易被破解。
2.3.2 序列號保護方式
序列號保護是目前網(wǎng)絡(luò)上和正版軟件最常用的一種保護方式。網(wǎng)絡(luò)上下載的共享軟件一般都有使用時間或功能上的限制,當試用期過后,必須到這個軟件的公司去注冊后方能繼續(xù)使用。注冊過程一般是用戶把自己的私人信息告訴軟件公司,由該公司利用注冊機算出一個序列號,以電子郵件或傳真等形式發(fā)給用戶,由用戶進行信息的注冊登記,一旦注冊信息的合法性驗證通過后,軟件就會取消各種限制而成為完全正式版本。這種保護方式實現(xiàn)起來比較簡單,不需要額外的成本,用戶購買也非常方便,網(wǎng)絡(luò)上80%的軟件都是以這種方式保護的。
2.3.3 注冊保護
注冊文件是一種利用文件來實現(xiàn)注冊軟件保護的方式,只要將注冊文件存入到指定的目錄中,軟件每次啟動時,將從該注冊文件中讀取數(shù)據(jù),然后利用某種算法進行處理,若結(jié)果判斷為正確的注冊文件,就讓軟件成為正式版。
為了增加破解難度,可以采用大一些的文件作為Key File,或加入一些垃圾信息來干擾解密者的企圖;對于注冊文件的合法性檢查要盡可能地分成幾部分,并分散在軟件的不同模塊中進行判斷;對注冊文件內(nèi)的數(shù)據(jù)處理也盡可能采用復(fù)雜算法,不要使用簡單的異或運算;可以讓注冊文件中的部分數(shù)據(jù)和軟件中的關(guān)鍵代碼或數(shù)據(jù)相互關(guān)聯(lián),以使軟件無法被暴力破解。
2.3.4 菜單功能限制保護
功能限制的程序一般分為2種:(1)試用版和正式版是完全分開的2個版本,被禁止的功能代碼只有在正式版中才有,而正式版只能向軟件作者購買。對于這種程序因為破解以后仍然不會得到相應(yīng)的功能,破解者破解該軟件是沒有什么意義的。(2)試用版和注冊版為同一個文件,沒有注冊時,按照試用版運行,禁止某些功能的使用。一旦注冊以后,就以正式版模式運行,用戶可以使用全部功能。對于這種類型的程序,破解者只要通過一定的方法恢復(fù)被限制的功能,就能使該試用版的軟件同正式版相同。
2.3.5 軟件加殼保護[6]
加殼實質(zhì)上就是把一段特殊程序附加到應(yīng)用程序中,并把程序的執(zhí)行入口指向附加的特殊殼程序。源程序不需做任何修改,只需選用一款加密強度夠高、防脫能力夠強的加殼工具,發(fā)布演示版時設(shè)置好軟件試用次數(shù)或時間限制,發(fā)布正式版時啟動加殼工具的注冊驗證,對原可執(zhí)行程序加殼即可。這種加密方法使用簡單方便,但知名的、好的加殼工具,往往都有對應(yīng)的脫殼工具,不知名的加殼工具往往又防脫、加密算法強度不高,也容易脫除。
軟件的破解與保護本身就是一對矛盾的關(guān)系。即使軟件開發(fā)者窮盡腦汁編寫各種保護措施,卻最終免不了被破解,為了防范自己的軟件不被別人復(fù)制,我們需要了解盜版者所使用的破解技術(shù),進而研究好的加密方法,讓盜版者在破解密碼時因要付出巨大代價而被迫放棄攻擊。在現(xiàn)行的中國軟件保護措施較弱的情況下,我們要提高覺悟,尊重IT精英的成果,力所能及地不使用盜版,支持軟件行業(yè)發(fā)展,最終達到保護軟件的目的。
[1]付永鋼,洪玉玲,曹煦暉,等.計算機信息安全技術(shù)[M].北京:清華大學(xué)出版社,2012:225-226.
[2]呂楊,李超.逆向工程之軟件破解與注冊機編寫[J].計算機安全,2011(01):67-68.
[3]古銅.軟件破解大揭密[J].計算機應(yīng)用文摘,2004(9):65.
[4]郭勇,孔寶根.軟件保護及破解策略[J].航空維修與工程,2004(3):38.
[5]孫克爭.淺析軟件的破解與保護[J].福建電腦,2010(8):95.
[6]黃玉波.軟件防破解實用方法分析與實現(xiàn)[J].計算機與現(xiàn)代化,2008(12):115.