![軟件逆向工程原理與實踐課件:軟件逆向工程概述_第1頁](http://file4.renrendoc.com/view11/M02/0A/1C/wKhkGWXJuuyAbGJJAAHwTPA4WRk849.jpg)
![軟件逆向工程原理與實踐課件:軟件逆向工程概述_第2頁](http://file4.renrendoc.com/view11/M02/0A/1C/wKhkGWXJuuyAbGJJAAHwTPA4WRk8492.jpg)
![軟件逆向工程原理與實踐課件:軟件逆向工程概述_第3頁](http://file4.renrendoc.com/view11/M02/0A/1C/wKhkGWXJuuyAbGJJAAHwTPA4WRk8493.jpg)
![軟件逆向工程原理與實踐課件:軟件逆向工程概述_第4頁](http://file4.renrendoc.com/view11/M02/0A/1C/wKhkGWXJuuyAbGJJAAHwTPA4WRk8494.jpg)
![軟件逆向工程原理與實踐課件:軟件逆向工程概述_第5頁](http://file4.renrendoc.com/view11/M02/0A/1C/wKhkGWXJuuyAbGJJAAHwTPA4WRk8495.jpg)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
軟件逆向工程概述1.1逆向工程的概念和基本方法1.2軟件逆向工程的應(yīng)用1.3軟件逆向工程的合法性1.4初識工具1.5逆向分析并修改HelloWorld程序1.6思考與練習(xí)
1.1逆向工程的概念和基本方法
什么是逆向工程?簡單地說,就是理解一個系統(tǒng)的過程。這個被理解的系統(tǒng),可以是硬件設(shè)備、軟件程序、協(xié)議、物理/化學(xué)過程等。在現(xiàn)實中,理解的目的往往不僅僅只是獲取信息,更在于構(gòu)建特定的事物。因此,逆向工程也可以看作一個從對象中提取知識或設(shè)計信息,并重建對象或基于對象信息的事物的過程。
對于軟件逆向工程而言,被理解的系統(tǒng)即軟件。這一對象往往以可執(zhí)行程序的形式存在。具體地講,軟件逆向工程即指通過構(gòu)建通用等級的靜態(tài)和動態(tài)模型來理解已知軟件的結(jié)構(gòu)和行為。因此,軟件逆向工程的過程可以大致分為兩個階段,如圖1-1所示。第一階段是收集信息,被收集的信息可以是靜態(tài)信息或動態(tài)信息。常用于收集靜態(tài)信息的工具包括語法分析器、靜態(tài)分析工具等,常用于收集動態(tài)信息的工具包括調(diào)試器、事件監(jiān)控器等。第二階段是信息抽象,以獲得更高層的可理解的模型。此階段得到的模型可構(gòu)成不同的視圖,包括動態(tài)視圖、靜態(tài)視圖和混合視圖。這些視圖從不同的側(cè)面反映了軟件產(chǎn)品的功能、結(jié)構(gòu)、處理流程、界面設(shè)計等要素。
圖1-1軟件逆向工程的兩階段
從軟件工程的一般過程來看,通常正向過程的先后順序是需求分析、概要設(shè)計、詳細(xì)設(shè)計和軟件實現(xiàn)及測試。軟件逆向工程的過程恰好相反,是從軟件的實現(xiàn)起始的。但軟件逆向工程的過程一般不會延伸到需求分析的層面,而是通過軟件逆向工程的抽象過程得到抽象的系統(tǒng)模型,然后在該系統(tǒng)模型的基礎(chǔ)上進(jìn)行正向工程,實現(xiàn)一個新的
而從更細(xì)粒度的程序?qū)崿F(xiàn)的角度看,程序編譯的過程與軟件逆向工程的過程相反。圖1-2給出了編譯和軟件逆向工程的過程流??梢钥吹?,編譯的過程是將源代碼通過語法分析得到語法樹,再通過中間代碼生成得到控制流圖和中間代碼,然后通過最終代碼生成得到匯編代碼,再通過匯編得到機器碼,最后鏈接為可執(zhí)行程序。而軟件逆向工程則是從程序的機器代碼恢復(fù)出程序的高級語言結(jié)構(gòu)和語義的過程,具體包括反匯編和反編譯等步驟。反匯編是從機器碼得到匯編語言代碼,而反編譯是從匯編語言代碼得到高級語言結(jié)構(gòu)和
語義。
圖1-2編譯和軟件逆向工程的過程流
軟件逆向工程的實現(xiàn)方法可以分為靜態(tài)方法和動態(tài)方法兩類。所謂靜態(tài)方法,是指分析但不運行代碼的方法,相比動態(tài)方法而言更為安全。常見的反匯編器IDAPro、objdump等都采用的是靜態(tài)方法。而動態(tài)方法則是指通過在虛擬環(huán)境或?qū)嶋H系統(tǒng)環(huán)境中運行和操作進(jìn)程,檢查進(jìn)程執(zhí)行過程中寄存器和內(nèi)存值的實時變化的方法,常見的調(diào)試器如WinDbg、Immunity、OllyDbg、GDB等都采用的是動態(tài)方法。較為復(fù)雜的動態(tài)方法可能會將程序的二進(jìn)制代碼置于可控的虛擬環(huán)境中,通過虛擬環(huán)境中的CPU得到其執(zhí)行軌跡,然后利用條件跳轉(zhuǎn)指令泄漏路徑約束信息,使用符號執(zhí)行技術(shù)從執(zhí)行軌跡中收集邏輯謂詞,進(jìn)而通過約束求解準(zhǔn)確地推斷出程序的內(nèi)部邏輯。
不同的反匯編引擎會采用不同的反匯編算法。反匯編算法首先確定需要進(jìn)行反匯編的代碼區(qū)域,然后讀取特定地址的二進(jìn)制代碼并執(zhí)行表查找,將二進(jìn)制操作碼轉(zhuǎn)換為匯編語言助記符,此后對匯編語言進(jìn)行格式化并輸出匯編代碼。如何選定下一條被反匯編的指令,不同的算法采取的策略不同。常見的策略包括線性掃描(LinearSweep)和遞歸下降(RecursiveTraversal)兩種。GDB、WinDbg、objdump等均采用線性掃描的方法,而IDAPro則采用的是遞歸下降方法。
1.2軟件逆向工程的應(yīng)用
惡意代碼分析是軟件逆向工程的主要應(yīng)用之一。與軟件逆向工程的實現(xiàn)方法相對應(yīng),惡意代碼分析也可以分為動態(tài)分析和靜態(tài)分析。動態(tài)分析是指在嚴(yán)格控制的沙箱環(huán)境中執(zhí)行惡意程序,記錄并報告程序出現(xiàn)的所有行為,從中識別出惡意行為。而靜態(tài)分析則是指通過分析反匯編后得到的匯編程序代碼或通過反編譯得到的高層代碼來理解程序行為。
軟件逆向工程需解決的另一個重要問題是閉源軟件的漏洞分析。這也說明了軟件逆向分析不僅能應(yīng)用于“惡意”軟件,也能應(yīng)用于“良性”軟件。“良性”軟件的開發(fā)過程中可能由于開發(fā)者的經(jīng)驗、編譯器的配置等因素而引入很多漏洞,這些漏洞有時容易被攻擊者利用。為了發(fā)現(xiàn)和分析這些潛在的漏洞,我們可以采用模糊測試(fuzzingtest)或靜態(tài)分析,而靜態(tài)分析通常就以反匯編為基礎(chǔ)。對“良性”軟件的修改在二進(jìn)制層面也有“良性”和“惡意”之分,通過反匯編和調(diào)試等逆向技術(shù),我們可以開發(fā)出相應(yīng)的補丁程序或破解程序(Exploit)。
軟件逆向工程的另一個典型應(yīng)用是閉源軟件的互操作性分析。如果我們只能獲得一個軟件的二進(jìn)制碼,而又要開發(fā)與其互操作的軟件和插件,或者開發(fā)適用于其他硬件平臺的程序(屬于軟件移植的范疇),那么往往需要通過逆向工程相關(guān)的技術(shù)來界定該軟件的行為和接口。
此外,我們還可以利用反編譯等技術(shù)來衡量編譯器的正確性和安全性,驗證編譯器是否符合規(guī)范,尋找優(yōu)化編譯器輸出的方法,并檢查由此編譯器生成的代碼中是否能插入后門,從而判定編譯器本身是否有安全問題。
1.3軟件逆向工程的合法性
與病毒和網(wǎng)絡(luò)攻擊類似,軟件逆向工程并不總是合法的。美國和歐盟等主要經(jīng)濟(jì)體在軟件逆向工程合法性和軟件版權(quán)保護(hù)方面都制定了各自的法律法規(guī)。美國法律認(rèn)為,對人工制品和過程的逆向工程權(quán),隨該制品/過程的合法獲得而被法律許可。
通常,當(dāng)軟件版權(quán)所有者無法進(jìn)行軟件錯誤修正時,我們可以通過逆向工程對軟件錯誤進(jìn)行修正和破解。而在不違反專利權(quán)或商業(yè)秘密保護(hù)的前提下,可以通過逆向工程確定軟件中不受版權(quán)保護(hù)的部分(如一些算法)。
一般針對軟件逆向工程的法規(guī)通常聲明如下合法性限制:
①逆向工程人員為合法用戶;
②逆向工程以互操作為目的,僅對實現(xiàn)互操作程序所必要的那部分程序進(jìn)行逆向工程;
③需獲取的“必要信息”不能從其他途徑取得;
④通過逆向工程獲得的信息不能用于實現(xiàn)互操作程序以外的目的,不能擴(kuò)散給不必要的第三人;
⑤不能用于開發(fā)形式類似或有其他著作權(quán)侵權(quán)因素的程序;
⑥不得不合理地?fù)p害權(quán)利人的正當(dāng)利益或妨礙計算機程序的正常使用。
我國第一部有關(guān)計算機軟件保護(hù)的法律條例《計算機保護(hù)條例》(1991),為計算機軟件的使用和版權(quán)保護(hù)做出了相關(guān)規(guī)定,但條例未直接涉及軟件逆向工程相關(guān)的問題。自2002年該條例修訂后,對軟件的“合理使用”進(jìn)行了更為嚴(yán)格的規(guī)定。2007年2月施行的《最高人民法院關(guān)于審理不正當(dāng)競爭民事案件應(yīng)用法律若干問題的解釋》第十二條規(guī)定,通過反向工程方式獲得的商業(yè)秘密,不認(rèn)定為反不正當(dāng)競爭法規(guī)定的侵犯商業(yè)秘密行為。這是我國法律首次對逆向工程進(jìn)行相關(guān)規(guī)定。與歐美等發(fā)達(dá)國家的相對完善的法律相比,我國的相關(guān)法律法規(guī)依然相對落后。
與此同時,國外已經(jīng)出現(xiàn)了一些與軟件逆向工程相關(guān)的法律案例,例如Connectix公司對SONY公司PlayStation的逆向侵權(quán)案例。PlayStation是SONY公司斥巨資研發(fā)的一款電視游戲系統(tǒng),1995年向全球市場發(fā)行并在商業(yè)上取得了巨大成功。1998年,Connectix公司開始對PlayStation的軟件進(jìn)行仿制,以使PlayStation系統(tǒng)上的游戲能運行于個人電腦。該公司對SONY已經(jīng)申請專利保護(hù)的PlayStation系統(tǒng)的BIOS進(jìn)行逆向工程,從而開發(fā)出和PlayStation功能相似的可應(yīng)用于個人電腦上的程序VGS。
1999年1月,SONY公司向美國加州法院提起訴訟,狀告Connectix公司侵犯其著作權(quán)。加州法院一審認(rèn)為,盡管VGS中沒有包含PlayStation源程序,但VGS的使用妨害了PlayStation系統(tǒng)的銷售,因而該法院對Connectix公司發(fā)布了發(fā)售禁令。而在Connectix的后續(xù)上訴過程中,美國聯(lián)邦第九巡回上訴法院則判定Connectix公司屬于正當(dāng)使用,解除了加州法院的禁令。聯(lián)邦第九巡回法院的判決思想認(rèn)為:為了解PlayStation的設(shè)計思想和功能概念這些不受版權(quán)保護(hù)的程序側(cè)面,對該程序的目標(biāo)代碼進(jìn)行反匯編是必需而不可繞過的,因而這種反匯編屬于合理使用。
1.4初識工具
本節(jié)將介紹的第一個逆向分析工具是OllyDbg。OllyDbg是一種具有可視化界面的32位匯編分析調(diào)試器。作為一種動態(tài)追蹤工具,OllyDbg適用于Windows環(huán)境。該調(diào)試器融合了IDA和SoftICE的思想,支持Ring3級調(diào)試。同時,該調(diào)試器還支持插件擴(kuò)展功能,是目前最強大的調(diào)試工具之一。
OllyDbg的主界面樣式如圖1-3所示,其中編號的界面區(qū)域所具有的功能分別說明如下:
(1)匯編指令地址;
(2)匯編指令對應(yīng)的十六進(jìn)制機器碼;
(3)反匯編代碼;
(4)反匯編代碼對應(yīng)的注釋信息;
(5)當(dāng)前執(zhí)行到的反匯編代碼信息;
(6)當(dāng)前程序執(zhí)行狀態(tài)下的各寄存器值;
(7)數(shù)據(jù)所處的內(nèi)存地址;
(8)數(shù)據(jù)對應(yīng)的十六進(jìn)制編碼;
(9)數(shù)據(jù)對應(yīng)的ASCII編碼;
(10)棧地址;
(11)棧數(shù)據(jù);
(12)棧數(shù)據(jù)對應(yīng)的說明信息。
其中,匯編代碼窗口包括(1)~(5);寄存器窗口包括(6);數(shù)據(jù)窗口包括(7)~(9);棧窗口包括(10)~(12)。
圖1-3
OllyDbg的主界面樣式
直接用OllyDbg打開具體的應(yīng)用程序,即可發(fā)起對該應(yīng)用程序的調(diào)試過程。OllyDbg的操作方便,表1-1中的快捷鍵能夠幫助我們高效地調(diào)試目標(biāo)應(yīng)用程序。
在調(diào)試具體程序時,我們還常會用到一些典型的操作方法,具體包括:
(1)跳轉(zhuǎn)到目標(biāo)地址:光標(biāo)移到目標(biāo)地址(Ctrl+G),然后按F4鍵。
(2)跳轉(zhuǎn)到指定注釋:在匯編代碼窗口中點擊右鍵,選擇Searchfor→User-defined
comment,雙擊要跳轉(zhuǎn)到的注釋,然后按F4鍵。
(3)跳轉(zhuǎn)到指定標(biāo)簽:在匯編代碼窗口中點擊右鍵,選擇Searchfor→User-defined
label,雙擊要跳轉(zhuǎn)到的標(biāo)簽,然后按F4鍵。
(4)列出程序中引用的所有字符串:在匯編代碼窗口中點擊右鍵,選擇Searchfor→Allreferencedtextstring。
(5)列出程序調(diào)用的API函數(shù)列表:在匯編代碼窗口中點擊右鍵,選擇Searchfor→Allintermodularcalls。
(6)保存對二進(jìn)制的更改:選中更改的字符串,點擊右鍵,選擇Copytoexecutablefile。
OllyDbg還支持對DLL文件的調(diào)試。在調(diào)試DLL時,OllyDbg會自動創(chuàng)建一個可執(zhí)行程序,該程序會裝載DLL,并調(diào)用DLL中的導(dǎo)出函數(shù)。
1.5逆向分析并修改HelloWorld程序
圖1-4
HelloWorld程序的源代碼
我們所用的HelloWorld程序的源代碼如圖1-4所示。
編譯該程序時,選擇VisualStudio的Release模式,這樣可以避免編譯器插入大量調(diào)試信息,方便我們進(jìn)行調(diào)試和修改。編譯出的HelloWorld.exe的運行效果如圖1-5所示。
圖1-5
HelloWorld程序的運行效果
在得到可執(zhí)行程序HelloWorld.exe后,用OllyDbg將其打開,初始效果如圖1-6所示。
圖1-6使用OllyDbg調(diào)試HelloWorld的初始效果
調(diào)試該程序的第一步是如何找到main()函數(shù)的主體。從圖1-6中可以看出,程序初始執(zhí)行時,并非直接從main()函數(shù)的第一句開始執(zhí)行,而是執(zhí)行一些編譯器和系統(tǒng)要求做的初始化及準(zhǔn)備工作。這些代碼又稱為啟動代碼。進(jìn)行逆向分析時,不需要仔細(xì)分析啟動代碼,但應(yīng)能區(qū)分出啟動代碼和用戶代碼。
那么,如何迅速地找到main()函數(shù)主體呢?我們從執(zhí)行HelloWorld.exe的效果看,能夠判斷出該程序使用了兩個字符串“”和“HelloWorld!”,有經(jīng)驗的程序員還能觀察到我們是調(diào)用了MessageBox()函數(shù)將對話框顯示出來的。因此,除了耐心地通過點擊快捷鍵F7和F8單步執(zhí)行到main()函數(shù)中這一方法之外,還可以使用上一節(jié)介紹的兩種方法:
(1)在匯編代碼窗口中點擊右鍵,選擇Searchfor→Allreferencedtextstring,在被引用字符串的列表中選擇“”或“HelloWorld!”字符串,即可快速找到對這兩個字符串參數(shù)的PUSH壓棧操作,從而找到main()函數(shù),如圖1-7所示。
圖1-7通過查找被引用字符串的方式查找目標(biāo)程序片段
(2)在匯編代碼窗口中點擊右鍵,選擇Searchfor→Allintermodularcalls,在模塊間調(diào)用API列表查找MessageBoxA()或MessageBoxW(),即可快速查找到對MessageBox()的調(diào)用,從而找到main()函數(shù),如圖1-8所示。具體程序中使用的是MessageBoxA()還是MessageBoxW(),取決于編程時選擇的字符集是多字節(jié)字符集還是Unicode字符集。
圖1-8通過查找模塊間調(diào)用API的方式查找目標(biāo)程序片段
找到main()函數(shù)以后,就可以在逆向分析匯編程序的基礎(chǔ)上,對特定的指令或數(shù)據(jù)進(jìn)行修改了。第一個修改是:能否讓界面上“”和“HelloWorld!”兩個字符串的位置對調(diào)。一個簡單的做法是針對圖1-9(a)中對這兩個字符串壓棧的PUSH指令,將兩條指令的地址(013120F4H和01312108H)對調(diào),對調(diào)的結(jié)果如圖1-9(b)所示。對調(diào)完成后,通過點擊右鍵,選擇Copytoexecutablefile→Allmodifications,彈出十六進(jìn)制文件窗口,再在十六進(jìn)制文件窗口中通過點擊右鍵,選擇Savefile,保存為新的EXE文件。新的可執(zhí)行文件的運行效果如圖1-10所示。
(a)地址對調(diào)前
圖1-9通過對調(diào)PUSH指令中的字符串地址實現(xiàn)界面字符串的對調(diào)
(b)地址對調(diào)后
圖1-9通過對調(diào)PUSH指令中的字符串地址實現(xiàn)界面字符串的對調(diào)圖1-10字符串對調(diào)后程序的運行效果
第二個修改是:將原來HelloWorld.exe界面上的“HelloWorld!”字符串,改為“HelloStudents!”字符串。此時,首先要做的是找到字符串對應(yīng)的數(shù)據(jù)內(nèi)容并對其進(jìn)行修改。從指令中我們可以看出,“HelloWorld!”字符串在數(shù)據(jù)段的地址是01312108H,在數(shù)據(jù)窗口中利用快捷鍵Ctrl+G查找到該地址,可以看到字符串?dāng)?shù)據(jù)的內(nèi)容如圖1-11所示。
下面要做的就是編輯這段內(nèi)容,對選中的內(nèi)容使用快捷鍵Ctrl+E,打開編輯窗口,如圖1-12(a)所示,直接編輯其中的ASCII字符內(nèi)容,如圖1-12(b)所示(注:如果編程時使用的是
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 個人與公司租車合同模板大全
- ODM委托生產(chǎn)合同范本
- 個人承包農(nóng)田種植的合同范本
- 上海市股權(quán)轉(zhuǎn)讓合同樣本
- 交通運輸企業(yè)貸款合同書及細(xì)則
- 車輛運輸合同協(xié)議
- 采購服務(wù)合同范本
- 個人貨車租賃合同標(biāo)準(zhǔn)文本
- 鄉(xiāng)村民宿裝飾裝修合同
- 個人與企業(yè)借款合同
- 湖北省武漢市2024-2025學(xué)年度高三元月調(diào)考英語試題(含答案無聽力音頻有聽力原文)
- 商務(wù)星球版地理八年級下冊全冊教案
- 天津市河西區(qū)2024-2025學(xué)年四年級(上)期末語文試卷(含答案)
- 北京市北京四中2025屆高三第四次模擬考試英語試卷含解析
- 2024年快遞行業(yè)無人機物流運輸合同范本及法規(guī)遵循3篇
- 地下商業(yè)街的規(guī)劃設(shè)計
- 傷殘撫恤管理辦法實施細(xì)則
- 中國慢性冠脈綜合征患者診斷及管理指南2024版解讀
- 提升模組良率-六西格瑪
- DL-T+5196-2016火力發(fā)電廠石灰石-石膏濕法煙氣脫硫系統(tǒng)設(shè)計規(guī)程
- 2024-2030年中國產(chǎn)教融合行業(yè)市場運營態(tài)勢及發(fā)展前景研判報告
評論
0/150
提交評論