信息與網絡安全教學課件作者程光第13章逆向工程_第1頁
信息與網絡安全教學課件作者程光第13章逆向工程_第2頁
信息與網絡安全教學課件作者程光第13章逆向工程_第3頁
信息與網絡安全教學課件作者程光第13章逆向工程_第4頁
信息與網絡安全教學課件作者程光第13章逆向工程_第5頁
已閱讀5頁,還剩41頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第第13章章 逆向工程逆向工程1. 逆向工程概述逆向工程概述2. 調試器和反匯編器調試器和反匯編器3. 逆向分析實例逆向分析實例4. 斷點斷點5. 專用工具專用工具逆向工程逆向工程逆向工程,Reverse Engineering, R.E.工程(Engineering):從原理到產品逆向工程的基本思想:從產品到原理(再到產品)軍事中的逆向工程USA, Boeing B-29USSR, TU-4軍事中的逆向工程前蘇聯SVD狙擊步槍國產79/85狙擊步槍軟件逆向工程 軟件逆向工程是通過反匯編和調試等手段,分析計算機程序的二進制可執(zhí)行代碼從而獲得程序的算法細節(jié)和實現原理的技術。 研究對象:沒有公開源

2、代碼的計算機程序,主要是已經經過編譯的二進制可執(zhí)行代碼(如Win32平臺上的PE文件,包括exe,dll等文件格式) 與開放源代碼的開源軟件不同,用戶無法修改已經編譯成型的可執(zhí)行文件,或者無法獲知程序內部的算法。 逆向工程類似于軟件工程中的“黑盒”測試。 需要借助跟蹤調試手段,從二進制機器代碼開始分析程序。 工作過程與軟件工程相反,這就是“逆向工程”這個名詞中“逆向”的來源。軟件逆向工程逆向工程的主要應用 軟件破解(cracking):破解軟件的版權保護措施,讓用戶不支付授權費用就可以無限制使用軟件的全部功能; 病毒和惡意程序(malware)分析:分析病毒、惡意程序的傳播機制和危害并設計出解

3、決辦法; 系統漏洞分析:分析漏洞原理,設計補丁程序或者編寫利用程序(Exploit)。 分析不公開的文件格式、協議等; 分析Windows或Mac平臺上的硬件驅動程序,編寫linux下的相應驅動; 挖掘消費電子產品的潛能; 挖掘操作系統未文檔化的API,發(fā)現更多系統內幕; 計算機犯罪取證逆向工程的其他應用逆向工程的歷史 最早出現在20世紀80年代,APPLEII主機上的游戲破解。 逆向工程最早的應用是軟件破解。 合法性至今存在很大爭議。Windows End-User License Agreement總結 逆向工程的分析方法是從一個已經成型的產品開始逐步向下分解,以期最后在更高的層次上抽象出

4、產品的技術細節(jié)。目目 錄錄1. 逆向工程概述逆向工程概述2. 調試器和反匯編器調試器和反匯編器3. 逆向分析實例逆向分析實例4. 斷點斷點5. 專用工具專用工具調試器和反匯編器 逆向工程的研究對象:特定硬件平臺上的可執(zhí)行二進制代碼 逆向工程的研究手段:跟蹤與調試 兩種關鍵工具:調試器和反匯編器調試器 調試器(Debugger):加載被調試的目標程序(或進程),并對它進行動態(tài)跟蹤和調試。 與源碼調試的區(qū)別:是對程序的二進制可執(zhí)行代碼直接進行調試。 各種語言開發(fā)環(huán)境中自帶的調試器功能有限,難以勝任逆向工程的需要。采用專門的調試器常用調試器 - SoftICE Ring 0級內核調試器; 通過網絡進

5、行遠程調試 ; 支持單機的、源程序級的調試能力; 支持Windows NT/9x,功能強大;常用調試器 - OllyDBG OllyDBG(簡稱ODBG)工作在Ring3下,無需注冊免費使用,最新版本是1.10。書中使用ODBG進行實例講解。12341. 反匯編窗口2. 寄存器窗口3. 堆棧窗口4. 轉存(dump)窗口常用調試器 - WinDBG WinDBG是微軟出品的調試器,可以用于源代碼調試和系統內核調試,還能分析dump文件,和Windows結合緊密。WinDBG是基于命令使用的調試器。反匯編器 反匯編的概念:把二進制代碼翻譯成匯編助記符。 調試器中自帶簡單的反匯編引擎,但是這些反匯

6、編引擎功能有限,專業(yè)反匯編器可以更好的分析代碼。xor ebx, ebx0 x33,0 xDB匯編助記符二進制代碼匯編反匯編反匯編器 IDA Pro IDA Pro (Interactive Disassembly Pro) 功能強大,能反匯編多種硬件平臺的指令集,配有眾多的反匯編選項; 能根據目標程序的編譯器識別出很多函數和參數甚至結構體并且自動標注。 支持改名,內建簡單調試器以及支持很多高級功能。反匯編器 W32DASM W32Dasm是一個輕量級的反匯編工具 對小型文件進行反匯編時速度很快 它的優(yōu)點是使用方便容易上手,缺點是難以對大的文件進行反編譯。目目 錄錄1. 逆向工程概述逆向工程概

7、述2. 調試器和反匯編器調試器和反匯編器3. 逆向分析實例逆向分析實例4. 斷點斷點5. 專用工具專用工具實例1 直接內存查看Win32進程內存空間 當進程開始后,各種數據和資源會以一定結構組織起來映射到主存。默認情況下,Win32系統上每個用戶進程可以占有2GB的私有地址空間,操作系統占有剩下的2GB地址空間。 進程的代碼和各種資源都會在進程內存空間里出現,可以用內存查看工具查看進程內存以獲取一些信息例如字符串等。實例1 cont.運行目標程序BS.Crackme.2.exe主窗口上有兩個文本框,分別用于輸入用戶名和序列號這兩個注冊信息。在用戶名文本框中輸入用戶名newbie,下面隨便填入一

8、個注冊碼11223344,點擊check按鈕,crackme彈出一個對話框提示輸入的注冊碼錯誤。 暫時關閉對話框。打開WinHEX,點擊工具欄上的Open RAM按鈕,彈出對話框選擇想要打開的進程內存。 選中Primary Memory后點擊OK打開BS.Crackme.2.exe的進程內存空間。實例1 cont.12crackme是特意選擇給出的特例,程序通過用戶名計算出注冊碼,然后直接用字符串比較函數明碼比較輸入的假注冊碼和真注冊碼是否一致,并且在比較后沒有及時清除內存中暫時保存的真正的注冊碼。基于編程經驗,真假注冊碼在內存中的位置相距不遠,可以嘗試搜索內存中的“假注冊碼”,并在周圍尋找正

9、確結果。按Ctrl+F打開文本搜索對話框,填入11223344并且選擇ANSI編碼在內存盡心查找定位。實例1 cont.“11223344” 在內存中一共出現了兩次,在第二次的內存附近可以看到輸入的用戶名和假注冊碼,在假注冊碼的下面是一串數字,猜測是正確注冊碼。將這個字符串填進crackme的主界面,點擊check按鈕顯示注冊成功。實例1 cont. 這個crackme是特意選擇的例子,僅僅為了說明問題,并不具有普遍適用性。 用查看內存的方法之所以能夠起作用,根本原因還是程序中計算注冊碼后使用了明文字符串比較,并且沒有及時清除內存中的敏感信息。實例1 cont.實例2 實例2的仍然使用實例1的

10、BS.Crackme.2.exe 利用調試器根據注冊信息找到注冊碼計算的代碼,并且通過跟蹤計算過程逆向出注冊碼的計算過程。 Crackme的注冊流程:填入注冊信息后計算出正確的注冊碼并與從用戶界面上輸入的注冊碼進行比較;結果正確則彈出對話框提示注冊成功,反之提示失敗。 從編程角度來說,一般會在校驗過后在用戶界面上或者用彈出對話框的形式給用戶是否已經注冊成功的提示,用于提示的代碼應該距離注冊碼校驗的地方不遠 可以通過觀察程序的提示信息(或者其他注冊成功的表現)來定位計算和校驗注冊碼的關鍵代碼??梢岳锰崾咀址鳛榍腥朦c來完成逆向工程的任務。ODBG有一個強大的字符串引用查找插件Ultra St

11、ring Reference,可以在程序中搜索ASCII和Unicode編碼的字符串。在反匯編窗口中點擊右鍵,在選項菜單中可以看到有Ultra String Reference的選項,選擇第一項Find ASCII。搜索完畢后ODBG會顯示搜索結果,可以看到注冊成功時顯示的“correct way to go, you got it.”。實例2實例2在該字符串上雙擊,ODBG就會自動跳轉到對該字符串引用的反匯編代碼處。向上卷動一些代碼鼠標點擊0 x00401542這行代碼使之高亮顯示,按F2鍵在這里設置斷點,然后按F9讓程序運行起來,切換到crackme的界面。填入用戶名和注冊碼點擊check

12、按鈕以后ODBG捕捉到斷點,程序被中斷,ODBG自動激活,并且eip就停在斷點地址0 x00401542上。這時就可以用調試器來跟蹤程序。單步運行,觀察堆棧和內存數據,可以了解注冊流程。函數在開始處定義了3個CString類型的字符串,分別用于存放用戶名、用戶輸入的注冊碼和由程序計算的真正注冊碼。實例2點擊check按鈕后,函數調用CWnd:GetDlgItemText()函數取得用戶界面上文本框控件里用戶輸入的內容。函數用一個循環(huán)來根據用戶名計算注冊碼,結果放在一個無符號整型變量uRegCode中;在完成計算后,將調用CString:Format()函數將這個無符號整型值格式化輸出到strC

13、ode中(CString類型)。在進入循環(huán)之前,uRegCode變量已經有了一個初值0 x81276345用于計算注冊碼。每次從注冊用戶名中取出一個字符,將其加到uRegCode上,然后異或uRegCode和i左移8位的值(i在這里是循環(huán)控制變量),接著計算用戶名長度uLen和i的乘積并對結果取反再與i+1相乘。實例2計算過程可以用下面的程序來表達: for(i = 0; i uLen; i+) uRegCode = (uRegCode + strUserNamei) (i 8) * (i + 1) * (uLen * i);在計算過程結束之后,存放在uRegCode中的正確注冊碼被放入eax

14、寄存器中并作為CString:Format()的參數壓棧,最后調用CString:Format()將這個值格式化輸出到strCode中,并與通過CWnd:GetDlgItemText()取得的用戶輸入的注冊碼進行比較。也可以在CString:Format()這里下個斷點觀察內存驗證結果。分析出了注冊算法,可以為這個crackme編寫一個簡單的算法注冊機(也稱keygen,Key Generator)。實例2或者可以通過修改代碼來完成,就是使用在解密技術上稱為“爆破”的方法實現。在0 x40163B處函數調用一個子函數進行字符串比較,返回的結果放在eax中,然后用test指令測試eax中的值是否

15、為0,并根據結果用一個跳轉來實現程序流程的控制。修改“關鍵跳轉”的跳轉條件。實例2這里要用到ODBG的匯編功能,所謂匯編就是從指定的地址開始寫入我們自己的代碼。 在jnz這條代碼上雙擊,或者按空格鍵,將彈出一個匯編窗口,這樣就可以開始匯編了。修改代碼有一個原則,就是修改后的代碼字節(jié)數必須少于或者等于被修改的那條指令代碼的長度,否則匯編后會影響到后面我們不想改變的代碼。( 80X86指令集各條指令的長度是不一樣的 ,匯編前后字節(jié)數必須一樣)可以有兩個方法:第一,把jnz改成jz,改換跳轉實現的條件;第二,把這條跳轉指令全部修改為nop。實例2目目 錄錄1. 逆向工程概述逆向工程概述2. 調試器和

16、反匯編器調試器和反匯編器3. 逆向分析實例逆向分析實例4. 斷點斷點5. 專用工具專用工具斷點概念高級語言編寫的源代碼經過編譯連接之后生成的目標代碼數量巨大,在海量的代碼中我們關心的關鍵代碼往往只占很小一部分,而且在通常的情況下無法確知這些代碼的位置。斷點的作用就是在恰當的時機中斷正在被調試的進程的執(zhí)行,并把進程的控制權交給調試器,調試器接管進程的控制權之后,就能對進程進行跟蹤調試。斷點有很多種類型,如:函數執(zhí)行斷點,各種內存訪問斷點,IO端口讀寫斷點,中斷向量斷點,消息斷點等。其中最為常用的是函數執(zhí)行斷點。例如要在程序中獲得對話框中一個文本框中用戶輸入的文本,就會用到GetWindowTex

17、t()函數。如果對MessageBox()函數下斷點,每當程序運行到調用MessageBox()函數的地方就會被調試器中斷。 實例3 實例是PhoxCM3.EXE,該程序采用序列號保護機制,逆向的目標是找出序列號。 運行一下目標程序, 隨便輸入一個序列號,軟件檢測序列號錯誤以后彈出對話框提示“Wrong Code!”。實例3在反匯編窗口的右鍵菜單里找到“查找”選項,在彈出的子菜單中選擇“當前模塊中的名稱”,ODBG自動搜索程序中調用的函數,并將它們在窗口中列出??梢钥吹酱翱谥袕腢ser32.dll中輸入的GetWindowTextA() 函數,在上面點擊右鍵,選擇“在每個參考上設置斷點”,OD

18、BG會給程序中所有引用到GetWindowTextA() 函數的地方加上斷點。實例3斷點設置好之后,按F9讓程序運行起來。在界面上的文本框中輸入注冊碼,點擊OK按鈕之后程序執(zhí)行到GetWindowTextA()函數就會被中斷下來。GetWindowTextA() 函數執(zhí)行完成后,將緩沖區(qū)的首地址存入ebx寄存器,然后調用了GetWindowTextLengthA()函數取得用戶輸入的注冊碼長度并比較注冊碼長度是否等于12H。如果長度不符合就從0 x4011BB處跳走,調用MessageBox()提示注冊失敗。實例3再向下看代碼,發(fā)現程序連續(xù)對存放注冊碼的字符數組中的一組字符做比較,如果都等于預

19、先設定的值,則注冊成功。所以正確的注冊碼長度應該為18位,形式應該為FiXreXWorXxXSuXXxX,其中大寫X的位置可以用任意字符替換。目目 錄錄1. 逆向工程概述逆向工程概述2. 調試器和反匯編器調試器和反匯編器3. 逆向分析實例逆向分析實例4. 斷點斷點5. 專用工具專用工具專用工具 目前Windows操作系統上有多種語言開發(fā)平臺,每種語言的編譯器在編譯源代碼生成Win32平臺上的可執(zhí)行程序時都有各自不同的特點。根據這些特點,可以針對各種編譯器編譯的程序使用不同的專用工具,方便我們的逆向分析。例如由Visual FoxPro,Java開發(fā)的程序可以直接通過專用反編譯工具反編譯到源代碼;部分的.Net程序可以通過Reflector反編譯到源代碼;Delphi開發(fā)的程序可以在調試之前首先使用DEDE 分析;VB編譯的軟件可以用專用的WKT調試器進行P-Code的調試等等。 前面沒有提及該工具,適當介紹。PE信息查看工具信息查看工具PEiD一般直接反匯編或者用調試器調試之前我們通常都會先用一些PE文件查看工具先期獲取一些PE文件的信息,如程序使用什么編譯器編譯的,查看區(qū)段,是否已經被加殼等。PE信息查看工具有

溫馨提示

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

評論

0/150

提交評論