IDA實例教程詳解_第1頁
IDA實例教程詳解_第2頁
IDA實例教程詳解_第3頁
IDA實例教程詳解_第4頁
已閱讀5頁,還剩22頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、IDA 實例教程詳解作者:笨笨雄(轉(zhuǎn)載)1 軟件環(huán)境靜態(tài)分析有很多好處,例如加殼的程序(盡管對于高手來說這并不會耗費太多時間),我們不需要尋找OEP,也不需要解除自校驗,只要修復(fù)IAT,DUMP 下來就可以動手分析了。假如你需要修改程序,可以使用內(nèi)存補丁技術(shù)。動態(tài)與靜態(tài), 調(diào)試器與反匯編器結(jié)合可以簡化分析任務(wù),幫助我們理解代碼。因此掌握一種反匯編器是非常必要的。IDA 可以說是這方面的首選工具, 它為我們提供了豐富的功能,以幫助我們進(jìn)行逆向分析。這從 IDA 復(fù)雜的工作界面便可以知道。種類繁多的工具欄在分辨率不高的情況,這些工具欄與反匯編窗口擠在小屏幕里,看起來不爽。 我一般把它關(guān)閉(查看 =

2、工具欄 =主工具欄)以獲得更好的視覺效果。當(dāng)我們需要這些功能的時候,直接使用快捷鍵就可以了。下面是常用快捷鍵的清單:快捷鍵功能注釋C轉(zhuǎn)換為代碼一般在 IDA 無法識別代碼時使用D轉(zhuǎn)換為數(shù)據(jù)這兩個功能整理代碼A轉(zhuǎn)換為字符N為標(biāo)簽重命名方便記憶,避免重復(fù)分析。;添加注釋R把立即值轉(zhuǎn)換為字符H把立即值轉(zhuǎn)換為10 進(jìn)制Q把立即值轉(zhuǎn)換為16 進(jìn)制B把立即值轉(zhuǎn)換為2 進(jìn)制G跳轉(zhuǎn)到指定地址X交叉參考SHIFT+/計算器ALT+ENTER新建窗口并跳轉(zhuǎn)到選中地址ALT+F3關(guān)閉當(dāng)前分析窗口ESC返回前一個保存位置CTRL+ENTER返回后一個保存位置便于分析立即值便于查找API 或變量的引用這四個功能都是方便

3、在不同函數(shù)之間分析(尤其是多層次的調(diào)用)。具體使用看個人喜好在工具欄下面的便是工作窗口。主要的窗口分頁有“IDA View-A”、“ Name”、“ Strings”、“Exports”和“ Imports ”。對于后面 3 項相信大家都不會陌生了,它們分別是字符參考,輸出函數(shù)參考和輸入函數(shù)參考。 Name 是命名窗口, 在那里可以看到我們命名的函數(shù)或者變量。這四個窗口都支持索引功能,可以通過雙擊來快速切換到分析窗口中的相關(guān)內(nèi)容,使用起來十分方便。簡單輸入幾個字符即可定位目標(biāo)IDA View-A 是分析窗口,支持兩種顯示模式,除了常見的反匯編模式之后,還提供圖形視圖以及其他有趣的功能。IDA

4、的反匯編窗口一般我們在分析的時候,并不關(guān)心程序的機(jī)械碼,所以 IDA 為我們自動隱藏了這些信息。如果你有需要,可以通過以下步驟來設(shè)置:選項 =常規(guī) =反匯編 =顯示反匯編行部分=機(jī)械碼字節(jié)數(shù) =修改為你允許顯示的大小現(xiàn)在讓我們以論壇脫殼版塊置頂帖的那個經(jīng)典為例,看看圖形視圖的表現(xiàn)。首先我們到以下連接下載:你能通過圖形視圖及其縮略圖快速找到殼的出口嗎如圖所示,標(biāo)簽40EA0E便是殼的出口代碼的地址。在OD 中直接跳到該地址,下斷點,然后運行到該處,再單步便能看到OEP 了。假如希望通過跳轉(zhuǎn)法找OEP,相信圖形視圖比你在OD 一個一個跳轉(zhuǎn)跟隨,要快得多。再來看看這個殼的另類脫法。 AutoSear

5、ch 功能修復(fù)輸入表。 用直接運行該程序, DUMP 下來,再使用 IDA 打開修復(fù)了輸入表的 DUMP 文件。 在IMPORTREC的 IAT IMPORT 窗口隨便選一個API,隨便通過交叉參考跳轉(zhuǎn)到一個函數(shù)的代碼。此處為文件輸入表的位置我選了 RegQueryValueExA,通過交叉參考,來到Sub_402488 處的函數(shù)代碼。用鼠標(biāo)拖動縮略圖中的虛線框到上方,便能看到該CALL的頭部了。然后按下圖指示操作:在函數(shù)標(biāo)記上點擊鼠標(biāo)右鍵處于最上層的函數(shù),便是 OEP了,使用 PE 工具修改文件入口為10CC。現(xiàn)在函數(shù)可以正常工作了。這個方法的原理是通常我們寫程序都有如下流程:Main pr

6、oc, 打開 IAT 符號文件 );CustEa = AskAddr(0,目標(biāo) IAT 地址 );filehandle = fopen(fileName,r);for (ea = CustEa; zcount 2; ea = ea + 4)if (Dword(ea) !=0)Sbuffer = readstr(filehandle);if(strlen(Sbuffer) 2)04C2C00404C00404C404C6A00404C00404C00404C00404C00404C00404C00404C00404C00404C4A00404C00404C4F00404C4F00404C0045

7、60F0F0F0A0C8 F5A5A83 C0A0C8 F5A5A83 C0a0a0045639F004563A004563A004563A004563A004563C004563C004563C4563C4563C004563C004563F004563F4563F004563F004563F004563F004563F4563F0045640A0045640A45640A0045640Aseg005:0045640Aseg005:0045640Aseg005:0045640D ; seg005:0045640D; Resend the last transmission修復(fù)之后的代碼除了“

8、 sub eax, esp-8+arg_4”(實際上是sub eax,esp)看起來有點怪之后,一切正常。作為一個殼, 在解決了花指令之后,剩下的問題便只有反調(diào)試代碼和解密(解壓縮) 代碼了。例如上面列出的代碼是通過時間校驗檢查調(diào)試器,一旦檢查到, 便使用特權(quán)級指令,讓程序發(fā)生異常,無法繼續(xù)運行下去。當(dāng)然,我們在靜態(tài)的環(huán)境下,反調(diào)試技巧對于我們來說,毫無意義。 盡管如此, 我們?nèi)匀恍枰莱绦驎谑裁磿r候運行到什么地方,最常見的利用系統(tǒng)的機(jī)制莫過于SEH了,現(xiàn)在來看看下面代碼:seg005:00456A9Bcall$+5seg005:00456AA0adddwordptresp+0,136Fh

9、seg005:00456AA7seg005:00456AAEpushmovlarge dword ptr fs:0large fs:0, esp設(shè)置SEH的代碼“ call $+5 ”指令后堆棧里的內(nèi)容便是它的下一條指令在內(nèi)存中的地址。這是病毒常用的重定位技巧。 shift+/ 輸入 0x00456AA0+0x136F 便能計算出異常處理函數(shù)的地址(457E0F)了。seg005:0045745Cxoreax, eaxseg005:0045745Emovzxeax, byte ptr eax產(chǎn)生異常的代碼現(xiàn)在我們應(yīng)該跳到457E0F 繼續(xù)分析。我想你已經(jīng)了解如何在靜態(tài)環(huán)境下跟蹤程序的流程,現(xiàn)在

10、就讓我們跟著程序的流程把解密相關(guān)的代碼找出來。seg005:00459191pushecxseg005:00459192xorecx, ecxseg005:00459194call$+5seg005:00459199popediseg005:0045919Aaddedi, 9C4hseg005:004591A0popedxseg005:004591A1addedx, 15hseg005:004591A4 loc_4591A4:; CODE XREF: sub_459149+6Bjseg005:004591A4movzxeax, byte ptr ecx+ediseg005:004591A8xo

11、reax, edxseg005:004591AAmovecx+edi, alseg005:004591ADincecxseg005:004591AEcmpecx, 93hseg005:004591B4jbshort loc_4591A4解密代碼容易看出這就是解密代碼,在循環(huán)之中,且有修改內(nèi)存的指令。至于解密的KEY,其實就是 00459191 處 ECX的值 +15h。我希望你還記得到達(dá)這里之前曾經(jīng)看過下面代碼:seg005:004587B6moveax, esp+0Chseg005:004587BAxorecx, ecxseg005:004587BCxorecx, eax+4seg005:0

12、04587BFxorecx, eax+8seg005:004587C2xorecx, eax+0Chseg005:004587C5xorecx, eax+10h這一段是檢查硬件斷點的代碼,假如沒有設(shè)置硬件斷點,那么ECX的結(jié)果應(yīng)該是0。假如你不能理解為什么,我建議你看看SEH以及關(guān)于反硬件斷點的一些文章。在知道解密代碼的所有關(guān)鍵要素之后,就可以開始動手寫腳本了。#include static main() auto StartAddr,cKey,Cbuffer,Counter;StartAddr = 0x00459199 + 0x9c4;cKey = 0x15;for (Counter = 0

13、 ; Counter 0x93; Counter +)Cbuffer = Byte(StartAddr) cKey;00461F00461F00461F0046200F0046204C0046206A0046206F0046207A0046206A00461F9C0046206Flse 語句。if (CF=1)CF=0;while (ECX !=0)PatchByte(DeCodeAddr,Byte(EDX);EDX +;DeCodeAddr +;ECX -;elsewhile(Counter != 1)PatchDword(DeCodeAddr,Dword(EDX);EDX = EDX +

14、4;DeCodeAddr = DeCodeAddr + 4;if (ECX = 4)ECX= ECX -4;break;ECX = ECX - 4;DeCodeAddr = DeCodeAddr + ECX;/ 反匯編代碼的循環(huán)入口(4528DE)與我們轉(zhuǎn)換的循環(huán)入口不同(4528E9)/ 跟開始的時候一樣,入口之前的代碼放到循環(huán)外面。IsNotZero = EBX & 0x7FFFFFFF; if (IsNotZero = 0)CF=1;EBX = Dword(MyAddr);MyAddr = MyAddr + 4;HigtBitflat = EBX & 0x;EBX = EBX + EBX

15、;EBX = EBX + CF;CF=0;至此,我們成功將004528D0 到 004529A1 處的代碼轉(zhuǎn)換成C 代碼。在完成如此復(fù)雜的代碼還原之后, 004529A6 到 004529D8 處的反匯編代碼只是小菜一碟。里面的代碼也很好理解,將符合E8 01和E9 01 的機(jī)械碼解密。 位移指令可以通過借用程序中的一個閑置的Dword ,使用IDC 提供的Pactch 系列指令來模擬,詳見。在完成最后的解密代碼后,便是IAT 的修復(fù)了?,F(xiàn)在看看下面代碼:004529DAleaedi, esi+50000h004529E0 loc_4529E0:004529E0moveax, edi00452

16、9E2oreax, eax004529E4jzshort loc_452A22004529E4004529E6movebx, edi+4004529E9leaeax, eax+esi+549B0h004529F0addebx, esi004529F2pusheax004529F3addedi, 8004529F6calldword ptr esi+54A3Ch004529FCxchgeax, ebp004529FD loc_4529FD:004529FDmoval, edi004529FFincedi00452A00oral, al00452A02jzshort loc_4529E000452

17、A0200452A04movecx, edi00452A06pushedi00452A07deceax00452A08repne scasb00452A0Apushebp00452A0Bcalldword ptr esi+54A40h00452A11oreax, eax00452A13jzshort loc_452A1C00452A1300452A15movebx, eax00452A17addebx, 400452A1Ajmpshort loc_4529FD在分析該處代碼之前,顯然應(yīng)該先把ESI 的值計算出來。鼠標(biāo)點擊ESI,以高亮顯示該寄存器,向上滾動反匯編窗口,發(fā)現(xiàn)從004529A6po

18、pesi 處開始, ESI便沒有被修改過,而該處對應(yīng)于:seg005:0046206Fseg005:00462074seg005:0046207Amovleapushesi, offset unk_447000edi, esi-46000hedi可見 ESI=0x401000,容易計算出004529F6 和 00452A0B 處 CALL的地址分別為455A3Ch和 455A40h 。跳轉(zhuǎn)到該地址:顯然,這里便是殼填充IAT 的地方了。那么004529DAleaedi, esi+50000h 中, EDI便是保存API 名字的數(shù)據(jù)表。 做脫殼機(jī)的任務(wù)就留給讀者作課后練習(xí),正如前面介紹的那樣,只

19、需要API的名字為相關(guān)IAT地址重命名,便能分析了。也就是說00452A0B處,調(diào)用GetProcAddress,跟蹤它的參數(shù)lpProcName(00452A06pushedi) ,以及它的返回值(00452A15movebx, eax ),當(dāng)然這里的跟蹤,可以象剛才那樣手動確認(rèn),也可以通過與調(diào)試器配合快速得出結(jié)果。不難得出下面腳本:#include static main() auto ESI,EDI,EAX,EBX,Counter,cBuffer,BufLen,straa;ESI = 0x447000 - 0x46000;EDI = ESI + 0x50000;Counter = MaxEA() - MinEA();MakeUnknown(MinEA(),Counter,1);/ 將整個程序標(biāo)記

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論