版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第第13章章 逆向工程逆向工程1. 逆向工程概述逆向工程概述2. 調(diào)試器和反匯編器調(diào)試器和反匯編器3. 逆向分析實(shí)例逆向分析實(shí)例4. 斷點(diǎn)斷點(diǎn)5. 專用工具專用工具逆向工程逆向工程逆向工程,Reverse Engineering, R.E.工程(Engineering):從原理到產(chǎn)品逆向工程的基本思想:從產(chǎn)品到原理(再到產(chǎn)品)軍事中的逆向工程USA, Boeing B-29USSR, TU-4軍事中的逆向工程前蘇聯(lián)SVD狙擊步槍國產(chǎn)79/85狙擊步槍軟件逆向工程 軟件逆向工程是通過反匯編和調(diào)試等手段,分析計(jì)算機(jī)程序的二進(jìn)制可執(zhí)行代碼從而獲得程序的算法細(xì)節(jié)和實(shí)現(xiàn)原理的技術(shù)。 研究對象:沒有公開源
2、代碼的計(jì)算機(jī)程序,主要是已經(jīng)經(jīng)過編譯的二進(jìn)制可執(zhí)行代碼(如Win32平臺上的PE文件,包括exe,dll等文件格式) 與開放源代碼的開源軟件不同,用戶無法修改已經(jīng)編譯成型的可執(zhí)行文件,或者無法獲知程序內(nèi)部的算法。 逆向工程類似于軟件工程中的“黑盒”測試。 需要借助跟蹤調(diào)試手段,從二進(jìn)制機(jī)器代碼開始分析程序。 工作過程與軟件工程相反,這就是“逆向工程”這個(gè)名詞中“逆向”的來源。軟件逆向工程逆向工程的主要應(yīng)用 軟件破解(cracking):破解軟件的版權(quán)保護(hù)措施,讓用戶不支付授權(quán)費(fèi)用就可以無限制使用軟件的全部功能; 病毒和惡意程序(malware)分析:分析病毒、惡意程序的傳播機(jī)制和危害并設(shè)計(jì)出解
3、決辦法; 系統(tǒng)漏洞分析:分析漏洞原理,設(shè)計(jì)補(bǔ)丁程序或者編寫利用程序(Exploit)。 分析不公開的文件格式、協(xié)議等; 分析Windows或Mac平臺上的硬件驅(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)用是軟件破解。 合法性至今存在很大爭議。Windows End-User License Agreement總結(jié) 逆向工程的分析方法是從一個(gè)已經(jīng)成型的產(chǎn)品開始逐步向下分解,以期最后在更高的層次上抽象出
4、產(chǎn)品的技術(shù)細(xì)節(jié)。目目 錄錄1. 逆向工程概述逆向工程概述2. 調(diào)試器和反匯編器調(diào)試器和反匯編器3. 逆向分析實(shí)例逆向分析實(shí)例4. 斷點(diǎn)斷點(diǎn)5. 專用工具專用工具調(diào)試器和反匯編器 逆向工程的研究對象:特定硬件平臺上的可執(zhí)行二進(jìn)制代碼 逆向工程的研究手段:跟蹤與調(diào)試 兩種關(guān)鍵工具:調(diào)試器和反匯編器調(diào)試器 調(diào)試器(Debugger):加載被調(diào)試的目標(biāo)程序(或進(jìn)程),并對它進(jìn)行動(dòng)態(tài)跟蹤和調(diào)試。 與源碼調(diào)試的區(qū)別:是對程序的二進(jìn)制可執(zhí)行代碼直接進(jìn)行調(diào)試。 各種語言開發(fā)環(huán)境中自帶的調(diào)試器功能有限,難以勝任逆向工程的需要。采用專門的調(diào)試器常用調(diào)試器 - SoftICE Ring 0級內(nèi)核調(diào)試器; 通過網(wǎng)絡(luò)進(jìn)
5、行遠(yuǎn)程調(diào)試 ; 支持單機(jī)的、源程序級的調(diào)試能力; 支持Windows NT/9x,功能強(qiáng)大;常用調(diào)試器 - OllyDBG OllyDBG(簡稱ODBG)工作在Ring3下,無需注冊免費(fèi)使用,最新版本是1.10。書中使用ODBG進(jìn)行實(shí)例講解。12341. 反匯編窗口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)試器中自帶簡單的反匯編引擎,但是這些反匯
6、編引擎功能有限,專業(yè)反匯編器可以更好的分析代碼。xor ebx, ebx0 x33,0 xDB匯編助記符二進(jìn)制代碼匯編反匯編反匯編器 IDA Pro IDA Pro (Interactive Disassembly Pro) 功能強(qiáng)大,能反匯編多種硬件平臺的指令集,配有眾多的反匯編選項(xiàng); 能根據(jù)目標(biāo)程序的編譯器識別出很多函數(shù)和參數(shù)甚至結(jié)構(gòu)體并且自動(dòng)標(biāo)注。 支持改名,內(nèi)建簡單調(diào)試器以及支持很多高級功能。反匯編器 W32DASM W32Dasm是一個(gè)輕量級的反匯編工具 對小型文件進(jìn)行反匯編時(shí)速度很快 它的優(yōu)點(diǎn)是使用方便容易上手,缺點(diǎn)是難以對大的文件進(jìn)行反編譯。目目 錄錄1. 逆向工程概述逆向工程概
7、述2. 調(diào)試器和反匯編器調(diào)試器和反匯編器3. 逆向分析實(shí)例逆向分析實(shí)例4. 斷點(diǎn)斷點(diǎn)5. 專用工具專用工具實(shí)例1 直接內(nèi)存查看Win32進(jìn)程內(nèi)存空間 當(dāng)進(jìn)程開始后,各種數(shù)據(jù)和資源會(huì)以一定結(jié)構(gòu)組織起來映射到主存。默認(rèn)情況下,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è)文本框,分別用于輸入用戶名和序列號這兩個(gè)注冊信息。在用戶名文本框中輸入用戶名newbie,下面隨便填入一
8、個(gè)注冊碼11223344,點(diǎn)擊check按鈕,crackme彈出一個(gè)對話框提示輸入的注冊碼錯(cuò)誤。 暫時(shí)關(guān)閉對話框。打開WinHEX,點(diǎn)擊工具欄上的Open RAM按鈕,彈出對話框選擇想要打開的進(jìn)程內(nèi)存。 選中Primary Memory后點(diǎn)擊OK打開BS.Crackme.2.exe的進(jìn)程內(nèi)存空間。實(shí)例1 cont.12crackme是特意選擇給出的特例,程序通過用戶名計(jì)算出注冊碼,然后直接用字符串比較函數(shù)明碼比較輸入的假注冊碼和真注冊碼是否一致,并且在比較后沒有及時(shí)清除內(nèi)存中暫時(shí)保存的真正的注冊碼。基于編程經(jīng)驗(yàn),真假注冊碼在內(nèi)存中的位置相距不遠(yuǎn),可以嘗試搜索內(nèi)存中的“假注冊碼”,并在周圍尋找正
9、確結(jié)果。按Ctrl+F打開文本搜索對話框,填入11223344并且選擇ANSI編碼在內(nèi)存盡心查找定位。實(shí)例1 cont.“11223344” 在內(nèi)存中一共出現(xiàn)了兩次,在第二次的內(nèi)存附近可以看到輸入的用戶名和假注冊碼,在假注冊碼的下面是一串?dāng)?shù)字,猜測是正確注冊碼。將這個(gè)字符串填進(jìn)crackme的主界面,點(diǎn)擊check按鈕顯示注冊成功。實(shí)例1 cont. 這個(gè)crackme是特意選擇的例子,僅僅為了說明問題,并不具有普遍適用性。 用查看內(nèi)存的方法之所以能夠起作用,根本原因還是程序中計(jì)算注冊碼后使用了明文字符串比較,并且沒有及時(shí)清除內(nèi)存中的敏感信息。實(shí)例1 cont.實(shí)例2 實(shí)例2的仍然使用實(shí)例1的
10、BS.Crackme.2.exe 利用調(diào)試器根據(jù)注冊信息找到注冊碼計(jì)算的代碼,并且通過跟蹤計(jì)算過程逆向出注冊碼的計(jì)算過程。 Crackme的注冊流程:填入注冊信息后計(jì)算出正確的注冊碼并與從用戶界面上輸入的注冊碼進(jìn)行比較;結(jié)果正確則彈出對話框提示注冊成功,反之提示失敗。 從編程角度來說,一般會(huì)在校驗(yàn)過后在用戶界面上或者用彈出對話框的形式給用戶是否已經(jīng)注冊成功的提示,用于提示的代碼應(yīng)該距離注冊碼校驗(yàn)的地方不遠(yuǎn) 可以通過觀察程序的提示信息(或者其他注冊成功的表現(xiàn))來定位計(jì)算和校驗(yàn)注冊碼的關(guān)鍵代碼??梢岳锰崾咀址鳛榍腥朦c(diǎn)來完成逆向工程的任務(wù)。ODBG有一個(gè)強(qiáng)大的字符串引用查找插件Ultra St
11、ring Reference,可以在程序中搜索ASCII和Unicode編碼的字符串。在反匯編窗口中點(diǎn)擊右鍵,在選項(xiàng)菜單中可以看到有Ultra String Reference的選項(xiàng),選擇第一項(xiàng)Find ASCII。搜索完畢后ODBG會(huì)顯示搜索結(jié)果,可以看到注冊成功時(shí)顯示的“correct way to go, you got it.”。實(shí)例2實(shí)例2在該字符串上雙擊,ODBG就會(huì)自動(dòng)跳轉(zhuǎn)到對該字符串引用的反匯編代碼處。向上卷動(dòng)一些代碼鼠標(biāo)點(diǎn)擊0 x00401542這行代碼使之高亮顯示,按F2鍵在這里設(shè)置斷點(diǎn),然后按F9讓程序運(yùn)行起來,切換到crackme的界面。填入用戶名和注冊碼點(diǎn)擊check
12、按鈕以后ODBG捕捉到斷點(diǎn),程序被中斷,ODBG自動(dòng)激活,并且eip就停在斷點(diǎn)地址0 x00401542上。這時(shí)就可以用調(diào)試器來跟蹤程序。單步運(yùn)行,觀察堆棧和內(nèi)存數(shù)據(jù),可以了解注冊流程。函數(shù)在開始處定義了3個(gè)CString類型的字符串,分別用于存放用戶名、用戶輸入的注冊碼和由程序計(jì)算的真正注冊碼。實(shí)例2點(diǎn)擊check按鈕后,函數(shù)調(diào)用CWnd:GetDlgItemText()函數(shù)取得用戶界面上文本框控件里用戶輸入的內(nèi)容。函數(shù)用一個(gè)循環(huán)來根據(jù)用戶名計(jì)算注冊碼,結(jié)果放在一個(gè)無符號整型變量uRegCode中;在完成計(jì)算后,將調(diào)用CString:Format()函數(shù)將這個(gè)無符號整型值格式化輸出到strC
13、ode中(CString類型)。在進(jìn)入循環(huán)之前,uRegCode變量已經(jīng)有了一個(gè)初值0 x81276345用于計(jì)算注冊碼。每次從注冊用戶名中取出一個(gè)字符,將其加到uRegCode上,然后異或uRegCode和i左移8位的值(i在這里是循環(huán)控制變量),接著計(jì)算用戶名長度uLen和i的乘積并對結(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中的正確注冊碼被放入eax
14、寄存器中并作為CString:Format()的參數(shù)壓棧,最后調(diào)用CString:Format()將這個(gè)值格式化輸出到strCode中,并與通過CWnd:GetDlgItemText()取得的用戶輸入的注冊碼進(jìn)行比較。也可以在CString:Format()這里下個(gè)斷點(diǎn)觀察內(nèi)存驗(yàn)證結(jié)果。分析出了注冊算法,可以為這個(gè)crackme編寫一個(gè)簡單的算法注冊機(jī)(也稱keygen,Key Generator)。實(shí)例2或者可以通過修改代碼來完成,就是使用在解密技術(shù)上稱為“爆破”的方法實(shí)現(xiàn)。在0 x40163B處函數(shù)調(diào)用一個(gè)子函數(shù)進(jìn)行字符串比較,返回的結(jié)果放在eax中,然后用test指令測試eax中的值是否
15、為0,并根據(jù)結(jié)果用一個(gè)跳轉(zhuǎn)來實(shí)現(xiàn)程序流程的控制。修改“關(guān)鍵跳轉(zhuǎn)”的跳轉(zhuǎn)條件。實(shí)例2這里要用到ODBG的匯編功能,所謂匯編就是從指定的地址開始寫入我們自己的代碼。 在jnz這條代碼上雙擊,或者按空格鍵,將彈出一個(gè)匯編窗口,這樣就可以開始匯編了。修改代碼有一個(gè)原則,就是修改后的代碼字節(jié)數(shù)必須少于或者等于被修改的那條指令代碼的長度,否則匯編后會(huì)影響到后面我們不想改變的代碼。( 80X86指令集各條指令的長度是不一樣的 ,匯編前后字節(jié)數(shù)必須一樣)可以有兩個(gè)方法:第一,把jnz改成jz,改換跳轉(zhuǎn)實(shí)現(xiàn)的條件;第二,把這條跳轉(zhuǎn)指令全部修改為nop。實(shí)例2目目 錄錄1. 逆向工程概述逆向工程概述2. 調(diào)試器和
16、反匯編器調(diào)試器和反匯編器3. 逆向分析實(shí)例逆向分析實(shí)例4. 斷點(diǎn)斷點(diǎn)5. 專用工具專用工具斷點(diǎn)概念高級語言編寫的源代碼經(jīng)過編譯連接之后生成的目標(biāo)代碼數(shù)量巨大,在海量的代碼中我們關(guān)心的關(guān)鍵代碼往往只占很小一部分,而且在通常的情況下無法確知這些代碼的位置。斷點(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)之后,就能對進(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)。例如要在程序中獲得對話框中一個(gè)文本框中用戶輸入的文本,就會(huì)用到GetWindowTex
17、t()函數(shù)。如果對MessageBox()函數(shù)下斷點(diǎn),每當(dāng)程序運(yùn)行到調(diào)用MessageBox()函數(shù)的地方就會(huì)被調(diào)試器中斷。 實(shí)例3 實(shí)例是PhoxCM3.EXE,該程序采用序列號保護(hù)機(jī)制,逆向的目標(biāo)是找出序列號。 運(yùn)行一下目標(biāo)程序, 隨便輸入一個(gè)序列號,軟件檢測序列號錯(cuò)誤以后彈出對話框提示“Wrong Code!”。實(shí)例3在反匯編窗口的右鍵菜單里找到“查找”選項(xiàng),在彈出的子菜單中選擇“當(dāng)前模塊中的名稱”,ODBG自動(dòng)搜索程序中調(diào)用的函數(shù),并將它們在窗口中列出??梢钥吹酱翱谥袕腢ser32.dll中輸入的GetWindowTextA() 函數(shù),在上面點(diǎn)擊右鍵,選擇“在每個(gè)參考上設(shè)置斷點(diǎn)”,OD
18、BG會(huì)給程序中所有引用到GetWindowTextA() 函數(shù)的地方加上斷點(diǎn)。實(shí)例3斷點(diǎn)設(shè)置好之后,按F9讓程序運(yùn)行起來。在界面上的文本框中輸入注冊碼,點(diǎn)擊OK按鈕之后程序執(zhí)行到GetWindowTextA()函數(shù)就會(huì)被中斷下來。GetWindowTextA() 函數(shù)執(zhí)行完成后,將緩沖區(qū)的首地址存入ebx寄存器,然后調(diào)用了GetWindowTextLengthA()函數(shù)取得用戶輸入的注冊碼長度并比較注冊碼長度是否等于12H。如果長度不符合就從0 x4011BB處跳走,調(diào)用MessageBox()提示注冊失敗。實(shí)例3再向下看代碼,發(fā)現(xiàn)程序連續(xù)對存放注冊碼的字符數(shù)組中的一組字符做比較,如果都等于預(yù)
19、先設(shè)定的值,則注冊成功。所以正確的注冊碼長度應(yīng)該為18位,形式應(yīng)該為FiXreXWorXxXSuXXxX,其中大寫X的位置可以用任意字符替換。目目 錄錄1. 逆向工程概述逆向工程概述2. 調(diào)試器和反匯編器調(diào)試器和反匯編器3. 逆向分析實(shí)例逆向分析實(shí)例4. 斷點(diǎn)斷點(diǎn)5. 專用工具專用工具專用工具 目前Windows操作系統(tǒng)上有多種語言開發(fā)平臺,每種語言的編譯器在編譯源代碼生成Win32平臺上的可執(zhí)行程序時(shí)都有各自不同的特點(diǎn)。根據(jù)這些特點(diǎn),可以針對各種編譯器編譯的程序使用不同的專用工具,方便我們的逆向分析。例如由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信息查看工具有
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 張桂梅先進(jìn)事跡學(xué)習(xí)教育心得體會(huì)
- 百日行動(dòng)工作總結(jié)(多篇)
- 大學(xué)學(xué)生實(shí)習(xí)報(bào)告范文(合集15篇)
- 貴州xx棚戶區(qū)改造項(xiàng)目可行性研究報(bào)告
- 城市更新項(xiàng)目立項(xiàng)報(bào)告
- 個(gè)人辭職申請書
- 土力學(xué)復(fù)習(xí)測試卷
- 感謝信范文(15篇)
- 學(xué)校領(lǐng)導(dǎo)的辭職報(bào)告范文合集9篇
- 廣東xx產(chǎn)業(yè)園基礎(chǔ)設(shè)施項(xiàng)目可行性研究報(bào)告
- 國語經(jīng)典歌曲歌詞接龍考試題庫(180題)
- 西安東原地產(chǎn)品牌年度推廣方案
- 2022年7月云南省普通高中學(xué)業(yè)水平考試物理含答案
- 走進(jìn)范仲淹課件
- 2023-2024學(xué)年江蘇省吳江市小學(xué)語文五年級上冊期末高分測試題
- GB/T 4852-2002壓敏膠粘帶初粘性試驗(yàn)方法(滾球法)
- GB/T 20641-2006低壓成套開關(guān)設(shè)備和控制設(shè)備空殼體的一般要求
- 醫(yī)院固定資產(chǎn)及物資購置工作流程圖
- 中學(xué)學(xué)校辦公室主任個(gè)人述職報(bào)告
- 骨科圍手術(shù)期的護(hù)理-課件
- 檢驗(yàn)危急值在急危重癥病人的臨床應(yīng)用課件
評論
0/150
提交評論