OD使用笔记
Alt+F9: 直接從系統(tǒng)模塊飛回程序模塊
Ctrl+F9: 執(zhí)行到當前函數(shù)的結(jié)尾
Ctrl+B: 搜索二進制字符串
F4: 執(zhí)行到選中的語句處
F9: 運行
F12: 暫停
Shift+F2: 條件斷點(軟件斷點的一種)
軟件斷點,硬件斷點以及內(nèi)存訪問斷點(一次只能設置一個):
內(nèi)存斷點的利用:?
在數(shù)據(jù)上下的斷點,如果讀取或?qū)懭朐摂?shù)據(jù)則會斷下來。
在內(nèi)存窗口右鍵選Search,?
在ASCII上輸入內(nèi)容,然后輸入搜索內(nèi)容
搜索到后,找到地址
下內(nèi)存斷點后點擊運行即可
下斷點的方法:
1. 命令方式
2. 搜索API設斷點:
給API設置斷點,一旦調(diào)用就會斷下
搜索機器碼
搜索Jmp命令
搜索命令
點擊Find即可找到了
按鈕事件斷點:
該斷點分不同語言不同情況
下面僅以易語言做例子:
易語言要在按下按鈕前,位于主模塊內(nèi)搜索Binary String然后搜索FF 55 FC 5F 5E。就可以按鈕事件的call處斷下。
如何查看堆內(nèi)存:
?或者直接d eax即可, 因為堆空間分配好后是從eax返回的
設置OD調(diào)試程序第一次中斷的時機:
有3種模式,可以是在進程啟動第一條啟動代碼處即System breakpoint或main函數(shù)的入口點。又或者WinMain處
?
?為被調(diào)試程序加上參數(shù)的方法:
可以在調(diào)試前便設置:
這樣添加的參數(shù)會在程序一開始就輸入
?
?如果程序已經(jīng)調(diào)試了想要再給入?yún)?shù):
這種方法加入?yún)?shù)實際上還是要重新調(diào)試程序,但也是一種方法
?
?調(diào)試運行中進程的方法:
?
?然后選中一個進程進行附著調(diào)試即可
?查看進程的內(nèi)存映射方法:
選擇View->Memory或者直接點藍色的M圖標都可以看到內(nèi)存映射
?查看線程和堆棧:
可以通過View->Threads來查看線程或者直接按藍色T按鈕。
?這個進程只有1個線程,一般復雜程序都有多個線程,選中一個線程右擊可以對其進行調(diào)度
?通過內(nèi)存映射頁面可以獲取主線程堆棧的內(nèi)存地址進而查看其內(nèi)存內(nèi)容
?調(diào)試DLL的方法:
dll是無法運行的,但Ollydbg使用一個叫l(wèi)oaddll.exe的虛擬程序加載被調(diào)試的dll。進入調(diào)試后dll會斷在DllMain函數(shù)入口處:
?如果希望調(diào)試dll內(nèi)的函數(shù), 可以按下F9使dll的初始化運行結(jié)束, OD又會被再次斷下:
?此時選擇Debug->Call DLL export:
?選擇你要調(diào)試的函數(shù), 比如我調(diào)試的是ws2_32.dll我選擇了socket():
?輸入對應參數(shù)然后按下call即可:
?標準回溯跟蹤:
+: 回退到下一條指令的位置
-: 回退到上一條指令的位置
?調(diào)用堆棧跟蹤:
查看當前函數(shù)的調(diào)用序列:
?運行跟蹤:
選中一條代碼然后右擊,選擇Run Trace->Add selection。
?接著View->Run trace后獲取Trace窗口后繼續(xù)調(diào)試:
?就可以發(fā)現(xiàn)運行過的指令被記錄下來了。利用+和-可以上下挪動指令來動態(tài)獲取其寄存器的值。其中Run Trace的Back代表上第幾條指令,其中0代表當前指令。
?還有另外一種運行跟蹤的方式, Debug中首先選中Set Condition:
?這里會選擇追蹤的條件,比如我這里是EIP位于0x400000~0x402000之間就進行追蹤
?完成之后, 可以通過Trace into和Trace over來進行追蹤調(diào)試(其作用和Step into和Step over是一樣的, 區(qū)別僅僅是它會追蹤), 當然可以使用Ctrl+F11和Ctrl+F12熱鍵來方便操作:
?當然了它的效果和之前的方法是一樣的。
?異常處理:
對于惡意代碼的分析,異常能越過就越過能不處理就盡量不處理,因為我們的目的不是為了修bug。基于這個原則在Debug->Debug Options中的Exceptions選項頁中可以選擇忽略異常。這里忽略了基本上所有的異常。
如果遇到不得不處理的情況, 在OD中可以使用如下方法:
Shift+F7: 進入異常
Shift+F8: 跳過異常
Shift+F9: 運行異常處理程序
用OD分析一段十六進制shellcode:
把shellcode復制到如何一種十六進制編輯器上:
?選中后右擊->Edit:
?以16進制方式復制:
在OD內(nèi)打開內(nèi)存映射界面, 選擇類型為Priv的段,Priv類型的段是分配給進程的私有內(nèi)存,可被多個進程共享:
?右擊后選中Set Access并賦予Full access權(quán)限,即讀寫執(zhí)行都可以
?完成后選Dump:
Dump是進入該段查看其內(nèi)存,選一段全為0并且足夠大的空間, 右擊后Binary->Binary copy:
?
?即可把shellcode復制過去,記住shellcode的首地址
?跳轉(zhuǎn)到shellcode首地址處,右擊后選擇New origin here將EIP指向它:
這樣就可以調(diào)試shellcode了,查看下機器碼是一模一樣的。
?
?日志功能:
日志記錄你執(zhí)行過的操作,方法有View->Log或者直接按下藍色L按鈕即可
?幫助文檔:
?
?監(jiān)視功能:
監(jiān)視你寫得表達式
?比如這樣:
?OllyDump插件:
OllyDump可以把一個被調(diào)試的進程轉(zhuǎn)儲成PE文件, 在脫殼中比較常用:
?
?調(diào)試器隱藏插件使用: IsDebuggerPresent檢測, FindWindow檢測, 未處理異常欺騙以及OutputDebugString反OllyDbg調(diào)試等技術來實現(xiàn)對抗反調(diào)試技術
命令行:
BP 表達式[,條件]? # 設軟件斷點
BC 表達式 # 移除斷點
HW 表達式 # 設運行硬件斷點
BPX 標注 # 設置調(diào)用標注函數(shù)時的斷點
STOP/PAUSE # 暫停運行
RUN # 運行程序
G [表達式] # 運行到地址
S # Step-into
SO # Step-over
D 表達式 # 轉(zhuǎn)儲內(nèi)存
轉(zhuǎn)儲內(nèi)存, 即跳轉(zhuǎn)到指定內(nèi)存位置
在命令行內(nèi)使用命令dump(d)后接地址,即可在內(nèi)存區(qū)顯示該位置內(nèi)存內(nèi)容
?
?(未完)
總結(jié)
- 上一篇: win10安装虚拟机vm遇到的坑
- 下一篇: 199的Eagle一点都不香了!这款Bi