《軟件逆向分析》PPT課件.ppt_第1頁
《軟件逆向分析》PPT課件.ppt_第2頁
《軟件逆向分析》PPT課件.ppt_第3頁
《軟件逆向分析》PPT課件.ppt_第4頁
《軟件逆向分析》PPT課件.ppt_第5頁
已閱讀5頁,還剩41頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、逆向分析,逆向工程概述 調(diào)試器和反匯編器 逆向分析實(shí)例 斷點(diǎn) 專用工具,逆向工程,逆向工程,Reverse Engineering, R.E. 工程(Engineering):從原理到產(chǎn)品 逆向工程的基本思想:從產(chǎn)品到原理(再到產(chǎn)品,軍事中的逆向工程,USA, Boeing B-29,USSR, TU-4,軍事中的逆向工程,前蘇聯(lián)SVD狙擊步槍,國(guó)產(chǎn)79/85狙擊步槍,軟件逆向工程,軟件逆向工程是通過反匯編和調(diào)試等手段,分析計(jì)算機(jī)程序的二進(jìn)制可執(zhí)行代碼從而獲得程序的算法細(xì)節(jié)和實(shí)現(xiàn)原理的技術(shù)。 研究對(duì)象:沒有公開源代碼的計(jì)算機(jī)程序,主要是已經(jīng)經(jīng)過編譯的二進(jìn)制可執(zhí)行代碼(如Win32平臺(tái)上的PE文

2、件,包括exe,dll等文件格式,與開放源代碼的開源軟件不同,用戶無法修改已經(jīng)編譯成型的可執(zhí)行文件,或者無法獲知程序內(nèi)部的算法。 逆向工程類似于軟件工程中的“黑盒”測(cè)試。 需要借助跟蹤調(diào)試手段,從二進(jìn)制機(jī)器代碼開始分析程序。 工作過程與軟件工程相反,這就是“逆向工程”這個(gè)名詞中“逆向”的來源,軟件逆向工程,逆向工程的主要應(yīng)用,軟件破解(cracking):破解軟件的版權(quán)保護(hù)措施,讓用戶不支付授權(quán)費(fèi)用就可以無限制使用軟件的全部功能; 病毒和惡意程序(malware)分析:分析病毒、惡意程序的傳播機(jī)制和危害并設(shè)計(jì)出解決辦法; 系統(tǒng)漏洞分析:分析漏洞原理,設(shè)計(jì)補(bǔ)丁程序或者編寫利用程序(Exploit

3、,分析不公開的文件格式、協(xié)議等; 分析Windows或Mac平臺(tái)上的硬件驅(qū)動(dòng)程序,編寫linux下的相應(yīng)驅(qū)動(dòng); 挖掘消費(fèi)電子產(chǎn)品的潛能; 挖掘操作系統(tǒng)未文檔化的API,發(fā)現(xiàn)更多系統(tǒng)內(nèi)幕; 計(jì)算機(jī)犯罪取證,逆向工程的其他應(yīng)用,逆向工程的歷史,最早出現(xiàn)在20世紀(jì)80年代,APPLEII主機(jī)上的游戲破解。 逆向工程最早的應(yīng)用是軟件破解。 合法性至今存在很大爭(zhēng)議,Windows End-User License Agreement,總結(jié),逆向工程的分析方法是從一個(gè)已經(jīng)成型的產(chǎn)品開始逐步向下分解,以期最后在更高的層次上抽象出產(chǎn)品的技術(shù)細(xì)節(jié),目 錄,逆向工程概述 調(diào)試器和反匯編器 逆向分析實(shí)例 斷點(diǎn) 專用

4、工具,調(diào)試器和反匯編器,逆向工程的研究對(duì)象:特定硬件平臺(tái)上的可執(zhí)行二進(jìn)制代碼 逆向工程的研究手段:跟蹤與調(diào)試 兩種關(guān)鍵工具:調(diào)試器和反匯編器,調(diào)試器,調(diào)試器(Debugger):加載被調(diào)試的目標(biāo)程序(或進(jìn)程),并對(duì)它進(jìn)行動(dòng)態(tài)跟蹤和調(diào)試。 與源碼調(diào)試的區(qū)別:是對(duì)程序的二進(jìn)制可執(zhí)行代碼直接進(jìn)行調(diào)試。 各種語言開發(fā)環(huán)境中自帶的調(diào)試器功能有限,難以勝任逆向工程的需要。采用專門的調(diào)試器,常用調(diào)試器 - SoftICE,Ring 0級(jí)內(nèi)核調(diào)試器; 通過網(wǎng)絡(luò)進(jìn)行遠(yuǎn)程調(diào)試 ; 支持單機(jī)的、源程序級(jí)的調(diào)試能力; 支持Windows NT/9x,功能強(qiáng)大,常用調(diào)試器 - OllyDBG,OllyDBG(簡(jiǎn)稱ODB

5、G)工作在Ring3下,無需注冊(cè)免費(fèi)使用,最新版本是1.10。書中使用ODBG進(jìn)行實(shí)例講解,1,2,3,4,反匯編窗口 寄存器窗口 堆棧窗口 轉(zhuǎn)存(dump)窗口,常用調(diào)試器 - WinDBG,WinDBG是微軟出品的調(diào)試器,可以用于源代碼調(diào)試和系統(tǒng)內(nèi)核調(diào)試,還能分析dump文件,和Windows結(jié)合緊密。WinDBG是基于命令使用的調(diào)試器,反匯編器,反匯編的概念:把二進(jìn)制代碼翻譯成匯編助記符。 調(diào)試器中自帶簡(jiǎn)單的反匯編引擎,但是這些反匯編引擎功能有限,專業(yè)反匯編器可以更好的分析代碼,xor ebx, ebx,0 x33,0 xDB,匯編助記符,二進(jìn)制代碼,匯編,反匯編,反匯編器 IDA Pr

6、o,IDA Pro (Interactive Disassembly Pro) 功能強(qiáng)大,能反匯編多種硬件平臺(tái)的指令集,配有眾多的反匯編選項(xiàng); 能根據(jù)目標(biāo)程序的編譯器識(shí)別出很多函數(shù)和參數(shù)甚至結(jié)構(gòu)體并且自動(dòng)標(biāo)注。 支持改名,內(nèi)建簡(jiǎn)單調(diào)試器以及支持很多高級(jí)功能,反匯編器 W32DASM,W32Dasm是一個(gè)輕量級(jí)的反匯編工具 對(duì)小型文件進(jìn)行反匯編時(shí)速度很快 它的優(yōu)點(diǎn)是使用方便容易上手,缺點(diǎn)是難以對(duì)大的文件進(jìn)行反編譯,目 錄,逆向工程概述 調(diào)試器和反匯編器 逆向分析實(shí)例 斷點(diǎn) 專用工具,實(shí)例1 直接內(nèi)存查看,Win32進(jìn)程內(nèi)存空間 當(dāng)進(jìn)程開始后,各種數(shù)據(jù)和資源會(huì)以一定結(jié)構(gòu)組織起來映射到主存。默認(rèn)情況

7、下,Win32系統(tǒng)上每個(gè)用戶進(jìn)程可以占有2GB的私有地址空間,操作系統(tǒng)占有剩下的2GB地址空間。 進(jìn)程的代碼和各種資源都會(huì)在進(jìn)程內(nèi)存空間里出現(xiàn),可以用內(nèi)存查看工具查看進(jìn)程內(nèi)存以獲取一些信息例如字符串等,實(shí)例1 cont,運(yùn)行目標(biāo)程序BS.Crackme.2.exe 主窗口上有兩個(gè)文本框,分別用于輸入用戶名和序列號(hào)這兩個(gè)注冊(cè)信息。在用戶名文本框中輸入用戶名newbie,下面隨便填入一個(gè)注冊(cè)碼11223344,點(diǎn)擊check按鈕,crackme彈出一個(gè)對(duì)話框提示輸入的注冊(cè)碼錯(cuò)誤,暫時(shí)關(guān)閉對(duì)話框。打開WinHEX,點(diǎn)擊工具欄上的Open RAM按鈕,彈出對(duì)話框選擇想要打開的進(jìn)程內(nèi)存。 選中Prima

8、ry Memory后點(diǎn)擊OK打開BS.Crackme.2.exe的進(jìn)程內(nèi)存空間,實(shí)例1 cont,1,2,crackme是特意選擇給出的特例,程序通過用戶名計(jì)算出注冊(cè)碼,然后直接用字符串比較函數(shù)明碼比較輸入的假注冊(cè)碼和真注冊(cè)碼是否一致,并且在比較后沒有及時(shí)清除內(nèi)存中暫時(shí)保存的真正的注冊(cè)碼。 基于編程經(jīng)驗(yàn),真假注冊(cè)碼在內(nèi)存中的位置相距不遠(yuǎn),可以嘗試搜索內(nèi)存中的“假注冊(cè)碼”,并在周圍尋找正確結(jié)果。 按Ctrl+F打開文本搜索對(duì)話框,填入11223344并且選擇ANSI編碼在內(nèi)存盡心查找定位,實(shí)例1 cont,11223344” 在內(nèi)存中一共出現(xiàn)了兩次,在第二次的內(nèi)存附近可以看到輸入的用戶名和假注冊(cè)

9、碼,在假注冊(cè)碼的下面是一串?dāng)?shù)字,猜測(cè)是正確注冊(cè)碼。 將這個(gè)字符串填進(jìn)crackme的主界面,點(diǎn)擊check按鈕顯示注冊(cè)成功,實(shí)例1 cont,這個(gè)crackme是特意選擇的例子,僅僅為了說明問題,并不具有普遍適用性。 用查看內(nèi)存的方法之所以能夠起作用,根本原因還是程序中計(jì)算注冊(cè)碼后使用了明文字符串比較,并且沒有及時(shí)清除內(nèi)存中的敏感信息,實(shí)例1 cont,實(shí)例2,實(shí)例2的仍然使用實(shí)例1的BS.Crackme.2.exe 利用調(diào)試器根據(jù)注冊(cè)信息找到注冊(cè)碼計(jì)算的代碼,并且通過跟蹤計(jì)算過程逆向出注冊(cè)碼的計(jì)算過程。 Crackme的注冊(cè)流程:填入注冊(cè)信息后計(jì)算出正確的注冊(cè)碼并與從用戶界面上輸入的注冊(cè)碼進(jìn)

10、行比較;結(jié)果正確則彈出對(duì)話框提示注冊(cè)成功,反之提示失敗。 從編程角度來說,一般會(huì)在校驗(yàn)過后在用戶界面上或者用彈出對(duì)話框的形式給用戶是否已經(jīng)注冊(cè)成功的提示,用于提示的代碼應(yīng)該距離注冊(cè)碼校驗(yàn)的地方不遠(yuǎn) 可以通過觀察程序的提示信息(或者其他注冊(cè)成功的表現(xiàn))來定位計(jì)算和校驗(yàn)注冊(cè)碼的關(guān)鍵代碼,可以利用提示字符串作為切入點(diǎn)來完成逆向工程的任務(wù)。 ODBG有一個(gè)強(qiáng)大的字符串引用查找插件Ultra String Reference,可以在程序中搜索ASCII和Unicode編碼的字符串。 在反匯編窗口中點(diǎn)擊右鍵,在選項(xiàng)菜單中可以看到有Ultra String Reference的選項(xiàng),選擇第一項(xiàng)Find AS

11、CII。 搜索完畢后ODBG會(huì)顯示搜索結(jié)果,可以看到注冊(cè)成功時(shí)顯示的“correct way to go, you got it.,實(shí)例2,實(shí)例2,在該字符串上雙擊,ODBG就會(huì)自動(dòng)跳轉(zhuǎn)到對(duì)該字符串引用的反匯編代碼處。 向上卷動(dòng)一些代碼,鼠標(biāo)點(diǎn)擊0 x00401542這行代碼使之高亮顯示,按F2鍵在這里設(shè)置斷點(diǎn),然后按F9讓程序運(yùn)行起來,切換到crackme的界面。 填入用戶名和注冊(cè)碼點(diǎn)擊check按鈕以后ODBG捕捉到斷點(diǎn),程序被中斷,ODBG自動(dòng)激活,并且eip就停在斷點(diǎn)地址0 x00401542上。這時(shí)就可以用調(diào)試器來跟蹤程序。單步運(yùn)行,觀察堆棧和內(nèi)存數(shù)據(jù),可以了解注冊(cè)流程。 函數(shù)在開始

12、處定義了3個(gè)CString類型的字符串,分別用于存放用戶名、用戶輸入的注冊(cè)碼和由程序計(jì)算的真正注冊(cè)碼,實(shí)例2,點(diǎn)擊check按鈕后,函數(shù)調(diào)用CWnd:GetDlgItemText()函數(shù)取得用戶界面上文本框控件里用戶輸入的內(nèi)容。 函數(shù)用一個(gè)循環(huán)來根據(jù)用戶名計(jì)算注冊(cè)碼,結(jié)果放在一個(gè)無符號(hào)整型變量uRegCode中; 在完成計(jì)算后,將調(diào)用CString:Format()函數(shù)將這個(gè)無符號(hào)整型值格式化輸出到strCode中(CString類型)。 在進(jìn)入循環(huán)之前,uRegCode變量已經(jīng)有了一個(gè)初值0 x81276345用于計(jì)算注冊(cè)碼。 每次從注冊(cè)用戶名中取出一個(gè)字符,將其加到uRegCode上,然后

13、異或uRegCode和i左移8位的值(i在這里是循環(huán)控制變量),接著計(jì)算用戶名長(zhǎng)度uLen和i的乘積并對(duì)結(jié)果取反再與i+1相乘,實(shí)例2,計(jì)算過程可以用下面的程序來表達(dá): for(i = 0; i uLen; i+) uRegCode = (uRegCode + strUserNamei) (i 8) * (i + 1) * (uLen * i); 在計(jì)算過程結(jié)束之后,存放在uRegCode中的正確注冊(cè)碼被放入eax寄存器中并作為CString:Format()的參數(shù)壓棧,最后調(diào)用CString:Format()將這個(gè)值格式化輸出到strCode中,并與通過CWnd:GetDlgItemText

14、()取得的用戶輸入的注冊(cè)碼進(jìn)行比較。 也可以在CString:Format()這里下個(gè)斷點(diǎn)觀察內(nèi)存驗(yàn)證結(jié)果。 分析出了注冊(cè)算法,可以為這個(gè)crackme編寫一個(gè)簡(jiǎn)單的算法注冊(cè)機(jī)(也稱keygen,Key Generator,實(shí)例2,或者可以通過修改代碼來完成,就是使用在解密技術(shù)上稱為“爆破”的方法實(shí)現(xiàn)。 在0 x40163B處函數(shù)調(diào)用一個(gè)子函數(shù)進(jìn)行字符串比較,返回的結(jié)果放在eax中,然后用test指令測(cè)試eax中的值是否為0,并根據(jù)結(jié)果用一個(gè)跳轉(zhuǎn)來實(shí)現(xiàn)程序流程的控制。 修改“關(guān)鍵跳轉(zhuǎn)”的跳轉(zhuǎn)條件,實(shí)例2,這里要用到ODBG的匯編功能,所謂匯編就是從指定的地址開始寫入我們自己的代碼。 在jnz這

15、條代碼上雙擊,或者按空格鍵,將彈出一個(gè)匯編窗口,這樣就可以開始匯編了。 修改代碼有一個(gè)原則,就是修改后的代碼字節(jié)數(shù)必須少于或者等于被修改的那條指令代碼的長(zhǎng)度,否則匯編后會(huì)影響到后面我們不想改變的代碼。( 80X86指令集各條指令的長(zhǎng)度是不一樣的 ,匯編前后字節(jié)數(shù)必須一樣) 可以有兩個(gè)方法:第一,把jnz改成jz,改換跳轉(zhuǎn)實(shí)現(xiàn)的條件;第二,把這條跳轉(zhuǎn)指令全部修改為nop,實(shí)例2,目 錄,逆向工程概述 調(diào)試器和反匯編器 逆向分析實(shí)例 斷點(diǎn) 專用工具,斷點(diǎn)概念,高級(jí)語言編寫的源代碼經(jīng)過編譯連接之后生成的目標(biāo)代碼數(shù)量巨大,在海量的代碼中我們關(guān)心的關(guān)鍵代碼往往只占很小一部分,而且在通常的情況下無法確知這

16、些代碼的位置。 斷點(diǎn)的作用就是在恰當(dāng)?shù)臅r(shí)機(jī)中斷正在被調(diào)試的進(jìn)程的執(zhí)行,并把進(jìn)程的控制權(quán)交給調(diào)試器,調(diào)試器接管進(jìn)程的控制權(quán)之后,就能對(duì)進(jìn)程進(jìn)行跟蹤調(diào)試。 斷點(diǎn)有很多種類型,如:函數(shù)執(zhí)行斷點(diǎn),各種內(nèi)存訪問斷點(diǎn),IO端口讀寫斷點(diǎn),中斷向量斷點(diǎn),消息斷點(diǎn)等。其中最為常用的是函數(shù)執(zhí)行斷點(diǎn)。 例如要在程序中獲得對(duì)話框中一個(gè)文本框中用戶輸入的文本,就會(huì)用到GetWindowText()函數(shù)。如果對(duì)MessageBox()函數(shù)下斷點(diǎn),每當(dāng)程序運(yùn)行到調(diào)用MessageBox()函數(shù)的地方就會(huì)被調(diào)試器中斷,實(shí)例3,實(shí)例是PhoxCM3.EXE,該程序采用序列號(hào)保護(hù)機(jī)制,逆向的目標(biāo)是找出序列號(hào)。 運(yùn)行一下目標(biāo)程序,

17、隨便輸入一個(gè)序列號(hào),軟件檢測(cè)序列號(hào)錯(cuò)誤以后彈出對(duì)話框提示“Wrong Code,實(shí)例3,在反匯編窗口的右鍵菜單里找到“查找”選項(xiàng),在彈出的子菜單中選擇“當(dāng)前模塊中的名稱”,ODBG自動(dòng)搜索程序中調(diào)用的函數(shù),并將它們?cè)诖翱谥辛谐觥?可以看到窗口中從User32.dll中輸入的GetWindowTextA() 函數(shù),在上面點(diǎn)擊右鍵,選擇“在每個(gè)參考上設(shè)置斷點(diǎn)”,ODBG會(huì)給程序中所有引用到GetWindowTextA() 函數(shù)的地方加上斷點(diǎn),實(shí)例3,斷點(diǎn)設(shè)置好之后,按F9讓程序運(yùn)行起來。在界面上的文本框中輸入注冊(cè)碼,點(diǎn)擊OK按鈕之后程序執(zhí)行到GetWindowTextA()函數(shù)就會(huì)被中斷下來。 G

18、etWindowTextA() 函數(shù)執(zhí)行完成后,將緩沖區(qū)的首地址存入ebx寄存器,然后調(diào)用了GetWindowTextLengthA()函數(shù)取得用戶輸入的注冊(cè)碼長(zhǎng)度并比較注冊(cè)碼長(zhǎng)度是否等于12H。如果長(zhǎng)度不符合就從0 x4011BB處跳走,調(diào)用MessageBox()提示注冊(cè)失敗,實(shí)例3,再向下看代碼,發(fā)現(xiàn)程序連續(xù)對(duì)存放注冊(cè)碼的字符數(shù)組中的一組字符做比較,如果都等于預(yù)先設(shè)定的值,則注冊(cè)成功。所以正確的注冊(cè)碼長(zhǎng)度應(yīng)該為18位,形式應(yīng)該為FiXreXWorXxXSuXXxX,其中大寫X的位置可以用任意字符替換,目 錄,逆向工程概述 調(diào)試器和反匯編器 逆向分析實(shí)例 斷點(diǎn) 專用工具,專用工具,目前Wi

19、ndows操作系統(tǒng)上有多種語言開發(fā)平臺(tái),每種語言的編譯器在編譯源代碼生成Win32平臺(tái)上的可執(zhí)行程序時(shí)都有各自不同的特點(diǎn)。根據(jù)這些特點(diǎn),可以針對(duì)各種編譯器編譯的程序使用不同的專用工具,方便我們的逆向分析。 例如由Visual FoxPro,Java開發(fā)的程序可以直接通過專用反編譯工具反編譯到源代碼;部分的.Net程序可以通過Reflector反編譯到源代碼;Delphi開發(fā)的程序可以在調(diào)試之前首先使用DEDE分析;VB編譯的軟件可以用專用的WKT調(diào)試器進(jìn)行P-Code的調(diào)試等等。 前面沒有提及該工具,適當(dāng)介紹,PE信息查看工具PEiD,一般直接反匯編或者用調(diào)試器調(diào)試之前我們通常都會(huì)先用一些PE文件查看工具先期獲取一些PE文件的信息,如程序使用什么編譯器編譯的,查看區(qū)段,是否已經(jīng)被加殼等。 PE信息查看工具有很多種,比如PE-Scan,PEiD,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論