动态调试 OD篇
動態(tài)分析分為用戶模式和內(nèi)核模式
*用戶模式調(diào)試器是指用來調(diào)試用戶模式應(yīng)用程序的調(diào)試器,
*內(nèi)核模式調(diào)試器是指能調(diào)試系統(tǒng)內(nèi)核的調(diào)試器
OllyDbg
1、 ollyDbg是一款具有可視化界面的用戶模式調(diào)試器,可以在各種版本的windows上運行,一般只能分析32位的可執(zhí)行程序
2、 ollyDbg的cpu窗口包括五個面板窗口,分別是反匯編面板,寄存器面板,信息面板,數(shù)據(jù)面板和棧面板
*反匯編面板窗口的快捷鍵
Addres例:顯示被雙擊行地址的相對地址,再次雙擊返回標(biāo)準(zhǔn)地址模式。
Hex dump: 設(shè)置或取消無條件斷點,對應(yīng)的快捷鍵是“F2”鍵。
Dissassembly: 調(diào)用匯編器,可直接修改匯編代碼,對應(yīng)的快捷鍵是空格鍵。
Comment :允許增加或編輯注釋,對應(yīng)的快捷鍵是“;”鍵。
從鍵盤上選擇多行,可按“shift”鍵和上下鍵,也可以右鍵菜單命令執(zhí)行,
按“Ctrl”鍵按上下光標(biāo)鍵,可逐行滾動匯編窗口
*數(shù)據(jù)面板窗口
要顯示指定內(nèi)存地址的數(shù)據(jù),可單擊右鍵快捷菜單中的“Go to experssion”命令,或按“Ctrl+G”快捷鍵,打開地址窗口輸入地址
3、單步跟蹤
Ctrl +F9 知道出現(xiàn)ret指令時中斷。
Alt+F9 若進(jìn)入系統(tǒng)領(lǐng)空,此命令可瞬間回到應(yīng)用程序領(lǐng)空。
*所謂的領(lǐng)空實際上是指在某一時刻CPU的CS:EIP指向的某段代碼的所有者。
*在進(jìn)入子程序的過程中,若想回看之前單步跟蹤的代碼,可以按“-”(減號)鍵;
*若想讓光標(biāo)回到當(dāng)前EIP所指向的語句,可以單擊C按鈕或者雙擊EIP寄存器。
如果程序進(jìn)入死循環(huán),可以按“F12”鍵暫停程序。
4、設(shè)置斷點
設(shè)置斷點后按“Alt+B”快捷鍵或者單擊B按鈕,可以打開斷點窗口。
*其中“Always”表示斷點處于激活狀態(tài),“Disable”表示斷點停用。
空格鍵可以切換其狀態(tài)。也可以通過右鍵快捷菜單管理折現(xiàn)斷點。
按“Ctrl +G”快捷鍵打開跟隨表達(dá)式窗口。可以搜索API函數(shù)
*在windows 9x中,OllyDbg無法隊API函數(shù)入口點設(shè)置斷點,因此不能用此方法設(shè)置斷點
在返回變窗口中單擊右鍵,在彈出的快捷菜單中選擇“Search for-Name(label)in eurrent module ”(查找當(dāng)前模塊的名稱)選項或按“Ctrl+N”快捷鍵,獲取當(dāng)前程序的API名稱的列表
API函數(shù)的定義
API函數(shù)大都采用 _stdcall調(diào)用約定,即函數(shù)入口參數(shù)按從右到左的順序入棧,由被調(diào)用著清理棧中的參數(shù),返回值放在eax寄存器中。
通過屏蔽程序的某些功能或改變程序流程時程序的保護(hù)方式失效的方法稱為“爆破”
按“Ctrl”快捷鍵,輸入地址,可以查看數(shù)據(jù)窗口,
.常用斷點
常用的斷點由INT 3 斷點、硬件斷點、內(nèi)存斷點、消息斷點等
5.INT 3 斷點
當(dāng)執(zhí)行一個INT3斷點時,該地址處的內(nèi)容被調(diào)試器用INT 3指令替換了。實際上就是被替換成了“CC”
*使用INT 3斷點的有點時可以設(shè)置無數(shù)個斷點,缺點是改變了原程序機(jī)械碼,容易被軟件檢測到。(躲過檢測的方法時將斷點設(shè)在函數(shù)內(nèi)部或末尾,列如設(shè)在函數(shù)入口的下一行
6、硬件斷點
硬件斷點與DRx調(diào)試寄存器有關(guān)
DRx調(diào)試寄存器共有8個(DR0~DR7),每個寄存器特性如下
DR0~DR3:調(diào)試地址寄存器,用于保存需要監(jiān)視的地址,例如設(shè)置硬件斷點
DR4~DR5:保留未公開具體應(yīng)用
DR6:調(diào)試寄存器組狀態(tài)寄存器
DR7:調(diào)試寄存器組狀態(tài)就差年起。
硬件斷點的原理時使用DR0~DR3設(shè)定地址,并使用DR7設(shè)定狀態(tài)。
硬件執(zhí)行斷點與CC斷點的作用一樣,但因為硬件執(zhí)行斷點不會將首字節(jié)修改為“CC”,所以更難檢測。
設(shè)斷的方法是在指定的代碼單擊右鍵,執(zhí)行快捷菜單中的“Breakpoint”->Hardware,on execution“(斷點->硬件執(zhí)行)命令
刪除硬件斷點,單擊菜單項“Dbug“——>”Hardware breakpoints”(調(diào)試->硬件斷點)打開硬件斷點版面,單擊Deletex,刪除相應(yīng)斷點。
硬件斷點的優(yōu)點是速度快沒在INT3斷點容易被發(fā)現(xiàn)的地方使用硬件斷點會有很好的效果,缺點是最多只能使用4個斷點。
7、內(nèi)存斷點
ollyDbg可以設(shè)置內(nèi)存訪問斷點和內(nèi)存寫入斷點,原理是對所設(shè)的地址賦予不可訪問的/不可寫屬性。
因為每次都要通過比較來確定是否應(yīng)該中斷,所以內(nèi)存斷點會降低OllyDbg的執(zhí)行速度——可能是考慮到執(zhí)行速度規(guī)定只能下一個內(nèi)存斷點吧
硬件斷點會中斷在程序觸發(fā)硬件寫入斷點的下一條指令處,所以硬件斷點是在觸發(fā)硬件斷點的下一條指令處下斷,而內(nèi)存斷點是在觸發(fā)斷點的指令處下斷
內(nèi)存代碼不修改源代碼,不會項INT3斷點那樣因為修改代碼被程序校驗而導(dǎo)致下斷失敗,
Windows對內(nèi)存使用段頁式的管理方式。在OllyDbg里按“Alt+M“快捷鍵顯示內(nèi)存,可以看到許多個段,每個段都有不可訪問、讀、寫、執(zhí)行屬性。下斷點的快捷鍵式F2用與對整個內(nèi)存塊設(shè)置該類斷點。這個斷點是一次性斷點,當(dāng)所在段被讀取或執(zhí)行時就會被中斷,中斷以后,斷點將會被刪除
8、消息斷點
Windows本身是消息驅(qū)動的,如果調(diào)試時沒有合適的斷點,可以嘗試使用消息斷點。
消息斷點與INT3斷點的區(qū)別在于:
*INT 3斷點可以在程序啟動之前設(shè)置,
*消息斷點只有在窗口被創(chuàng)建之后再能被設(shè)置并攔截信息
9、條件斷點
斷點在滿足一定條件時才會中斷,這類斷點稱為條件斷點。
*條件斷點是一個帶有條件表達(dá)式的普通INT3斷點,結(jié)果非零或者表達(dá)式有效,則斷點生效
**在地址處設(shè)置條件斷點的快捷鍵“shift+F2“。
在OllyDbg里,如果想得到第一個參數(shù)的內(nèi)存地址,可以使用“【ESP+4】;如果想得到此地址指向的字符串,就必須使用”【【ESP+4】】“.
***在函數(shù)的第一行按快捷鍵“Shift+F4“,可以打開條件窗口記錄窗口。
10、調(diào)試符號
調(diào)試符號時被調(diào)試程序的二進(jìn)制信息與原程序信息之間的橋梁,是在編譯器將源文件編譯為可執(zhí)行程序的過程中為支持調(diào)試而摘錄的調(diào)試信息。
*調(diào)試信息包括變量、類型。函數(shù)名。源代碼行等。
目前看的不是很明白暫時跳過
11、OllyDbg的常見問題
*亂碼問題
這是因為OD將這段代碼當(dāng)成了數(shù)據(jù),沒進(jìn)行反匯編識別。此時只要執(zhí)行右鍵快捷菜單中的“Analysis->”Analyse code“(”分析”—”分析代碼“)命令或者按“Ctrl+A”快捷鍵,強(qiáng)迫OD重新分析代碼即可,如果還是無法識別,可以嘗試執(zhí)行右鍵快捷菜單中的“Analysis->”Remove analysis form module”(“分析”—“從模塊中刪除分析”)命令或在UDD目錄中刪除相對應(yīng)的UDD文件
OD修改EIP
將光標(biāo)移到需要修改的地址上,執(zhí)行右鍵快捷菜單中的“New origin here”(在此處新建EIP)命令或使用快捷鍵”Ctrl+”,即可修改EIP。
*UDD
OD將所有與程序或模板相關(guān)的信息保存在單獨的文件中,以便在模板重新加載時繼續(xù)使用,這些信息包括標(biāo)簽、注釋、斷點、監(jiān)視、分析數(shù)據(jù)、條件等
*已經(jīng)刪除了斷點,OD重新加載時這些斷點重新出現(xiàn)
將配置文件ollydbg,ini中相應(yīng)內(nèi)容改成“Back UDD files =1”,即可解決
*微調(diào)窗口顯示 “Ctrl+上下鍵”對反匯編或數(shù)據(jù)窗口翻動1字節(jié)。
總結(jié)
- 上一篇: Yahoo中文
- 下一篇: 程序员都在用的电脑小技巧,一遍就学会,每