:下載安裝到斷點(diǎn)調(diào)試實(shí)戰(zhàn)指南)
1. 寫(xiě)在最前面為什么要從OllyDbg開(kāi)始OllyDbg圈內(nèi)人通常直接叫它“OD”是Windows平臺(tái)上一款經(jīng)典的32位用戶(hù)態(tài)調(diào)試器。很多剛接觸軟件分析、逆向工程或者二進(jìn)制安全的朋友第一次聽(tīng)說(shuō)“調(diào)試器”這個(gè)概念十有八九都是從OllyDbg開(kāi)始的。即便現(xiàn)在x64dbg、IDA Pro這些工具已經(jīng)很流行OllyDbg在32位程序調(diào)試、殼分析、算法逆向這些場(chǎng)景里依然有大量擁躉很多老教程、論壇帖子、CTF比賽的題解里提到的“OD”都是指它。這篇文章寫(xiě)給完全零基礎(chǔ)的人。我不會(huì)一上來(lái)就堆術(shù)語(yǔ)而是從“為什么要用OD”“OD能干什么”講起接著完整演示從下載、安裝到打開(kāi)第一個(gè)程序、看懂基本界面的全過(guò)程再補(bǔ)充一些我這些年實(shí)際用OD時(shí)踩過(guò)的坑和總結(jié)的經(jīng)驗(yàn)。文章里涉及的所有步驟你都可以照著一步步操作不需要任何前置基礎(chǔ)。需要提前說(shuō)明的是OllyDbg本身是一個(gè)調(diào)試分析工具常用于軟件調(diào)試、漏洞研究、惡意代碼分析、CTF逆向等合法場(chǎng)景。如果你用它來(lái)繞過(guò)軟件授權(quán)、破解商業(yè)軟件那會(huì)涉及法律風(fēng)險(xiǎn)本文不鼓勵(lì)也不討論這類(lèi)用途。2. 先搞清楚OllyDbg到底是什么能做什么2.1 調(diào)試器的工作邏輯斷點(diǎn)、單步、內(nèi)存要理解OllyDbg的價(jià)值得先理解“調(diào)試”這件事。平時(shí)你寫(xiě)代碼程序出錯(cuò)了一般會(huì)看報(bào)錯(cuò)信息、加日志輸出。但這套方法在分析別人的程序、或者在沒(méi)有源代碼的情況下根本行不通——你不能往別人編譯好的exe里隨便加printf。這時(shí)候就需要調(diào)試器。調(diào)試器的核心能力就三樣斷點(diǎn)讓程序在指定位置暫停下來(lái)你可以慢慢觀察現(xiàn)場(chǎng)。單步讓程序每次只執(zhí)行一條指令逐條觀察程序的走向。內(nèi)存與寄存器查看程序暫停時(shí)所有變量、數(shù)據(jù)結(jié)構(gòu)、函數(shù)參數(shù)都留在了內(nèi)存和寄存器里調(diào)試器可以隨時(shí)查閱和修改。OllyDbg把這三樣能力做到了極其順手。它的界面雖然初看密密麻麻但實(shí)際上信息密度很高熟練之后操作效率極高。很多人覺(jué)得OD“老”“界面丑”卻依然離不開(kāi)它核心原因就是它在32位動(dòng)態(tài)調(diào)試上的體驗(yàn)依然很能打。2.2 為什么選OllyDbg而不是別的工具現(xiàn)在可選的調(diào)試器其實(shí)很多。x64dbg是目前64位調(diào)試的主流選擇WinDbg更偏內(nèi)核和系統(tǒng)級(jí)調(diào)試IDA Pro則強(qiáng)在靜態(tài)分析和反編譯。那為什么新手入門(mén)還是推薦OllyDbg門(mén)檻低OD不需要復(fù)雜配置下載解壓就能用圖形界面所見(jiàn)即所得。資料多大量逆向入門(mén)教程、破解分析文章、論壇帖子都以O(shè)D為演示工具跟著老教程學(xué)不會(huì)遇到“工具對(duì)不上”的問(wèn)題。功能完整斷點(diǎn)、內(nèi)存斷點(diǎn)、硬件斷點(diǎn)、條件斷點(diǎn)、Trace、補(bǔ)丁、腳本插件一應(yīng)俱全32位場(chǎng)景下幾乎什么都能干。輕量對(duì)系統(tǒng)依賴(lài)少在虛擬機(jī)里跑也很流暢適合放在隔離環(huán)境里做分析。當(dāng)然OD確實(shí)只支持32位程序而且官方版早已停止更新。但這不影響它作為入門(mén)工具的價(jià)值。就像學(xué)手動(dòng)擋開(kāi)車(chē)雖然費(fèi)勁但能幫助你理解變速箱的工作原理之后再開(kāi)自動(dòng)擋就毫無(wú)障礙。OllyDbg能幫你把“調(diào)試到底是怎么回事”這件事徹底搞明白。2.3 實(shí)用場(chǎng)景OD一般用在什么地方軟件逆向分析在沒(méi)有源碼的情況下通過(guò)動(dòng)態(tài)調(diào)試還原程序的運(yùn)行邏輯。算法還原程序里有個(gè)關(guān)鍵算法比如注冊(cè)碼校驗(yàn)、序列號(hào)生成通過(guò)OD下斷點(diǎn)、追蹤函數(shù)調(diào)用把算法邏輯一點(diǎn)點(diǎn)理清楚。惡意代碼分析分析木馬、病毒樣本時(shí)在虛擬機(jī)里用OD單步跟蹤觀察樣本到底做了什么操作。CTF競(jìng)賽Reverse方向的題目用OD做動(dòng)態(tài)驗(yàn)證配合靜態(tài)分析還原flag校驗(yàn)邏輯。軟件調(diào)試與兼容性排查排查一些沒(méi)有源碼的舊程序崩潰問(wèn)題、查看函數(shù)調(diào)用流程??吹竭@里你應(yīng)該明白了OllyDbg不是一個(gè)“破解工具”而是一個(gè)通用的動(dòng)態(tài)分析工具。它的定位類(lèi)似于醫(yī)生的聽(tīng)診器、修車(chē)師傅的萬(wàn)用表——工具本身是中性的關(guān)鍵是看用的人拿它做什么。3. 下載前必須知道的三件事3.1 版本選擇原版、漢化版、吾愛(ài)破解版怎么選OllyDbg有兩個(gè)大版本只有1.x的經(jīng)典版才是多數(shù)人說(shuō)的“OD”2.x版本的UI和操作邏輯變化很大資料少、插件兼容性也差新手不建議碰。在1.x版本內(nèi)部又分成了官方原版OllyDbg 1.10作者Oleh Yuschuk發(fā)布的原始版本界面英文功能穩(wěn)定但很多操作細(xì)節(jié)反人類(lèi)。漢化版本漢化作者把界面翻譯成了中文降低了上手門(mén)檻但有時(shí)漢化不完全個(gè)別術(shù)語(yǔ)翻譯得也有點(diǎn)奇怪。吾愛(ài)破解修改版這是國(guó)內(nèi)逆向論壇吾愛(ài)破解基于原版集成了大量插件、修正了已知Bug的版本開(kāi)箱即用插件體系完整是絕大多數(shù)人的實(shí)際選擇。我的建議是如果你看英文界面沒(méi)有障礙直接下載原版1.10即可如果想降低初學(xué)門(mén)檻選吾愛(ài)破解的OD修改版一般叫“吾愛(ài)破解版OllyDbg”或“ODbyDYK”。網(wǎng)上流傳的版本很多注意選擇評(píng)論區(qū)反饋較好的、日期較新的那一個(gè)。無(wú)論如何下載下來(lái)第一件事就是殺毒軟件掃一遍這是使用任何第三方工具的基本習(xí)慣。3.2 配套環(huán)境32位程序需要32位調(diào)試器OllyDbg 1.x是32位調(diào)試器只能調(diào)試32位應(yīng)用程序。如果你手上只有64位程序OD會(huì)比較吃力雖然可以通過(guò)一些手段間接調(diào)試但體驗(yàn)很差這種情況建議直接用x64dbg。另外如果你用的是64位的Windows系統(tǒng)OD本身可以正常運(yùn)行它是32位程序系統(tǒng)通過(guò)WoW64機(jī)制兼容運(yùn)行但調(diào)試的調(diào)試對(duì)象應(yīng)該優(yōu)先選擇32位的exe。我見(jiàn)過(guò)不少新手拿OD去打開(kāi)一個(gè)64位程序結(jié)果要么識(shí)別不了要么信息完全錯(cuò)亂然后就誤以為OD壞了。這不是工具的問(wèn)題是架構(gòu)匹配的問(wèn)題。3.3 運(yùn)行環(huán)境建議在虛擬機(jī)里分析做逆向分析、特別是分析不明來(lái)源的程序時(shí)強(qiáng)烈建議在虛擬機(jī)里操作。VMware或VirtualBox都行裝一個(gè)Windows 7或Windows 10 x86的虛擬機(jī)作為分析環(huán)境。原因很簡(jiǎn)單隔離風(fēng)險(xiǎn)程序真要搞破壞損失的只是一個(gè)快照。環(huán)境干凈虛擬機(jī)里可以隨時(shí)還原不用擔(dān)心系統(tǒng)被裝了一堆亂七八糟的東西。快照功能分析前后各打一個(gè)快照一旦崩了、壞了幾秒鐘恢復(fù)到正常狀態(tài)。OllyDbg本身不需要安裝解壓即用。所以整個(gè)環(huán)境搭建的成本非常低。4. 完整下載與安裝步驟詳解4.1 下載渠道與文件校驗(yàn)第一步是獲取OllyDbg。原版1.10的下載地址是作者的官方網(wǎng)站需要說(shuō)明的是官網(wǎng)目前仍然可以訪(fǎng)問(wèn)文件很小大約1MB出頭。如果你下載的是吾愛(ài)破解修改版文件會(huì)大一些一般在3MB到10MB之間因?yàn)榧闪撕芏嗖寮?。文件下載完成后建議先用殺毒軟件掃一遍再用文件校驗(yàn)工具如HashCalc、7-Zip自帶的校驗(yàn)功能核對(duì)一下文件的哈希值。很多人忽略這一步但這是安全習(xí)慣問(wèn)題。你將要運(yùn)行的是一個(gè)調(diào)試器它本身權(quán)限很大如果拿到的是被篡改的版本后果不堪設(shè)想。提示OllyDbg是高度敏感的逆向工具某些殺毒軟件會(huì)誤報(bào)為“黑客工具”或“風(fēng)險(xiǎn)軟件”。如果殺毒軟件報(bào)毒先別急著刪除。對(duì)照你下載來(lái)源的哈希值如果一致大概率是誤報(bào)如果哈希對(duì)不上那就要高度警惕了。4.2 解壓即用不需要安裝程序OllyDbg不需要安裝你只需要把它解壓到指定目錄即可。這里有一個(gè)很重要的細(xì)節(jié)解壓路徑不要包含中文和空格。為什么因?yàn)镺D的插件機(jī)制是通過(guò)加載動(dòng)態(tài)鏈接庫(kù)來(lái)實(shí)現(xiàn)的一些老舊的插件在處理路徑時(shí)沒(méi)有做好Unicode兼容路徑一旦出現(xiàn)中文就可能加載失敗。我見(jiàn)過(guò)有人把OD放在“C:\Users\張三\Desktop\調(diào)試工具\(yùn)”下面結(jié)果插件全部加載不出來(lái)功能殘缺。推薦的做法是放在一個(gè)干凈路徑下比如C:\tools\OllyDbg\D:\Reverse\OD\C:\Users\你的用戶(hù)名\Desktop\OD\桌面路徑一般沒(méi)有問(wèn)題但注意用戶(hù)名如果是中文實(shí)際上路徑也會(huì)包含中文這一點(diǎn)和上面的問(wèn)題同理建議放到非用戶(hù)目錄4.3 啟動(dòng)之前目錄結(jié)構(gòu)認(rèn)識(shí)解壓完成后打開(kāi)文件夾你會(huì)看到一堆文件。核心的文件和目錄如下文件/目錄作用說(shuō)明OllyDbg.exe主程序雙擊即可啟動(dòng)OllyDbg.ini配置文件記錄界面布局、斷點(diǎn)等設(shè)置刪除后OD會(huì)恢復(fù)默認(rèn)UDD目錄用戶(hù)數(shù)據(jù)目錄存放分析記錄、注釋、標(biāo)簽等非常重要插件文件.dll擴(kuò)展功能啟動(dòng)時(shí)自動(dòng)加載到插件菜單很多新手不知道UDD目錄是干嘛的。簡(jiǎn)單說(shuō)你每次分析程序時(shí)做的注釋、下的斷點(diǎn)、修改過(guò)的指令OD都會(huì)自動(dòng)保存到這個(gè)目錄下下次打開(kāi)同一個(gè)程序時(shí)會(huì)自動(dòng)恢復(fù)。所以如果有一天你發(fā)現(xiàn)自己的注釋全沒(méi)了大概率是這個(gè)目錄被清理了。4.4 第一次啟動(dòng)配置優(yōu)化雙擊OllyDbg.exe程序啟動(dòng)后會(huì)顯示一個(gè)類(lèi)似匯編代碼的窗口。第一次啟動(dòng)時(shí)有一些設(shè)置建議提前調(diào)好打開(kāi)菜單“選項(xiàng)”——“界面選項(xiàng)”O(jiān)ptions - Appearance把語(yǔ)言切換成中文。如果你下載的是漢化版這步可以跳過(guò)。打開(kāi)“選項(xiàng)”——“調(diào)試設(shè)置”O(jiān)ptions - Debugging Settings在“事件”選項(xiàng)卡中勾選“系統(tǒng)斷點(diǎn)”和“入口斷點(diǎn)”。這兩個(gè)斷點(diǎn)會(huì)在程序加載和到達(dá)程序入口點(diǎn)時(shí)自動(dòng)暫停方便你在程序真正運(yùn)行之前做初步分析。在“反匯編”選項(xiàng)卡中把“顯示數(shù)值”調(diào)整為十六進(jìn)制。十六進(jìn)制是逆向分析的基礎(chǔ)進(jìn)制看不懂十六進(jìn)制等于看不懂調(diào)試器。配置完成后可以關(guān)掉OD再重新打開(kāi)確認(rèn)設(shè)置生效。到這里安裝環(huán)節(jié)就全部結(jié)束了。整個(gè)過(guò)程用不了5分鐘對(duì)比那些動(dòng)輒幾個(gè)GB、裝完還要配環(huán)境的IDEOD真的是輕量到感人。5. 第一次實(shí)戰(zhàn)加載程序并看懂主界面5.1 加載目標(biāo)程序三種方式OD的調(diào)試對(duì)象是exe、dll等可執(zhí)行文件。加載方式有三種任選其一即可菜單操作文件 - 打開(kāi)選擇你要調(diào)試的exe文件。拖拽操作直接把exe文件拖到OD的界面上。命令行加載文件 - 附加選擇已經(jīng)在運(yùn)行的程序進(jìn)程。第三種“附加”用于調(diào)試已經(jīng)運(yùn)行的程序常用于分析運(yùn)行中的惡意進(jìn)程新手先了解即可重點(diǎn)掌握前兩種。注意OD對(duì)中文文件名和中文路徑的支持不好建議在分析之前把要調(diào)試的exe復(fù)制到一個(gè)純英文路徑下。比如新建一個(gè)C:\Users\你的用戶(hù)名\Desktop\Debug\文件夾把exe放進(jìn)去再加載。路徑中如果包含中文OD有可能加載失敗或顯示亂碼。5.2 主界面四大窗口從上到下依次認(rèn)識(shí)OllyDbg啟動(dòng)并加載程序后主界面分成幾個(gè)核心區(qū)域。新手第一次看到密密麻麻的十六進(jìn)制和匯編指令確實(shí)容易懵。但別怕每個(gè)區(qū)域的功能其實(shí)很清晰反匯編窗口左上角這是OD最核心的窗口顯示的是程序的匯編指令。每一行都是一條CPU指令比如mov eax, dword ptr [401000]、call 00401234。程序正在執(zhí)行的代碼會(huì)高亮顯示。你所做的大部分操作都發(fā)生在這個(gè)窗口。寄存器窗口右上角顯示CPU當(dāng)前所有的寄存器值。寄存器是CPU內(nèi)部的存儲(chǔ)單元可以理解為CPU工作時(shí)的“草稿紙”。EAX、EBX、ECX、EDX是通用寄存器EIP是當(dāng)前指令地址ESP是棧頂指針。程序暫停時(shí)這些值就是程序的“現(xiàn)場(chǎng)快照”。內(nèi)存窗口右下角顯示程序內(nèi)存中的數(shù)據(jù)。可以理解為程序運(yùn)行時(shí)的“倉(cāng)庫(kù)”里面存放著各種變量、字符串、數(shù)據(jù)結(jié)構(gòu)。堆棧窗口左下角顯示程序調(diào)用棧的內(nèi)容。函數(shù)調(diào)用時(shí)參數(shù)、返回地址、局部變量都會(huì)被壓入棧中。當(dāng)程序運(yùn)行到關(guān)鍵函數(shù)時(shí)這個(gè)窗口能直接告訴你參數(shù)是怎么傳的、返回到哪里去。這四個(gè)窗口的組合相當(dāng)于你在程序運(yùn)行時(shí)獲得了一個(gè)“上帝視角”既能看到正在執(zhí)行的每一條指令也能看到CPU狀態(tài)和數(shù)據(jù)存儲(chǔ)狀態(tài)。5.3 一條指令的執(zhí)行F8單步到底會(huì)發(fā)生什么在反匯編窗口里你按下F8鍵程序會(huì)執(zhí)行當(dāng)前高亮的那一條指令然后停在下一行。這就是“單步”。整個(gè)過(guò)程你可以通過(guò)寄存器窗口觀察到變化。舉個(gè)例子當(dāng)當(dāng)前指令是mov eax, 0x12345678時(shí)你按F8執(zhí)行后寄存器窗里的EAX就會(huì)變成0x12345678。如果當(dāng)前指令是一個(gè)call函數(shù)調(diào)用按F8會(huì)一次性執(zhí)行完整個(gè)函數(shù)再停下而按F7會(huì)進(jìn)入函數(shù)內(nèi)部逐條執(zhí)行。F7和F8的差別是初學(xué)者最容易混淆的地方記住一句話(huà)就夠F8步過(guò)F7步入。F8Step Over執(zhí)行完當(dāng)前函數(shù)不進(jìn)入內(nèi)部。F7Step Into進(jìn)入當(dāng)前函數(shù)內(nèi)部。F9Run直接運(yùn)行到下一個(gè)斷點(diǎn)。CtrlF2重新開(kāi)始調(diào)試。F2在光標(biāo)所在行設(shè)置或取消斷點(diǎn)。這五個(gè)快捷鍵是OD最核心的操作把這五個(gè)用熟OD就已經(jīng)學(xué)會(huì)一半了。5.4 第一個(gè)斷點(diǎn)讓程序在指定位置停下來(lái)斷點(diǎn)的作用是在程序執(zhí)行到某一地址時(shí)強(qiáng)制暫停。設(shè)置斷點(diǎn)最簡(jiǎn)單的方法是在反匯編窗口定位到目標(biāo)指令行按F2。該行的地址會(huì)變成紅色運(yùn)行程序后執(zhí)行到這一行就會(huì)自動(dòng)停下。你可以臨時(shí)測(cè)試一下加載任意一個(gè)程序在入口點(diǎn)處按F2設(shè)斷點(diǎn)然后按F9運(yùn)行程序會(huì)立即在入口點(diǎn)暫停。此時(shí)查看寄存器窗口的EIP你會(huì)發(fā)現(xiàn)它正好指向你設(shè)置斷點(diǎn)的那條指令。這就是斷點(diǎn)的工作原理程序執(zhí)行到這一步時(shí)CPU產(chǎn)生了一個(gè)中斷OD接管了程序的控制權(quán)等待你的下一步指令。斷點(diǎn)是調(diào)試的核心武器。分析一個(gè)程序時(shí)你一般會(huì)在關(guān)鍵的API調(diào)用處、關(guān)鍵的指令處設(shè)置多個(gè)斷點(diǎn)然后讓程序全速運(yùn)行每觸發(fā)一個(gè)斷點(diǎn)就停下來(lái)觀察一次狀態(tài)分析完再按F9繼續(xù)運(yùn)行。這比逐條單步快得多也精準(zhǔn)得多。6. 一個(gè)可復(fù)現(xiàn)的完整實(shí)操案例6.1 準(zhǔn)備一個(gè)目標(biāo)程序?yàn)榱俗屇銓?duì)整體的調(diào)試流程有一個(gè)完整認(rèn)識(shí)我準(zhǔn)備了一個(gè)很簡(jiǎn)單的實(shí)驗(yàn)。用任意語(yǔ)言C、Python打包的exe也行寫(xiě)一個(gè)程序功能是輸出一行文字“Please enter your name:”接收用戶(hù)輸入一個(gè)用戶(hù)名判斷用戶(hù)名長(zhǎng)度是否大于等于4如果長(zhǎng)度大于等于4輸出“Welcome!”否則輸出“Name too short!”程序退出這個(gè)程序雖然簡(jiǎn)單但它包含了字符串比較、分支判斷、函數(shù)調(diào)用等典型邏輯非常適合用來(lái)演示OD的整個(gè)調(diào)試周期。6.2 定位關(guān)鍵代碼字符串引用法程序編譯好后用OD加載并運(yùn)行按F9。程序會(huì)在命令行窗口等待輸入這時(shí)候你隨便輸入一個(gè)名字程序根據(jù)長(zhǎng)度決定輸出內(nèi)容。接下來(lái)我們要在OD里找到那句“Name too short!”的代碼位置。方法是在反匯編窗口右鍵 - “查找” - “所有參考文本字符串”Search for - All referenced text strings或直接按CtrlB快捷鍵打開(kāi)字符串查找窗口這個(gè)窗口會(huì)列出程序加載到內(nèi)存中的所有可見(jiàn)字符串。在其中找到Name too short!雙擊它OD會(huì)自動(dòng)跳轉(zhuǎn)到引用這個(gè)字符串的代碼位置。在這個(gè)位置往前看大概率會(huì)看到一個(gè)比較指令cmp和一個(gè)跳轉(zhuǎn)指令jump這就是程序進(jìn)行“長(zhǎng)度判斷”的邏輯所在。6.3 下斷點(diǎn)并觀察分支走向在跳轉(zhuǎn)指令那一行按F2設(shè)置斷點(diǎn)然后重新運(yùn)行程序CtrlF2再按F9。輸入一個(gè)長(zhǎng)度小于4的名字程序就會(huì)觸發(fā)斷點(diǎn)停在跳轉(zhuǎn)指令前。此時(shí)看寄存器窗口和標(biāo)志寄存器EFLAGS你會(huì)發(fā)現(xiàn)有一個(gè)標(biāo)志位被置位或清除了這個(gè)標(biāo)志位決定了那個(gè)跳轉(zhuǎn)指令是“跳”還是“不跳”。通過(guò)修改標(biāo)志位你就可以控制程序的走向。按空格鍵或右鍵 - “二進(jìn)制” - “填充”可以修改當(dāng)前指令。比如把jne不相等則跳轉(zhuǎn)改成jmp無(wú)條件跳轉(zhuǎn)或者直接把跳轉(zhuǎn)條件改掉程序的行為就會(huì)被改變。這種修改可以一直保存到exe文件里這就是很多人說(shuō)的“打補(bǔ)丁”。6.4 從實(shí)戰(zhàn)視角理解函數(shù)調(diào)用流程把斷點(diǎn)設(shè)置在printf或scanf的調(diào)用處單步跟蹤你會(huì)發(fā)現(xiàn)這些函數(shù)被調(diào)用之前程序總會(huì)把一些數(shù)據(jù)壓入棧push指令或存入寄存器。這就是函數(shù)參數(shù)的傳遞過(guò)程。在32位程序中函數(shù)參數(shù)一般通過(guò)棧傳遞調(diào)用者先把參數(shù)按從右到左的順序壓棧然后執(zhí)行call指令被調(diào)用函數(shù)從棧中取出參數(shù)。這個(gè)機(jī)制在堆棧窗口里看得一清二楚當(dāng)程序停在某個(gè)call指令時(shí)堆棧窗口頂部依次排列的就是函數(shù)的返回地址和參數(shù)。理解了這個(gè)機(jī)制你就理解了絕大多數(shù)32位程序的調(diào)用約定之后再去看逆向教程、分析復(fù)雜程序就有了底層基礎(chǔ)。7. 常見(jiàn)問(wèn)題與排查技巧實(shí)錄7.1 OD打不開(kāi)程序提示“無(wú)法啟動(dòng)”這個(gè)問(wèn)題的原因一般是路徑問(wèn)題或權(quán)限問(wèn)題。首先確認(rèn)exe路徑是否包含中文、空格較多其次確認(rèn)exe本身是否能獨(dú)立正常運(yùn)行最后以管理員身份運(yùn)行OD試試。如果程序使用了加殼保護(hù)OD可能無(wú)法正確分析入口點(diǎn)這種情況需要先脫殼這是一個(gè)更大的話(huà)題新手暫時(shí)不用深入。7.2 打開(kāi)64位程序后界面顯示亂碼或信息不對(duì)OD 1.x的核心功能只支持32位程序。你用OD打開(kāi)64位exe它能加載但反匯編的代碼會(huì)非常奇怪寄存器信息也不完整。這不代表工具壞了而是架構(gòu)不匹配。處理方法是要么找對(duì)應(yīng)的32位版本的exe要么換用x64dbg。7.3 程序在OD里跑不起來(lái)一運(yùn)行就崩潰很多程序本身帶有反調(diào)試機(jī)制。它們會(huì)檢測(cè)自己是否處于被調(diào)試狀態(tài)一旦發(fā)現(xiàn)被調(diào)試就主動(dòng)退出、崩潰或者走一條假分支。初學(xué)時(shí)不必深入研究反調(diào)試先把OD的“隱藏調(diào)試器”選項(xiàng)打開(kāi)選項(xiàng) - 調(diào)試設(shè)置 - 高級(jí) - 隱藏調(diào)試器再不行就換一個(gè)簡(jiǎn)單的exe練習(xí)。7.4 斷點(diǎn)設(shè)置不了或者設(shè)置了不生效先確認(rèn)程序是否處于暫停狀態(tài)。OD里有一個(gè)規(guī)則程序在運(yùn)行時(shí)斷點(diǎn)操作不一定生效程序暫停時(shí)設(shè)置斷點(diǎn)才穩(wěn)妥。另外斷點(diǎn)地址必須是有效的可執(zhí)行地址如果當(dāng)前行是數(shù)據(jù)區(qū)比如字符串地址斷點(diǎn)是無(wú)效的。還有一點(diǎn)如果目標(biāo)程序代碼段是只讀的OD需要修改內(nèi)存屬性才能設(shè)置斷點(diǎn)會(huì)出現(xiàn)延遲或失敗的情況這種情況可以通過(guò)“硬件斷點(diǎn)”代替。7.5 修改了指令但保存無(wú)效在OD中修改指令后需要在修改處右鍵 - “復(fù)制到可執(zhí)行文件” - “所有修改”然后再右鍵 - “保存文件”才能把修改寫(xiě)入exe。如果直接關(guān)閉OD所有修改都會(huì)丟失。原因是OD默認(rèn)只修改內(nèi)存鏡像不會(huì)自動(dòng)同步到磁盤(pán)文件。7.6 實(shí)用問(wèn)題速查表癥狀可能原因處理方法插件菜單為空路徑含中文或插件目錄被移動(dòng)把OD移到純英文路徑F9運(yùn)行后程序直接退出入口點(diǎn)被反調(diào)試檢測(cè)打開(kāi)隱藏調(diào)試器選項(xiàng)字符串窗口搜不到關(guān)鍵詞程序使用了加密字符串改用內(nèi)存斷點(diǎn)運(yùn)行時(shí)再搜索內(nèi)存寄存器值不會(huì)變當(dāng)前行是NOP或數(shù)據(jù)檢查EIP是否在正確指令上OD啟動(dòng)報(bào)錯(cuò)缺少DLL使用了精簡(jiǎn)版或被殺毒誤刪重新解壓添加信任區(qū)8. 新手進(jìn)階方向與學(xué)習(xí)方法建議8.1 先掌握匯編再深入調(diào)試OllyDbg的界面完全是匯編指令不懂匯編就很難看懂OD表達(dá)的信息。好消息是你不需要成為匯編專(zhuān)家只需要掌握常用指令的含義即可數(shù)據(jù)傳輸mov/push/pop、算術(shù)運(yùn)算add/sub/mul/div、跳轉(zhuǎn)jmp/je/jne/jg/jl、函數(shù)調(diào)用call/ret、比較cmp/test以及邏輯運(yùn)算and/or/xor/not掌握了這二十來(lái)個(gè)指令配合OD做動(dòng)態(tài)分析就沒(méi)有太大障礙了。8.2 熟悉Windows API調(diào)用規(guī)律分析軟件時(shí)你常常會(huì)遇到程序調(diào)用系統(tǒng)API。比如程序彈窗時(shí)調(diào)用MessageBoxW讀取文件時(shí)調(diào)用CreateFileW分配內(nèi)存時(shí)調(diào)用VirtualAlloc。在OD中給這些API的調(diào)用位置下斷點(diǎn)再通過(guò)堆棧窗口查看參數(shù)能快速定位程序的功能邏輯。這就是很多逆向分析工作的常規(guī)套路。8.3 多動(dòng)手、多復(fù)現(xiàn)、多思考學(xué)調(diào)試器和學(xué)游泳很像光看教程永遠(yuǎn)學(xué)不會(huì)。建議從簡(jiǎn)單的C語(yǔ)言程序開(kāi)始自己編譯成exe然后嘗試在OD里完成這些基礎(chǔ)任務(wù)找到main函數(shù)對(duì)應(yīng)的匯編代碼位置通過(guò)字符串定位核心分支邏輯通過(guò)修改指令跳過(guò)條件判斷跟蹤一個(gè)函數(shù)的參數(shù)和返回值導(dǎo)出并保存修改后的exe這些任務(wù)全部完成后你對(duì)OD的熟練度就已經(jīng)超過(guò)大多數(shù)新人了。接下來(lái)就可以去看公開(kāi)的逆向教程、CTF題解配合實(shí)際案例逐步深入。8.4 保持安全與合規(guī)意識(shí)最后必須強(qiáng)調(diào)調(diào)試分析技術(shù)是一把雙刃劍。它可以用于漏洞研究、安全分析、軟件兼容性調(diào)試這些合法用途也可以被濫用來(lái)破解軟件。我一直認(rèn)為學(xué)習(xí)逆向調(diào)試最好的姿態(tài)是保持好奇、保持克制。用OD去剖析一個(gè)程序的運(yùn)行邏輯像解謎一樣理解代碼的思維方式這個(gè)過(guò)程中的智力樂(lè)趣本身就很珍貴。不要去碰那些會(huì)讓你陷入法律風(fēng)險(xiǎn)的事情這條路才能走得長(zhǎng)遠(yuǎn)。說(shuō)實(shí)話(huà)我到現(xiàn)在還在用OD做32位程序的快速分析它可能界面老舊、不再更新但它那種“所見(jiàn)即所得”的調(diào)試體驗(yàn)至今沒(méi)有哪個(gè)工具能完全替代。希望你也能在動(dòng)手調(diào)試的過(guò)程中體會(huì)到那種一步步揭開(kāi)程序面紗的樂(lè)趣。先從下載一個(gè)OD、加載一個(gè)最簡(jiǎn)單的exe開(kāi)始吧。