动态分析之OllyDbg
OllyDbg調(diào)試器
準(zhǔn)備工作
使用之前要設(shè)置UDD文件和插件的路徑,一般設(shè)置成絕對(duì)路徑。
單擊“Options”-“Appearance”打開界面選項(xiàng)對(duì)話框,單擊“Directories”。
主界面:
在反匯編面板窗口的列中,雙擊可以完成如下操作。
●Address列:顯示被雙擊行地址的相對(duì)地址,再次雙擊返回標(biāo)準(zhǔn)地址模式。
●Hex dump列:設(shè)置或取消無條件斷點(diǎn),對(duì)應(yīng)的快捷鍵是“F2” 鍵。
●Disassembly 列:調(diào)用匯編器,可直接修改匯編代碼,對(duì)應(yīng)的快捷鍵是空格鍵。
●Comment 列:允許增加或編輯注釋,對(duì)應(yīng)的快捷鍵是“;”鍵。
OllyDbg界面的外觀由“Appearance”對(duì)話框里的“Fonts” “Colours" “Code highlighting" 標(biāo)簽頁控制,可以定制。
可以將OllyDbg 關(guān)聯(lián)到Windows資源管理器的右鍵快捷菜單里。關(guān)聯(lián)后,當(dāng)調(diào)試程序時(shí),只需要在EXE或DLL文件上單擊右鍵,就會(huì)出現(xiàn)“Open with Ollydbg”菜單項(xiàng)。要想實(shí)現(xiàn)關(guān)聯(lián),只需要先單擊“Options” →“Add to Explorer”選項(xiàng),再單擊“Add llyDbg to menu in Windows Explorer”按鈕。
為了讓OllyDbg中斷在程序的入口點(diǎn),單擊“Options”→“Debugging options” 選項(xiàng),單擊“Event” ,設(shè)置
OllyDbg對(duì)中斷入口點(diǎn)、模塊加載/卸載、線程創(chuàng)建/結(jié)束等事件的處理方式,將斷點(diǎn)設(shè)置在“WinMain”處。
調(diào)試技術(shù)
“F7”鍵和“F8”鍵的主要區(qū)別在于,若遇到call、loop等指令,按“F8”鍵會(huì)路過,按“F7”鍵會(huì)跟進(jìn)。
當(dāng)要重復(fù)按“F7” 鍵或“F8” 鍵時(shí),OllyDbg提供了快捷鍵“Ctrl+F7" 和“Ctrl+F8”, 直到用戶按“Esc”鍵、F12”鍵或遇到其他斷點(diǎn)時(shí)停止。
若想回看之前單步跟蹤的代碼,可以按“-” (減號(hào))鍵;若想讓光標(biāo)回到當(dāng)前EIP所指向的語句,可以單擊C按鈕或雙擊EIP寄存器(EIP指向當(dāng)前將要執(zhí)行的指令)。
當(dāng)位于某個(gè)call 指令中,想返回調(diào)用這個(gè)call 指令的位置時(shí),可以按“Ctrl+F9” 快捷鍵執(zhí)行“Execute till return” 命令, OllyDbg會(huì)停在遇到的第1個(gè)返回命令處( ret、retf或iret )。
如果已經(jīng)進(jìn)入系統(tǒng)DLL提供的API函數(shù),當(dāng)要返回應(yīng)用程序領(lǐng)空(指在某一時(shí)刻CPU的CS:EIP指向的某段代碼的所有者)時(shí),可以按快捷鍵“Alt+F9"
執(zhí)行"Execute till user code" 命令。
程序進(jìn)入死循環(huán)可以按F12暫停程序。
反匯編窗口右鍵選擇search for(查找)->Name(label) in current module(當(dāng)前模塊中的名稱(標(biāo)簽))。可以查找API函數(shù)名下斷點(diǎn)。
API函數(shù)大都采用_ stdeall 調(diào)用約定,即函數(shù)入口參數(shù)按從右到左的順序入棧,由被調(diào)用者清理?xiàng)V械膮?shù),返回值放在eax寄存器中。因此,對(duì)相關(guān)的API函數(shù),要分析其前面的push指令,這些指令將參數(shù)放入棧,以傳送給API調(diào)用。
修改內(nèi)存中的數(shù)據(jù)后,為了使修改一直有效,必須將這個(gè)變化寫進(jìn)磁盤文件。選中修改后的代碼,單擊右鍵,點(diǎn)擊“Copy to executable”→“Selection”
命令,將會(huì)打開文件編輯窗口。單擊右鍵,執(zhí)行快
捷菜單中的“Save File" 命令,即可將修改保存到文件中。
Hit trace
Hit trace能夠讓調(diào)試者辨別哪一部分代碼被執(zhí)行了,哪一部分沒有。
在選中區(qū)域的每一條命令處設(shè)置一個(gè)INT3斷點(diǎn),當(dāng)中斷發(fā)生時(shí),OllyDbg便把它去除。在使用Hit trace時(shí),不能在數(shù)據(jù)中設(shè)置斷點(diǎn),否則程序可能會(huì)崩潰。
當(dāng)遇到一段跳轉(zhuǎn)分支比較多的代碼,需要了解程序的執(zhí)行線路時(shí),可以使用Hit trace。選中這段代碼,單擊右鍵快捷菜單中的“Hit trace”→“Add selection”命令,將需要監(jiān)視的代碼選中,然后按“F9”鍵讓程序運(yùn)行,OllyDbg 就會(huì)在已被執(zhí)行的指令前用不同的顏色添加標(biāo)記。
常見問題
1、亂碼問題
使用OllyDbg跟蹤程序時(shí),可能會(huì)出現(xiàn)如下情況。
這是因?yàn)镺llyDbg將這段代碼當(dāng)成了數(shù)據(jù),沒有進(jìn)行反匯編識(shí)別。此時(shí),只要執(zhí)行OllyDbg 右鍵快捷菜單中的“Analysis” →“Analyse code” (“分析”→“分析代碼”)命令或按“Ctrl+A" 快捷鍵,強(qiáng)迫OllyDbg重新分析代碼即可。如果還是無法識(shí)別,可以嘗試執(zhí)行右鍵快捷菜單中的“Analysis”→“Remove analysis from module”(“分析”→“從模塊中刪除分析”)命令或在UDD目錄中刪除相應(yīng)的UDD文件。
2. OllyDbg 修改EIP
將光標(biāo)移到需要修改的地址上,執(zhí)行右鍵快捷菜單中的“New origin here” (在此處新建EIP )命
令或使用快捷鍵“Ctrl+*” 即可修改EIP。
3.已經(jīng)刪除了斷點(diǎn),OllyDbg重新加載時(shí)這些斷點(diǎn)重新出現(xiàn)
將配置文件olydbg.ini中的相應(yīng)內(nèi)容改成“ Backup UDD files=1"即可解決。
4.在OllyDbg反匯編窗口輸入“push E000”會(huì)提示未知標(biāo)識(shí)符
這是因?yàn)镺llyDbg的反匯編引擎不能正確識(shí)別字符“E000” 中的“E”是字母還是數(shù)字。解決方法是:在字母前加一個(gè)“0”, 表示這是數(shù)字,即“push 0E000”。
5. OllyDbg 出現(xiàn)“假死”現(xiàn)象
用OllyDbg調(diào)試一些加殼程序,程序運(yùn)行到斷點(diǎn)(包括硬件斷點(diǎn))時(shí),OllyDbg 會(huì)出現(xiàn)“假死”現(xiàn)象。解決方法是:打開配置文件ollydbgini,如果“ Restore windows“是一個(gè)很大的值,就設(shè)置“Restore windows 0”。
6.執(zhí)行復(fù)制到可執(zhí)行文件時(shí),提示錯(cuò)誤信息“Unable to locate data in executable file”
這里要修改的地方不在RawSize范圍內(nèi)。修改PE文件,使“RawSize = VirtualSize”。
7.把call調(diào)用改成函數(shù)名的形式
例如“call 401496",假設(shè)401496h處是amsg_ exit 函數(shù),將光標(biāo)停在該處,按“Shift +;”快捷鍵,會(huì)彈出一個(gè)標(biāo)簽框,在其中輸人字符“amsg _exit”, 所有調(diào)用401496h處的call指令都會(huì)變成“call "“的形式。
總結(jié)
以上是生活随笔為你收集整理的动态分析之OllyDbg的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux时区详解
- 下一篇: C++ 蒙特卡洛求积分