版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
從零開始學IDA逆向(上篇)目錄1簡介...........................................................................................................................11.1為什么使用IDA...............................................................................................11.2IDA安裝...........................................................................................................21.3使用IDA加載程序..........................................................................................32數(shù)值系統(tǒng)以及IDA搜索功能.................................................................................132.1數(shù)值系統(tǒng).........................................................................................................132.2十六進制數(shù).....................................................................................................142.3ASCII碼字符.................................................................................................162.4IDA中的搜索功能.........................................................................................203CPU寄存器以及數(shù)據(jù)傳輸指令.............................................................................273.1IDA加載器.....................................................................................................273.2寄存器.............................................................................................................273.3MOV指令.........................................................................................................314數(shù)據(jù)傳輸以及棧操作指令.....................................................................................414.1XCHG指令.......................................................................................................414.2Keypatch插件..............................................................................................454.3棧操作指令.....................................................................................................475LEA指令.................................................................................................................535.1LEA指令........................................................................................................535.2函數(shù)參數(shù)及局部變量.....................................................................................535.3LEA的其他用法.............................................................................................556整數(shù)運算與邏輯運算指令.....................................................................................576.1整數(shù)運算指令.................................................................................................576.2邏輯運算指令.................................................................................................617流程控制指令.........................................................................................................667.1無條件跳轉指令JMP.....................................................................................667.2有條件跳轉指令.............................................................................................727.3CALL和RET指令..........................................................................................738靜態(tài)逆向分析入門.................................................................................................758.1程序加載詳解.................................................................................................758.2查找關鍵字符串.............................................................................................788.3查找關鍵函數(shù).................................................................................................808.4標記指令位置.................................................................................................848.5修改指令.........................................................................................................859函數(shù)棧逆向分析.....................................................................................................899.1安裝VisualC++運行時..............................................................................899.2符號文件.........................................................................................................899.3定位main函數(shù)..............................................................................................919.4函數(shù)的棧.........................................................................................................939.5Main函數(shù)參數(shù)...............................................................................................969.6局部變量.........................................................................................................989.7Atoi函數(shù).....................................................................................................10110IDA調試器.........................................................................................................10410.1選擇IDA調試器........................................................................................10410.2調試器界面功能........................................................................................10510.3條件跳轉指令與標志寄存器....................................................................11210.4SETEIP.....................................................................................................12011標志寄存器.........................................................................................................12211.1CARRYFLAG..............................................................................................12211.2OVERFLOWFLAG........................................................................................12411.3SIGNEDFLAG............................................................................................12511.4ZEROFLAG................................................................................................12611.5條件跳轉與標志位....................................................................................12712程序注冊逆向分析.............................................................................................13212.1通過命令行參數(shù)確定main函數(shù)..............................................................13212.2Main函數(shù)棧分析......................................................................................13512.3Main函數(shù)局部變量..................................................................................14012.4循環(huán)和代碼塊編組....................................................................................14312.5注冊算法分析............................................................................................14713IDAPython簡介..............................................................................................15213.1安裝ipyida..............................................................................................15213.2Ipython的使用........................................................................................15213.3Idapython的使用...................................................................................15514程序脫殼簡介.....................................................................................................16014.1什么是加殼................................................................................................16014.2加載加殼文件............................................................................................16014.3文件和內存占用........................................................................................16114.4STUB和OEP...............................................................................................16514.5尋找OEP.....................................................................................................16714.6API函數(shù).....................................................................................................17014.7保存脫殼后的數(shù)據(jù)庫................................................................................17114.8通過執(zhí)行斷點尋找OEP.............................................................................17415轉存并重建導入函數(shù)表(IAT)......................................................................17715.1使用腳本轉存為可執(zhí)行文件....................................................................17715.2什么是IAT.................................................................................................18015.3重建IAT.....................................................................................................18516Aspack脫殼......................................................................................................19216.1PUSHAD和POPAD......................................................................................19216.2使用idapython進行調試.......................................................................19216.3使用idapython進行DUMP.....................................................................19917遠程調試.............................................................................................................20417.1環(huán)境配置....................................................................................................20417.2遠程調試....................................................................................................20517.3尋找OEP.....................................................................................................20917.4轉存及IAT重建........................................................................................21217.5取消隨機基址............................................................................................21718編寫注冊機.........................................................................................................21918.1Main函數(shù)及其參數(shù)..................................................................................21918.2Securitycookie等局部變量..............................................................22218.3用戶名和密碼處理....................................................................................22518.4算法總結....................................................................................................23318.5使用Python編寫注冊機.........................................................................23419GUI程序逆向.....................................................................................................23919.1關鍵判斷定位............................................................................................23919.2GUI控件.....................................................................................................24219.3用戶名處理................................................................................................24619.4密碼處理....................................................................................................25519.5算法總結與注冊機....................................................................................25620漏洞與棧緩存區(qū)溢出.........................................................................................25920.1什么是軟件漏洞........................................................................................25920.2無效緩存區(qū)................................................................................................25920.3包含緩存區(qū)的棧結構分析........................................................................26220.4棧緩存區(qū)溢出實例....................................................................................27021棧緩存區(qū)漏洞分析及修復.................................................................................27521.1Bug、漏洞和利用的區(qū)別..........................................................................27521.2回車符和換行符........................................................................................27721.3IDA附加進程調試.....................................................................................27921.4字符數(shù)等于緩存區(qū)大小............................................................................28521.5字符數(shù)-1漏洞及其修復...........................................................................28722文件對比工具.....................................................................................................29222.1BINDIFF.....................................................................................................29222.2TURBODIFF................................................................................................29922.3DIAPHORA...................................................................................................30223Dev-C++編譯器及其函數(shù)參數(shù)傳遞.................................................................30923.1Main函數(shù)及CANARY變量.......................................................................30923.2顯示ESP變化............................................................................................31223.3漏洞分析....................................................................................................31523.4溢出測試及腳本........................................................................................31924struct.pack函數(shù)...........................................................................................32224.1變量分析....................................................................................................32224.2緩存區(qū)分析................................................................................................32524.3struct.pack函數(shù)...................................................................................32725結構體.................................................................................................................32925.1什么是結構體............................................................................................32925.2創(chuàng)建C++結構體.........................................................................................33025.3結構體示例代碼........................................................................................33125.4IDA中的結構體.........................................................................................33325.5根據(jù)字段創(chuàng)建結構體................................................................................34325.6IDA3.exe解決方案..................................................................................34625.7IDA4.exe解決方案..................................................................................34926識別結構體.........................................................................................................35626.1示例代碼....................................................................................................35626.2根據(jù)參數(shù)傳遞判斷結構體........................................................................35826.3創(chuàng)建結構體................................................................................................36326.4在其它函數(shù)中識別字段............................................................................36526.5編寫腳本....................................................................................................37127從零開始創(chuàng)建結構體并識別字段.....................................................................37427.1printf函數(shù)與scanf函數(shù).....................................................................37427.2從零開始創(chuàng)建結構體................................................................................38127.3識別結構體字段........................................................................................38527.4修復函數(shù)....................................................................................................40027.5實現(xiàn)溢出腳本并調試................................................................................40228指針和引用.........................................................................................................41028.1變量的值....................................................................................................41028.2變量地址....................................................................................................41228.3變量的指針................................................................................................41528.4使用指針操作數(shù)據(jù)....................................................................................41828.5使用指針傳遞參數(shù)....................................................................................42228.6變量引用....................................................................................................42729程序漏洞實戰(zhàn).....................................................................................................43130程序漏洞實戰(zhàn)分析.............................................................................................43230.1文件比對....................................................................................................43230.2創(chuàng)建結構體和字段....................................................................................43930.3malloc和calloc函數(shù)...........................................................................44430.4malloc參數(shù)漏洞分析..............................................................................44830.5stream_Read參數(shù)漏洞分析...................................................................45331制作驗證程序.....................................................................................................45831.1緩存區(qū)局部讀寫........................................................................................45831.2尋找緩存區(qū)后的獨立變量........................................................................46431.3stream_Read函數(shù)...................................................................................46831.4制作POC.....................................................................................................475從零開始學IDA逆向 1簡介簡介本教程主要想法是使用IDA對我們之前的逆向工程教程內容進行更新,讓讀者學習如何在最新的Windows操作系統(tǒng)上開始使用IDA。在這一系列教程當中,作者使用的是64位Windows10,并且安裝了2016年10月29日之前的全部更新和補丁。1.1 為什么使用IDAOllydbg僅僅是運行于Windows用戶模式下的一種32位調試器,而IDA是運行于32/64位下,可用作反編譯和調試的一個完整的逆向工具。使用IDA盡管是個更加復雜的學習過程,但它提供了Ollydbg無法實現(xiàn)的靜態(tài)逆向分析手段,并且使用戶能夠在Windows、Linux或Macosx本地環(huán)境以及以下環(huán)境中遠程操作。圖1-1IDAPRO自帶的調試器圖1-2列出IDA支持的部分處理器架構供讀者參考??梢钥闯觯瑢W習使用IDA能夠拓展我們的業(yè)務范圍。盡管在這個系列教程中,主要關注的是Windows32/64位下的用戶模式的應用程序,有時也關注內核模式程序。但掌握這些內容的讀者在其他方面也會容易上手。在這個IDA系列教程中,作者會由淺入深地講解“Ollydbg介紹”系列涉及的大部分內容,包括:靜態(tài)及動態(tài)逆向分析、脫殼和諧、漏洞開發(fā)等。作者會對一些重要細節(jié)從頭開始講解。1從零開始學IDA逆向 1簡介圖1-2IDAPRO支持的處理器架構1.2 IDA安裝首先我們需要安裝IDA。IDA是一款物有所值的商業(yè)軟件,建議有能力的讀者購買使用。作者無法提供安裝程序,讀者可以在Goolge搜索“IDAPRO6.8HEXRAYS”獲取已泄露版本。2從零開始學IDA逆向 1簡介圖1-3IDAPRO6.8壓縮包內容圖1-3為下載的zip包中內容,安裝文件為:idapronw_hexarmw_hexx64w_hexx86w_150413_cb5d8b3937caf856aaae750455d2b4ae.exe。程序安裝密碼在文件install_pass.txt當中。安裝文件會同時安裝Python2.7.6,推薦使用IDA附帶的Python避免產(chǎn)生問題。如果讀者自行安裝的話需要與IDA使用的Python版本一致。圖1-4Python2.7.6命令行1.3 使用IDA加載程序安裝完畢后,我們在IDA中加載本章教程附帶的Crueheadcrackme程序。由于這是一個32位可執(zhí)行程序,我們使用IDA32位加載程序。3從零開始學IDA逆向 1簡介圖1-5啟動IDA32位快捷方式如果讀者直接運行程序,可以在系統(tǒng)任務管理器中查看到它是一個32位進程。圖1-6運行crackme程序,并查看任務管理器如果不通過執(zhí)行文件來確定它是32位還是64位程序,可以使用16進制編輯器,例如https://mh-nexus.de/en/downloads.php?Product=hxd。下載并安裝HxD英文版。通過16進制編輯器打開文件,確定它是32位還是64位程序的方法如下:4從零開始學IDA逆向 1簡介圖1-7系統(tǒng)截圖程序可執(zhí)行文件PE頭使用hxd打開系統(tǒng)自帶的截圖程序可執(zhí)行文件,這是一個64位可執(zhí)行程序,可以看到PE這個詞后面的內容:“PE..d?”。如果打開32位的Crueheadcrackm_e程序,PE這個詞后面的內容是“PE..L”。圖1-8Crueheadcrackme程序可執(zhí)行文件PE頭打開IDA32位應用,當IDAQUICKSTART窗口出現(xiàn)時,選擇New來打開一個新的文件,查找并選擇這個crackme程序。5從零開始學IDA逆向 1簡介圖1-9IDA加載新文件窗口目前為止,不需要修改設置內容,IDA檢測出這是一個可執(zhí)行PE文件,點擊OK下一步。如果同意顯示鄰近視圖(PROXIMITYVIEW),IDA將會顯示程序各部分的調用關系。圖1-10鄰近視圖(PROXIMITYVIEW)按空格鍵可以在圖形視圖和非圖形的指令列表間切換顯示模式。6從零開始學IDA逆向 1簡介圖1-11顯示圖形視圖中的指令地址在OPTIONS-DEBUGGINGOPTIONS-LINEPREFIXES勾選可以顯示圖形視圖中指令的地址。加載可執(zhí)行程序后最先打開的是反匯編視圖,加載器并不會執(zhí)行程序,只是對程序進行逆向分析,并且生成一個數(shù)據(jù)庫文件(IDB)。如果需要調試程序,則需要選擇IDA提供的調試器,并在調試模式下運行,這部分內容將在以后的章節(jié)中涉及。7從零開始學IDA逆向 1簡介圖1-12反匯編視圖IDA中有很多顯示視圖。例如,打開菜單上的VIEW-OPENSUBVIEW,可以選擇需要顯示的視圖。圖1-13函數(shù)起點識別IDA中有一些令人疑惑或者不適的問題,那就是視圖某些部分出現(xiàn)的指向同一地址的引用,例如在一些函數(shù)起點處,地址重復了多次。技巧就是將最后一次重復作為開始。圖1-13中通過這種方式找到匯編指令的起點,在這個例子當中,401000地址對應的匯編指令是“PUSH0”。8從零開始學IDA逆向 1簡介在IDA中可以分別對加載器和調試器界面進行設置。比如說加載器常用的視圖和窗口設置完成后,打開菜單上的WINDOWS-SAVEDESKTOP,設置為默認(Default),可以保留當前設置。在調試時同樣可以進行界面設置,并且使用不同于加載器的設定。圖1-14保存桌面設置在IDA包含列表的選項卡中,如FUNCTIONS,STRINGS,NAMES等,可以通過“CTRL+F”進行搜索,并且根據(jù)輸入的字符進行過濾。打開菜單欄VIEW-OPENSUBVIEW-STRINGS,可以搜索到所有包含“try”的字符串。圖1-15字符串搜索同樣,打開菜單欄VIEW-OPENSUBVIEW-DISASSEMBLY,可以打開第二個反匯編選項卡顯示與第一個不同的內容。9從零開始學IDA逆向 1簡介圖1-16打開第二個反匯編選項卡打開菜單欄VIEW-OPENSUBVIEW-HEXDUMP可以顯示十六進制視圖。圖1-17十六進制選項卡打開菜單欄VIEW-OPENSUBVIEW-IMPORTS可以查看程序引用的外部函數(shù)。10從零開始學IDA逆向 1簡介圖1-18引用外部函數(shù)選項卡在VIEW菜單中,可以打開GRAPHOVERVIEW選項卡,作為當前函數(shù)圖形視圖的總覽。圖1-19鷹眼視圖選項卡其他選項卡例如STRUCTURES、EXPORTS、NAMES、SEGMENTS等會在后續(xù)章節(jié)使用過程中進行介紹。圖1-20程序分段的顯示11從零開始學IDA逆向 1簡介選項卡頂部IDA用不同的顏色區(qū)分可執(zhí)行程序組成部分。下方對不同顏色代表的部分進行說明。例如,灰色代表.datasection(數(shù)據(jù)),如果點擊顏色條灰色部分,下方的圖形視圖也會跳轉到該部分中點擊地址的位置。粉色部分是ExternalSymbol(外部符號)或者idatasection。藍色部分表示codesection(代碼)中識別出的函數(shù)。以上為IDA功能的快速預覽,在后續(xù)的章節(jié)中將逐步深入探討。12從零開始學IDA逆向 2數(shù)值系統(tǒng)以及IDA搜索功能數(shù)值系統(tǒng)以及IDA搜索功能本章教程是一份面對零基礎大眾的課程,少部分讀者可以跳過已經(jīng)掌握的內容。2.1 數(shù)值系統(tǒng)常用的數(shù)值系統(tǒng)有:binary(二進制)、decimal(十進制)和hexadecimal(十六進制)。Binary(二進制)僅以0和1字符表示數(shù)字。Decimal(十進制)使用0~9共10個字符表示數(shù)字。Hexadecimal(十六進制)使用0~9加上A~F共16個字符表示數(shù)字。在IDA界面底部有一個交互欄可以執(zhí)行Python命令,能夠幫助讀者快速進行進制轉換。圖2-1Python交互欄在Python交互中輸入0x45,由于開頭的0x將會被解釋為十六進制數(shù)。直接按回車可將0x45轉換為十進制數(shù),輸出結果為69。圖2-2十六進制轉換為十進制如果需要將十進制轉換為十六進制數(shù),可以使用hex()函數(shù)。圖2-3十進制轉換為十六進制Bin()函數(shù)將其他進制的數(shù)字轉換為二進制數(shù)。輸出結果是1000101。開頭的0b代表這是一個二進制數(shù),13從零開始學IDA逆向 2數(shù)值系統(tǒng)以及IDA搜索功能圖2-4十進制和十六進制轉換為二進制數(shù)同樣也可以將二進制數(shù)轉換為十進制和十六進制數(shù)。圖2-5二進制數(shù)轉換為十進制和十六進制所有直接輸入的數(shù)字在按回車后會轉換為十進制數(shù)輸出,通過Python函數(shù)hex()和bin()可以轉換為十六進制或者二進制數(shù)輸出。為了方便起見,通過菜單VIEW-CALCULATOR,可以打開IDA內置的轉換器。該轉換器能夠同時顯示數(shù)字轉換為各種進制的結果。也會顯示數(shù)字對應的ASCI字符。例如0x45對應的字符是‘E’。圖2-6IDA內置轉換器2.2 十六進制數(shù)幾乎所有逆向工作都要涉及十六進制數(shù),那么問題是如何用32位十六進制表示一個負數(shù)。在一個32位二進制數(shù)中,第一個比特(bit)上的0用來表示正數(shù),1來表示負數(shù)。從圖2-7可以看到-0x45的32位十六進制表示為0xffffffbb,而且二進制的第一個比特為1。14從零開始學IDA逆向 2數(shù)值系統(tǒng)以及IDA搜索功能圖2-7-0x45不同進制表示方式用這種方式,最小能表示的正數(shù)顯然為0,那么最大的正數(shù)是多少呢。從圖2-8可以看出考慮正負號的話0x7fffffff是能表示的最大正數(shù)。如果再加1的話,因為后面的位數(shù)都是1,所以最高位也會變成1。圖2-832位十六進制最大正數(shù)在計算器中將0x7fffffff再加上1,最高位變成1,其他位變成了0。圖2-90x7fffffff+1表示方式IDA轉換器在輸入的時候默認都是正數(shù),除非我們在數(shù)字前面加上“-”號。最大負數(shù)-1對應十六進制0xffffffff,最小負數(shù)0x80000000。如果不考慮正15從零開始學IDA逆向 2數(shù)值系統(tǒng)以及IDA搜索功能負,所有的數(shù)從0到0xffffffff都是正值??紤]正負,0x0到0x7fffffff是所有的正數(shù),0xffffffff到0x80000000是所有的負數(shù)。圖2-10-0x1表示方式位十六進制正數(shù):000000000=0(十進制)000000001=1(十進制)………………7FFFFFFF(最大正值)=2147483647(十進制)位十六進制負數(shù):FFFFFFFF=-1(十進制)FFFFFFFE=-2(十進制)………………80000000(最小負值) =-2147483648(十進制)圖2-11有正負和無正負十六進制對應的十進制數(shù)2.3 ASCII碼字符16從零開始學IDA逆向 2數(shù)值系統(tǒng)以及IDA搜索功能還有一點讀者需要了解的是操作系統(tǒng)在屏幕上輸出數(shù)據(jù)的方法。每一個輸出字符都有一個對應的十六進制值,不同數(shù)值分別解析為相應字母、數(shù)字和符號。圖2-12列入的ASCII表中,第一列為字符,第二列為對應的十六進制數(shù),第三列為對應的十進制數(shù)。例如,0x20或者32(十進制)代表空格字符。表中列出了所有的數(shù)字和英文字母等字符及其編碼。17從零開始學IDA逆向 2數(shù)值系統(tǒng)以及IDA搜索功能18從零開始學IDA逆向 2數(shù)值系統(tǒng)以及IDA搜索功能圖2-12ASCII表IDA轉換器能夠顯示數(shù)值對應的字符。如圖2-7,0x45對應的字符是“E”。還有一種轉換方式是使用Python中的chr()函數(shù)。19從零開始學IDA逆向 2數(shù)值系統(tǒng)以及IDA搜索功能圖2-13使用Python的chr()函數(shù)將數(shù)值轉換為字符在IDA的HEXDUMPWindows(十六進制視圖)中也有一列顯示相應的字符。在圖2-14中也能看到在右方字符列里對應45(十六進制)的字符“E”。圖2-14十六進制視圖右側顯示字符2.4 IDA中的搜索功能讀者可以看到IDA菜單欄上的搜索(SEARCH)子菜單。而且反匯編視圖或者其他視圖里也提供了很多搜索功能。如果讀者切換到反匯編視圖而沒有顯示搜索子菜單時,讀者需要點擊任一指令,改變鼠標焦點使這個菜單顯示出來。圖2-15中一些搜索選項是作者使用的IDA加載項提供的,可能與讀者的不一致。下一條可執(zhí)行指令(NEXTCODE):這個功能用于搜索下一條可執(zhí)行指令(CODE)。如果中間有一部分不是可執(zhí)行指令,這部分將會被跳過。Searchcompleted.Foundat004011A1.20從零開始學IDA逆向 2數(shù)值系統(tǒng)以及IDA搜索功能Searchcompleted.Foundat004011A3.Searchcompleted.Foundat004011A5.Searchcompleted.Foundat004011AA.Searchcompleted.Foundat004011AC.Searchcompleted.Foundat004011AF.Searchcompleted.Foundat004011B6.圖2-15IDA搜索子菜單下一處數(shù)據(jù)(NEXTCODE):這個功能用于搜索下一處數(shù)據(jù)。在圖2-16中,IDA檢索到00401600地址上的雙字節(jié)(DWORD)不屬于可執(zhí)行指令。如果繼續(xù)搜索,IDA會跳轉到下方的數(shù)據(jù)區(qū)塊,讀者可以看到地址00402004右側的交叉引用表示其他指令對這里的數(shù)據(jù)進行了操作。21從零開始學IDA逆向 2數(shù)值系統(tǒng)以及IDA搜索功能圖2-16數(shù)據(jù)搜索繼續(xù)搜索IDA會跳過這些沒有被使用的“0”字節(jié),跳轉到被分析程序使用的數(shù)據(jù)地址。Searchcompleted.Foundat00402004.Searchcompleted.Foundat00402048.圖2-17數(shù)據(jù)搜索續(xù)繼續(xù)搜索IDA會跳過所有非數(shù)據(jù)項直到搜索到下一處數(shù)據(jù)。下一處已探查項(NEXTEXPLORED):搜索下一處可執(zhí)行指令或者數(shù)據(jù)。下一處未探查項(NEXTUNEXPLORED):搜索下一處非執(zhí)行指令且非數(shù)據(jù)。圖2-18搜索未探查項22從零開始學IDA逆向 2數(shù)值系統(tǒng)以及IDA搜索功能通過下一處未探查項搜索到0x402000地址上的“0”字節(jié)。繼續(xù)搜索時會跳過0x402004上的數(shù)據(jù),因為它屬于已探查項。Searchcompleted.Foundat00402000.Searchcompleted.Foundat00402000.Searchcompleted.Foundat00402001.Searchcompleted.Foundat00402001.Searchcompleted.Foundat00402002.Searchcompleted.Foundat00402003.Searchcompleted.Foundat00402008搜索硬編碼值(SEARCHINMEDIATE):該功能用于搜素可執(zhí)行指令以及數(shù)據(jù)項中的常量。圖2-19搜索硬編碼值圖2-19中如果我們勾選FINDALLOCURRENCES,IDA會搜索所有的匹配項。如果不勾選該項,IDA會逐個進行搜索,這時讀者需要使用下一處硬編碼值(NE_XTINMEDIATEVALUE)功能來繼續(xù)搜索。圖2-20硬編碼值搜索結果搜素文本(TEXT):搜索輸入的文本,支持正則表達式。如果讀者選擇了單個搜索,還需要使用下一處文本(NEXTTEXT)來繼續(xù)搜索。23從零開始學IDA逆向 2數(shù)值系統(tǒng)以及IDA搜索功能圖2-21搜索文本圖2-22文本搜索結果搜索字節(jié)序列(SEQUENCEOFBYTES):搜索輸入的字節(jié)序列。圖2-23搜索字節(jié)序列24從零開始學IDA逆向 2數(shù)值系統(tǒng)以及IDA搜索功能圖2-24字節(jié)序列搜索結果如果我們點擊第一處,IDA反匯編視圖會跳轉到我們搜索結果地址。圖2-25第一處“9090”搜索非完整函數(shù)(NOTFUNCTION):搜索下一處不完整的函數(shù)。Searchcompleted.Foundat004013D7.圖2-26搜索非完整函數(shù)004013D7地址上單獨的RET指令無法識別為函數(shù)。有時候,因為一些非法指令導致有些函數(shù)無法被IDA識別出來。以上是IDA中最重要的搜索功能。當然,使用Python腳本寫幾行代碼能夠提供更好的搜索結果。每次的搜索結果會在記錄窗口中顯示,直到讀者關掉這個窗口。25從零開始學IDA逆向 2數(shù)值系統(tǒng)以及IDA搜索功能本教程逐步深入使得讀者有一個更好的理解。26從零開始學IDA逆向 3CPU寄存器以及數(shù)據(jù)傳輸指令CPU寄存器以及數(shù)據(jù)傳輸指令3.1 IDA加載器讀者可能已經(jīng)了解到,當IDA加載器打開一個可執(zhí)行文件后進行的是一種靜態(tài)分析,包括程序的組成特點等內容。目前教程介紹的內容對于加載器和調試器都是通用的。作者會在今后兩者有區(qū)別的地方提示讀者。顯然,程序被IDA加載后并沒有執(zhí)行,而是通過靜態(tài)分析并且創(chuàng)建了數(shù)據(jù)庫。這與使用調試器動態(tài)調試有顯著區(qū)別。在加載器中,沒有寄存器、棧和模塊等內存窗口,這些內容只有在運行和調試程序時才會出現(xiàn)。使用IDA加載CrueheadCrackme(CRACKME.EXE)這個程序后,讀者不會再在Windows任務管理器的進程列表里找到它的進程,除非讀者使用IDA調試器它才會被運行。這對于惡意軟件分析等方面非常有利。因為在調試過程中讀者不會碰到所有需要研究的函數(shù),而在加載器中,讀者可以分析程序包含的所有函數(shù),就算讀者不知道它是如何被調用的。當然,涉及到函數(shù)分析的時候,盡管不像調試的時候會有窗口顯示了寄存器的值,以及使用寄存器的指令,讀者仍然需要掌握理解寄存器及相關指令的知識,以便了解程序執(zhí)行的內容。3.2 寄存器處理器執(zhí)行程序的時候需要一些額外的輔助,寄存器是其中之一。比如說ADD(加法)指令,兩個內存中的數(shù)就無法直接相加,處理器必須將其中一個數(shù)傳輸?shù)郊拇嫫髦?,再加上另一個內存地址中的數(shù)。這只是一個例子,部分寄存器常有特定的用途。位通用寄存器有:EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI和EIP。在教程的后續(xù)章節(jié)中,有一部分對應64位系統(tǒng)的內容。EAX(accumulator,累加器):EAX常用于四則運法以及一些格式化指令。EBX(Baseindex,基址寄存器):EBX常用于存儲起始內存地址。ECX(counter,計數(shù)器):ECX用于多種指令的計數(shù)器。同時也存儲內存數(shù)據(jù)的地址偏移。使用計數(shù)器的指令包括字符串指令、偏移指令、移位指令以及循27從零開始學IDA逆向 3CPU寄存器以及數(shù)據(jù)傳輸指令環(huán)。28從零開始學IDA逆向 3CPU寄存器以及數(shù)據(jù)傳輸指令圖3-1通用寄存器EDX(data):EDX通常用于存儲乘積的部分位數(shù)以及除法的余數(shù),同時也能存儲起始內存地址。EBP(basepointer):EBP指向一個內存地址,主要作為一個函數(shù)中的參數(shù)以及變量的基址。EDI(destinationindex):EDI常用于字符串指令,指向目標字符串。ESI(sourceindex):ESI常用于字符串指令,指向初始字符串。EIP:存儲即將執(zhí)行的下一條指令的地址。ESP:存儲棧頂?shù)刂贰_€有16位和8位寄存器,作為32位和16位寄存器的一部分。AX就是最后16位,AH是AX的前面8位,AL是AX的后八位。圖3-2EAX、AX、AH和AL寄存器對于EBX有BX、BH和BL子寄存器,對于ECX有CX、CH和CL子寄存器,對于EDX有DX、DH和DL子寄存器。其他通用寄存器的9~16位沒有命名也無法直接獲取內容。其他還有一些寄存器。一個重要的輔助寄存器EFLAGS,根據(jù)它的值會在某些時刻改變程序的執(zhí)行過程,這在后面教程中有所涉及。另外段寄存器直接指向了可執(zhí)行程序不同的部分,比如CS=CODE,DS=DATA。還有值得注意的一點是常用數(shù)據(jù)類型的大小。IDA能夠處理更多類型的數(shù)據(jù),讀者會在后續(xù)章節(jié)中進一步了解。最基本的是BYTE占用1個字節(jié)(8bit)內存,WORD占用2個字節(jié)(16bit)內存,DWORD占用4個字節(jié)(32bit)內存、QWORD占用8個字節(jié)(64bit)內存。29從零開始學IDA逆向 3CPU寄存器以及數(shù)據(jù)傳輸指令圖3-3寄存器與子寄存器圖3-4EFLAGS寄存器與段寄存器圖3-5基礎數(shù)據(jù)類型及內存占用30從零開始學IDA逆向 3CPU寄存器以及數(shù)據(jù)傳輸指令3.3 MOV指令IDA的指令集并不是世界上最簡單的。大部分人習慣了ollydbg的反匯編既簡單又容易理解,但是ollydbg提供的信息較少。數(shù)據(jù)傳輸指令MOV:將其始操作單元(src)的內容復制到目標單元(dest)。這里面有一些不同的方式,例如我們可以把一個寄存器中的值復制到另一個寄存器:MOVEAX,EDI。圖3-6傳遞寄存器中的值大部分情況下,我們可以在寄存器間直接傳輸,但是EIP寄存器無法被直接賦值或者讀取。例如MOVEIP,EAX這個指令就是非法的。另外一種方式就是我們把一個常量傳輸?shù)郊拇嫫髦?,例如:MOVEAX,1。圖3-7將常量傳遞給寄存器將內存的地址而非取值傳遞給寄存器也是可以的。(這條指令不屬于CRACKM_E.exe這個程序,而是在本章教程的附件veviewer.exe這個程序當中)。在圖3-8中,被傳遞的值是一個內存地址,“OFFSET”這個詞說明傳遞的是內存地址而不是內存的值。31從零
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026院感知識考試題及答案
- 婦幼志愿服務資源配置優(yōu)化策略
- 頭頸部鱗癌免疫治療指南
- 提高衛(wèi)生間排水立管一次安裝合格率
- 大數(shù)據(jù)分析AKI恢復期降壓方案的優(yōu)化
- 多邊衛(wèi)生合作中IHR的實施挑戰(zhàn)與應對策略
- 多組學整合標志物的驗證策略
- 2025年中職電梯安裝與維修保養(yǎng)(電梯檢修技能)試題及答案
- 2025年高職環(huán)境設計(環(huán)境教學設計)試題及答案
- 2025年大學(環(huán)境科學)環(huán)境污染監(jiān)測試題及答案
- 安徽省九師聯(lián)盟2025-2026學年高三(1月)第五次質量檢測英語(含答案)
- (2025年)四川省自貢市紀委監(jiān)委公開遴選公務員筆試試題及答案解析
- 2026屆江蘇省常州市高一上數(shù)學期末聯(lián)考模擬試題含解析
- 2026年及未來5年市場數(shù)據(jù)中國水質監(jiān)測系統(tǒng)市場全面調研及行業(yè)投資潛力預測報告
- 2026安徽省農村信用社聯(lián)合社面向社會招聘農商銀行高級管理人員參考考試試題及答案解析
- 強夯地基施工質量控制方案
- 藝考機構協(xié)議書
- 2025年12月27日四川省公安廳遴選面試真題及解析
- 2025-2030中國海洋工程裝備制造業(yè)市場供需關系研究及投資策略規(guī)劃分析報告
- 《生態(tài)環(huán)境重大事故隱患判定標準》解析
- 2025年度吉林省公安機關考試錄用特殊職位公務員(人民警察)備考筆試試題及答案解析
評論
0/150
提交評論