1. 程式人生 > >OllyDbg完全教程

OllyDbg完全教程

目錄

第一章 概述

OllyDbg 是一種具有視覺化介面的 32 位彙編—分析偵錯程式。它的特別之處在於可以在沒有原始碼時解決問題,並且可以處理其它編譯器無法解決的難題。

Version 1.10 是最終的釋出版本。 這個工程已經停止,我不再繼續支援這個軟體了。但不用擔心:全新打造的OllyDbg2.00 不久就會面世!

執行環境:OllyDbg可以以在任何採用奔騰處理器的 Windows 95、98、ME、NT 或是 XP(未經完全測試)作業系統中工作,但我們強烈建議你採用300—MHz以上的奔騰處理器以達到最佳效果。還有,OllyDbg 是極佔記憶體的,因此如果你需要使用諸如追蹤除錯[Trace]之類的擴充套件功能話,建議你最好使用128MB以上的記憶體。

支援的處理器:OllyDbg支援所有 80x86、奔騰、MMX、3DNOW!、Athlon 擴充套件指令集、SSE指令集以及相關的資料格式,但是不支援SSE2指令集。

配置: 有多達百餘個選項用來設定OllyDbg的外觀和執行。

資料格式:OllyDbg的資料視窗能夠顯示的所有資料格式:HEX、ASCII、UNICODE、 16/32位有/無符號/HEX整數、32/64/80位浮點數、地址、反彙編(MASM、IDEAL或是HLA)、PE檔案頭或執行緒資料塊。

幫助: 此檔案中包含了關於理解和使用OllyDbg的必要的資訊。如果你還有 Windows API 幫助檔案的話(由於版權的問題win32.hlp

沒有包括在內),你可以將它掛在OllyDbg 中,這樣就可以快速獲得系統函式的相關幫助

啟動: 你可以採用命令列的形式指定可執行檔案、也可以從選單中選擇,或直接拖放到OllyDbg中,或者重新啟動上一個被除錯程式,或是掛接[Attach]一個正在執行的程式。OllyDbg支援即時除錯。OllyDbg根本不需要安裝,可直接在軟盤中執行!

除錯DLLs: 你可以利用OllyDbg除錯標準動態連結庫 (DLLs)。OllyDbg 會自動執行一個可執行程式。這個程式會載入連結庫,並允許你呼叫連結庫的輸出函式。

原始碼級除錯:OllyDbg可以識別所有 Borland 和 Microsoft 格式的除錯資訊。這些資訊包括原始碼、函式名、標籤、全域性變數、靜態變數。有限度的支援動態(棧)變數和結構。

程式碼高亮:OllyDbg的反彙編器可以高亮不同型別的指令(如:跳轉、條件跳轉、入棧、出棧、呼叫、返回、特殊的或是無效的指令)和不同的運算元(常規[general]、FPU/SSE、段/系統暫存器、在棧或記憶體中的運算元,常量)。你可以定製個性化高亮方案。

執行緒:OllyDbg可以除錯多執行緒程式。因此你可以在多個執行緒之間轉換,掛起、恢復、終止執行緒或是改變執行緒優先順序。並且執行緒視窗將會顯示每個執行緒的錯誤(就像呼叫 GETLASTERROR 返回一樣)。

分析:OllyDbg 的最大特點之一就是分析。它會分析函式過程、迴圈語句、選擇語句、表[tables]、常量、程式碼中的字串、欺騙性指令[tricky constructs]、API呼叫、函式中引數的數目,import表等等。這些分析增加了二進位制程式碼的可讀性,減少了出錯的可能性,使得我們的除錯工作更加容易。

Object掃描:OllyDbg 可以掃描Object檔案/庫(包括 OMF 和 COFF 格式),解壓程式碼段[code segments]並且對其位置進行定向。

Implib掃描: 由於一些DLL檔案的輸出函式使用的索引號,對於人來說,這些索引號沒有實際含義。如果你有與DLL相應的輸入庫[importlibrary],OllyDbg 就可以將序號轉換成符號名稱。

完全支援Unicode: 幾乎所有支援 ASCII 的操作同時也支援 UNICODE,反之亦然。

名稱:OllyDbg可以根據 Borland 和 Microsoft 格式的除錯資訊,顯示輸入/輸出符號及名稱。Object掃描器可以識別庫函式。其中的名稱和註釋你可任意新增。如果DLL中的某些函式是通過索引號輸出的,則你可通過掛接輸入庫[import library]來恢復原來的函式名稱。不僅如此,OllyDbg還能識別大量的常量符號名(如:視窗訊息、錯誤程式碼、位域[bit fields]…)並能夠解碼為已知的函式呼叫。

已知函式:OllyDbg 可以識別 2300 多個 C 和 Windows API 中的常用函式及其使用的引數。你可以新增描述資訊、預定義解碼。你還可以在已知函式設定 Log 斷點並可以對引數進行記錄。

函式呼叫:OllyDbg可以在沒有除錯資訊或函式過程使用非標準的開始部分[prolog]和結尾部分[epilog]的情況下,對遞迴呼叫進行回溯。

譯者注:

004010D0   push ebp              \

004010D1   mov  ebp,esp                   |

004010D3   sub  esp,10h                     |>prolog

004010D6   push ebx                            |

004010D7   push esi                             |

004010D8   push edi                           /

……

004010C5   pop   edi                           \ 

004010C6   pop  esi                           |

004010C7   pop  ebx                          |>epilog

004010C8   mov  esp,ebp                            |

004010CA   pop  ebp                         |

004010CB   ret                                      /

棧:在棧視窗中,OllyDbg 能智慧識別返回地址和棧框架[Stack Frames]。並會留下一些先前的呼叫。如果程式停在已知函式上,堆疊視窗將會對其引數進行分析解碼。

譯者注:棧框架[Stack Frames]是指一個記憶體區域,用於存放函式引數和區域性變數。

SEH 鏈: 跟蹤棧並顯示結構化異常控制代碼鏈。全部鏈會顯示在一個單獨的視窗中。

搜尋:方法真是太多了!可精確、模糊搜尋命令或命令序列,搜尋常數,搜尋二進位制、文字字串,搜尋全部命令地址,搜尋全部常量或地址域[address range],搜尋所有能跳到選定地址的跳轉,搜尋所有呼叫和被呼叫的函式,搜尋所有參考字串,在不同模組中搜索所有呼叫、搜尋函式名稱,在全部已分配的記憶體中搜索二進位制序列。如果搜尋到多個結果,你可以對其進行快速操作。

視窗:OllyDbg 能夠列出關於除錯程式中的各種視窗,並且可以在視窗、類甚至選定的訊息上設定斷點。

資源:如果 Windows API 函式使用了參考資源串,OllyDbg 可以顯示它。其支援顯示的型別僅限於附帶資源[attached resources]的列表、資料顯示及二進位制編輯。

斷點:OllyDbg支援各種斷點:一般斷點、條件斷點、記錄斷點(比如記錄函式引數到記錄視窗)、記憶體讀寫斷點、硬體斷點(只適用於ME/NT/2000)等。在Hit跟蹤情況下,可以在模組的每條命令上都設定INT3斷點。在使用500—MHZ處理器的 Windows NT 中,OllyDbg 每秒可以處理高達 5000 箇中斷。

監視與監察器:每個監視都是一個表示式並能實時顯示錶達式的值。你可以使用暫存器、常數、地址表示式、布林值以及任何複雜代數運算,你還可以比較ASCII和UNICODE字串。監察器[inspectors]是一種包含了兩個的索引序列的監視[Watches],它以二維表的形式呈現,可以對陣列和結構進行解碼分析。 

Heap walk.:在基於Win95的系統中,OllyDbg 可以列出所有的已分配的堆。

控制代碼:在基於NT的系統中,OllyDbg 可列出被除錯程式的所有系統控制代碼。

執行:.你可以單步執行、步入子程式或者步過子程式。你也可以執行程式直到函式返回時、執行到指定地址處,還可以自動執行。當程式執行時,你仍然可以操縱程式並能夠檢視記憶體、設定斷點甚至修改程式碼。你也可以任意的暫停或重啟被除錯的程式。

Hit跟蹤:.Hit跟蹤可以顯示出目前已執行的指令或函式過程,幫助你檢驗程式碼的各個分支。Hit跟蹤會在指定指令到達之前設定斷點,而在這個指令執行後,會把這個斷點清除掉。譯者注:Hit在英文中是“擊中”的意思,指令如果運行了就表示這個指令被“擊中”了,沒有執行的指令就是“未擊中”,這樣我們就很容易看出被除錯程式哪些部分運行了,而哪些沒有執行。

Run跟蹤: Run跟蹤可以單步執行程式,它會在一個很大的迴圈緩衝區中模擬執行程式。這個模擬器包含了除了SSE指令集以外的所以暫存器、標誌、執行緒錯誤、訊息、已經函式的引數。你可以儲存命令,這樣可以非常方便地除錯自修改程式碼(譯者注:比如加殼程式)。你可以設定條件中斷,條件包括地址範圍、表示式、命令。你可以將Run跟蹤資訊儲存到一個檔案中,這樣就可以對比兩次執行的差別。Run跟蹤可以回溯分析已執行過的上百萬條命令的各種細節。

統計: 統計[Profiler]可以在跟蹤時計算某些指令出現的次數。因此你就能瞭解程式碼的哪一部分被頻繁執行。

補丁:內建彙編器能夠自動找到修改過的程式碼段。二進位制編輯器則會以ASCII、UNICODE或者十六進位制的形式同步顯示修改後的資料。修改後的資料同其它資料一樣,能夠進行復制—貼上操作。原來的資料會自動備份,以便資料恢復時使用。你可以把修改的部分直接複製到執行檔案中,OllyDbg會自動修正。 OllyDbg還會記錄以前除錯過程中使用的所有補丁。你可以通過空格鍵實現補丁的啟用或者禁止。

自解壓檔案: 當除錯自解壓檔案時,你往往希望跳過解壓部分,直接停在程式的原始入口點。OllyDbg的自解壓跟蹤將會使你實現這一目的。如果是加保護的自解壓段,自解壓跟蹤往往會失敗。而一旦OllyDbg找到了入口點,它將會跳過解壓部分,並準確的到達入口點。

外掛:你可以把自己的外掛新增到OllyDbg中,以增加新的功能。OllyDbg 的外掛能夠訪問幾乎所有重要的資料的結構、能夠在OllyDbg的視窗中新增選單和快捷鍵,能夠使用100個以上的外掛API函式。外掛API函式有詳細的說明文件。預設安裝已經包含了兩個外掛:命令列外掛和書籤外掛。

UDD:OllyDbg 把所有程式或模組相關的資訊儲存至單獨的檔案中,並在模組重新載入時繼續使用。這些資訊包括了標籤、註釋、斷點、監視、分析資料、條件等等

更多:這裡介紹的功能,僅僅是OllyDbg的部分功能。因為其具有如此豐富的功能,以至於OllyDbg能成為非常方便的偵錯程式!

第二章 元件

我希望你能對80x86系列處理器的內部結構有所瞭解,同時具有一定的編寫彙編程式的能力。對於Microsoft Windows方面的知識,你也要熟悉。

OllyDbg是執行在Windows 95、Windows 98、Windows ME、Windows NT 和 Windows 2000系統下的一個單程序、多執行緒的分析程式碼級除錯工具。它可以除錯PE格式的執行檔案及動態連結庫,並可以對其打補丁。“程式碼級”意味著你可以直接與位元、位元組或處理器指令打交道。OllyDbg 僅使用已公開的 Win32 API 函式,因此它可以在所有 Windows 作業系統及後繼版本中使用。但是由於我沒有對 XP 系統進行徹底測試,因此不能保證OllyDbg功能的充分發揮。注意:OllyDbg 不支援對 .NET 程式的除錯。

OllyDbg不是面向編譯器的。它沒有特別的規則規定必須是哪一個編譯器產生的程式碼。因此,OllyDbg可以非常好的處理通過編譯器生成的程式碼,或是直接用匯編寫入的程式碼。

OllyDbg可以並行除錯程式。你無須暫停執行程式,就可以瀏覽程式碼和資料,設定斷點、停止或恢復執行緒,甚至直接修改記憶體。(這可以視為一種軟體除錯的模式,與之相對的硬體模式則是當程序在執行時偵錯程式被阻滯,反之亦然)。假使所需的操作比較複雜,OllyDbg會讓程序終止一小段時間,但是這種暫停對於使用者來說是透明的。有時程序會發生非法操作。你可以把OllyDbg設定成即時[just—in—time]偵錯程式,它會掛接出錯程式,並停在程式產生異常的地方。

通過OllyDbg,你可以除錯單獨的DLL[standaloneDLLs]檔案。作業系統不能直接執行DLL 檔案,因此OllyDbg將一個可以載入 DLL 的小程式壓縮到資源裡,這個程式允許你呼叫最多10個引數的輸出函式。

OllyDbg是完全面向模組[module—oriented]的。模組[Module]包括可執行檔案(副檔名通常為.EXE)和在啟動時載入或需要時動態載入的動態連結庫(副檔名通常為.DLL)。在除錯期間,你可以設定斷點[breakpoints]、定義新的標籤[labels]、註釋[comment]彙編指令,當某個模組從記憶體中解除安裝[unload]時,偵錯程式會把這些資訊儲存在檔案中,檔名就是模組的名稱,副檔名為.UDD(表示 使用者自定義檔案[User—Defined Data])當OllyDbg下一次載入該模組時,它會自動恢復所有的除錯資訊,而不管是哪一個程式使用這個模組。假設你正在除錯程式Myprog1,這個程式使用了Mydll。你在 Mydll 中設定了一些斷點,然後你開始除錯Myprog2,這個程式同樣使用了Mydll。這時你會發現,所有 Mydll 中的斷點依然存在,即使 Mydll 載入到不同的位置!

一些偵錯程式把被除錯程序的記憶體當作一個單一的(並且大部分是空的)大小為2 ^32位元組的區域。OllyDbg採用了與之不同的技術:在這裡,記憶體由許多獨立的塊組成,任何對記憶體內容的操作都被限制在各自的塊內。在大多數情況下,這種方式工作得很好並且方便了除錯。但是,如果模組包含好幾個可執行段[executable  sections],你將不能一次看到全部程式碼,然而這種情況是非常少見的。

OllyDbg 是一個很佔用記憶體的程式[memory—hungry application]。它在啟動時就需要 3 MB,並且當你第一次裝載被除錯的程式時還需要一到兩兆的記憶體。每一次的分析、備份、跟蹤或者檔案資料顯示都需要佔用一定的記憶體。因此當你除錯一個很大的專案,發現程式管理器顯示有 40 或 60 兆記憶體被佔用時,請不要驚慌。

為了有效地除錯一些不帶原始碼的程式,你必須首先理解它是如何工作的。OllyDbg 包含的大量特性可以使這種理解變得非常容易。

首先,OllyDbg包含一個內建的程式碼分析器。分析器遍歷整個程式碼,分出指令和資料,識別出不同的資料型別和過程,分析出標準API函式(最常用的大約有1900個)的引數並且試著猜出未知函式的引數數目。你也可以加入自己的函式說明[yourown function descriptions]。它標記出程式入口點和跳轉目的地,識別出跳轉表[table—drivenswitches]和指向字串的指標,加入一些註釋,甚至標示出跳轉的方向等等。在分析結果的基礎上,呼叫樹[call tree]顯示哪些函式被指定過程呼叫(直接或間接)並且識別出遞迴呼叫、系統呼叫和葉子過程[leaf procedures]。如果需要的話,你可以設定解碼提示[decoding hints]來幫助分析器解析那些不明確的程式碼或資料。

OllyDbg還包含Object掃描器[Object Scanner]。如果你有庫檔案[libraries]或目標檔案[object files],掃描器會在被除錯的程式中定位這些庫函式。在全部函式呼叫中,對標準函式的呼叫佔很重要的一部分(據我估計可達70%)。如果你知道正要被呼叫的函式的功能,你就不必把注意力集中在這個函式上,可以簡單地單步步過[step over]這個call。分析器知道400多個標準C函式,比如fopen和memcpy。然而我必須承認當前版本的OllyDbg不能定位很短的函式(比一個return命令多不了多少的)或相似的函式(只在重定位上有不同)。Object掃描器[Object scanner]也能夠識別輸入庫[import libraries]。如果某個DLL是按序號輸出的,你不會看到函式名,只會發現一堆無意義的神祕數字。這種DLL的開發者通常會提供一個輸入庫來實現函式符號名與序號間的對應。讓OllyDbg使用這個輸入庫,它就會恢復原始的函式符號名。

面向物件的語言(如C++),使用了一種叫做名稱修飾[namemangling]的技術,把函式型別和引數都加入函式名中。OllyDbg 可以解碼[demangle]這種函式名,使程式更易讀。譯者注:C++的名稱修飾是編譯器將函式的名稱轉變成為一個唯一的字串的過程,這個字串會對函式的類、其名稱空間、其引數表,以及其他等等進行編碼。 C++的名稱修飾適用於靜態成員函式,也適用於非靜態成員函式。靜態函式的名稱修飾的一個好處之一,是能夠在不同的類裡使用同一個名稱來宣告兩個或者更多的靜態成員函式————而不會發生名稱上的衝突。

OllyDbg完全支援 UNICODE,幾乎所有對 ASCII 字串的操作都可以同樣應用於 UNICODE。

彙編指令都是很相似的。你經常會搞不清自己是不是已經跟蹤過某一段程式碼。在OllyDbg中你可以加入自己的標籤[labels]和註釋[comments]。這些極大地方便了除錯。注意一旦你註釋了某個DLL,以後每次載入這個DLL時,註釋和標籤都有效————儘管你在除錯不同的程式

OllyDbg可以跟蹤標準的棧幀[stack frames](由PUSH EBP; MOV EBP,ESP所建立的)。現代編譯器有禁止產生標準棧框架的選項,在這種情況下分配棧[stackwalk]是不可能的。當程式執行到已知的函式時,棧視窗[stack window]解析它的引數,呼叫棧[Call stack]視窗顯示到達當前位置所呼叫函式的序列。

現代的面向物件應用程式廣泛地使用了一種叫做結構化異常處理[Structured Exception Handling,SHE]的技術。SHE視窗[SEH window] 可以顯示異常處理鏈。

多種不同的搜尋[search]選項可以讓你找到二進位制程式碼或資料、命令或命令序列、常量或字串、符號名或在 Run跟蹤中的一條記錄。

對於任何地址或常量,OllyDbg 可以找出參考[referencing]到該地址或常量的全部命令的列表。然後你可以在這個列表裡找出對你來說是重要的參考。舉例來說,某個函式可能被直接呼叫,或者經過編譯器優化後把地址放入暫存器間接呼叫,或者把地址壓入堆疊作為一個引數————沒問題,OllyDbg 會找出所有這樣的地方。它甚至能找到並列出所有和某個指定的位置有關的跳轉。

OllyDbg 支援所有標準型別的斷點[breakpoints]————非條件和條件斷點、記憶體斷點(寫入或訪問)、硬體斷點或在整個記憶體塊上下斷點(後兩項功能只在 Window ME,NT,2000,XP中有效)。條件表示式可以非常複雜(“當 [ESP+8] 的第 2 位被設定,並且 123456 位置處的字[word]小於10,或者 EAX 指向一個以“ABC”開頭的 UNICODE 字串,但跳過前10次斷點而在第11次中斷”)。你可以設定一條或多條指令,當程式暫停時由OllyDbg傳遞給外掛外掛[plugins]。除了暫停,你還可以記錄某個表示式的值(可以帶有簡短的說明),或者記錄OllyDbg已知的函式的引數。在Athlon 2600+、Windows2000 環境下,OllyDbg 可以每秒處理多達 25000 個條件斷點。

另一個有用的特性是跟蹤。OllyDbg 支援兩種方式的跟蹤:hit和run。

在第一種情況下,它對指定範圍內的每條指令上設定斷點(比如在全部可執行程式碼中)。當到達設斷的指令後,OllyDbg清除斷點並且把該指令標記為hit。這種方法可以用來檢測某段程式碼是否被執行。Hit跟蹤速度驚人的快,在一個很短時間的啟動後程序幾乎達到了全速(譯者注:這應該是與不進行除錯時速度相比而言)。因為INT3斷點可能對資料有災難性的影響,所以我建議不要使用模糊識別過程。當代碼沒有被分析時Hit跟蹤是不可以使用的。

Run跟蹤[Run trace]是一步一步地執行程式,同時記錄精確的執行歷史和所有暫存器的內容、已知的引數和可選的指令(當代碼是自修改時會有幫助)。當然,這需要大量的記憶體(每個指令需要15至50個位元組,取決於除錯的模式)但是可以精確地回溯和分析。你可以只在選定的一段程式碼甚至是一條指令中進行Run跟蹤,或者你可以跳過無關緊要的程式碼。對於每個地址,OllyDbg能夠計算這個地址在Run跟蹤日誌中出現的次數,雖然會導致執行緩慢但是可以得到程式碼執行的統計。比如說,某命令讓你在每個已識別的過程入口處進行Run跟蹤,那麼統計[profile]就會給你每個過程被呼叫的次數。在到達某條指令、某個地址範圍或指令計數器達到某一數值時Run跟蹤可以自動地暫停[pause]。

在多執行緒程式裡OllyDbg可以自動管理執行緒[threads],如果你單步除錯或跟蹤程式,它會自動恢復當前執行緒而掛起其它執行緒。如果你執行程式,OllyDbg 會恢復先前的執行緒狀態。

可以為記憶體塊建立快照(叫做備份)。OllyDbg會高亮顯示所有的改動。你可以把備份儲存到檔案或從檔案中讀取出來,從而發現兩次執行的不同之處。你可以檢視備份,搜尋下一處改動,恢復全部或選定的改動。補丁管理器[Patch manager]記錄了上次應用到程式中的所有補丁,在下次除錯時可以再次應用它們。你可以很容易地把你的補丁加在可執行檔案上。OllyDbg 會自動進行修正。

你不能在帶有 Win32 的16位 Windows 下使用 OllyDbg。這種32位擴充套件作業系統無法實現某些必需的除錯功能。你既不能除錯 DOS 程式也不能除錯16位 NE(New Executable)格式檔案,我也沒有打算在未來的版本中支援這些。

反彙編器識別所有的標準80x86、保護、FPU、MMX和3DNow!指令集(包括Athlon擴充套件的MMX指令集)。但它不識別ISSI命令,儘管計劃要在下個版本中支援這種命令。某些過時或者未公開的命令,像LOADALL,也不支援。

反彙編器可以正確解碼16位地址。但它假設所有的段都是32位的(段屬性使用32位)。這對於PE[Portable Executable]格式檔案總是正確的。OllyDbg不支援16位的NE[NewExecutables]格式。

如果你熟悉MASM或者TASM,那麼反彙編的程式碼對於你沒有任何問題。但是,一些特例也是存在的。以下命令的解碼與Intel的標準不同:

AAD (ASCII Adjust AX BeforeDivision)—該命令的解碼後的一般形式為:AAD imm8

AAM (ASCII Adjust AX AfterMultiply)—該命令(非十進位制數)的一般解碼形式為:AAM imm8

SLDT (Store Local DescriptorTable register)—運算元總被解碼為16位。這個命令的32位形式會在目的運算元的低16位中儲存段選擇器,並保留高16位不變。

SALC (Sign—extend Carry bit to AL,undocumented)—OllyDbg 支援這個未公開指令。

PINSRW (Insert Word FromInteger Register, Athlon extension to MMX)—在AMD的官方文件中,這個命令的記憶體形式使用了16位記憶體運算元;然而暫存器形式需要32位暫存器,但只使用了低16位。為了方便處理,反彙編器解碼暫存器為16位形式。而彙編器兩種形式都支援。

CVTPS2PI and CVTTPS2PI(Convert Packed Single—Precision Floating to Packed Doubleword, Convert with TruncationPacked Single—PrecisionFloating to Packed Doubleword)—在這些命令中,第一個運算元是MMX暫存器,第二個或者是128位XMM暫存器或者是64位記憶體區域。為了方便處理,記憶體運算元也被解碼為128位。

有些指令的助記符要依賴運算元的大小:

不分大小的形式 明確的16位形式       明確的32位形式

PUSHA               PUSHAW                    PUSHAD

POPA                            POPAW                       POPAD

LOOP                           LOOPW                      LOOPD

LOOPE                LOOPWE                    LOOPDE

LOOPNE             LOOPWNE                 LOOPDNE

PUSHF               PUSHFW                    PUSHFD

POPF                   POPFW                       POPFD

IRET                    IRETW                        IRETD

你可以改變解碼大小敏感助記符[decoding of size—sensitive mnemonics]。根據選項,反彙編器從三種可能中選擇之一進行解碼。這個選項也會影響彙編器的預設處理方式。解碼MMX和3DNow!指令總是開啟的,儘管你的處理器並不支援這些指令。

OllyDbg 整合了一個快速而強大的程式碼分析器。你可以從快捷選單,或者在CPU視窗的反彙編面板中按 Ctrl+A ,或者在可執行模組中選擇“分析全部模組[Analyze all modules]”,來使用它。  

分析器有很高的啟發性。它能區分程式碼和資料,標記入口和跳轉目的地址,識別轉換表[switch tables],ASCII 和 UNICODE 串,定位函式過程,迴圈,高階轉換[high—level switches]並且能解碼標準API函式的引數(示例[example])。OllyDbg 的其他部分也廣泛的使用了分析後的資料。

這是如何實現的?我將為你揭開這一神祕面紗。第一遍,OllyDbg反彙編程式碼段中所有可能的地址,並計算呼叫的每個目的地址的個數。當然,很多呼叫是假的,但不可能兩個錯誤的呼叫都指向了相同的命令,當然如果有三個的話,就更不可能了。因此如果有三個或者更多的呼叫指向了相同的地址,我可以肯定的說這個地址是某個頻繁使用的子程式的入口。從定位的入口出發,我繼續跟蹤所有的跳轉和函式呼叫,等等。按這種方法,我可能準確定位99.9% 的命令。但是,某些位元組並不在這個鏈條上。我再用20多種高效的啟發方法(最簡單的方法,比如“直接訪問前64K記憶體是不允許的,像在MOV [0],EAX中”)來探測他們。有時,分析器在你感興趣的地方分析錯誤。有兩種解決方法:或者從選中的部分移除分析(快捷鍵退格鍵),這樣OllyDbg將使用預設的解碼(反彙編)方式;或者設定解碼提示[decoding hints]並重新分析。注意:在某些情況下,當分析器認為你的提示是不合適的,或者有衝突,則可能忽略你的設定。

探測程式的函式過程也很簡單。在分析器眼中看來,程式只是一個連綿不斷的程式碼,從一個入口開始,可能達到(至少從理論上)所有的命令(除了NOP以及類似的用於填充間隙的命令)。你可能指定三個識別級別。嚴格的函式過程要求有準確的一個入口,並且至少有一個返回。在啟發級別下,分析器只要求過程有一個入口。而如果你選擇模糊模式,差不多連貫的程式碼都會被識別為單獨的過程。現代編譯器進行全域性程式碼優化,有可能把一個過程分成幾個部份。在這種情況下,模糊模式非常有用。但是也會誤識別的機率也就更高。

同樣地,迴圈是一個封閉的連續的命令序列,並有一個到開始處的跳轉作為一個入口,還有若干個出口。迴圈與高階操作命令 do, while 和 for 相對應。OllyDbg能夠識別任何複雜的巢狀迴圈。他們會在反彙編欄[Disassembly]中用長而粗括號標記如果入口不是迴圈的第一個命令,OllyDbg會用一個小三角進行標記

為了實現一個轉換[switch], 許多編譯器,讀取轉換變數[switch variable]到暫存器中,然後減它,像如下的程式碼序列:

     MOV EDX,<switchvariable>

     SUB EDX,100

     JB DEFAULTCASE

     JE CASE100        ; Case 100

     DEC EDX

     JNE DEFAULTCASE

     ...               ; Case 101

這個序列可能還包含一到兩階的轉換表、直接比較、優化和其他元素。如果在比較或跳轉的很深處,這就很難知道哪是一個分支[Case]。OllyDbg 會幫助你,它會標記所有的分支,包括預設的,甚至嘗試分析每個分支的含義,如'A'、WM_PAINT 或者 EXCEPTION_ACCESS_VIOLATION。如果命令序列沒有修改暫存器(也就是僅僅由比較組成),那麼這可能不是轉換,而很有可能是選擇巢狀:

     if (i==0) {...}

     else if (i==5) {...}

     else if (i==10) {...}

如果需要OllyDbg將選擇巢狀解碼成選擇語句,請在分析1[Analysis1]中設定相關選項。

OllyDbg包含多達1900條常用API函式,這些都作為內部預處理資源。這個列表包含了KERNEL32, GDI32, USER32, ADVAPI32, COMDLG32, SHELL32, VERSION,SHLWAPI, COMCTL32, WINSOCK, WS2_32 和 MSVCRT。你可以新增自己的函式描述[add your own descriptions]。如果分析器遇到的呼叫,使用了已知的函式名(或者跳轉到這樣的函式),它將在呼叫之前立即解碼PUSH命令。因此,你只需略微一看就能明白函式呼叫的含義。OllyDbg還包含了大約400多種的標準C函式。如果你有原始的庫檔案,我推薦你在分析前掃描目標檔案。這樣OllyDbg將能解碼這些C函式的引數。

如果選項“猜測未知函式的引數個數”開啟,分析器將會決定這個呼叫函式過程使用的長度為雙字的引數個數。並且標記他們為引數1[Arg1],引數2[ Arg2],等等。注意:無論如何,暫存器引數是無法識別的,所以不會增加引數的數目。分析器使用了一種比較安全的方法。例如,它不能識別的沒有引數的函式過程,或者該過程POP命令直接做返回前的暫存器恢復,而不銷燬引數。然而,識別出來的函式引數數目通常非常高,這大大加大了程式碼的可讀性。

分析器能夠跟蹤整型暫存器的內容。現代優化編譯器,特別是奔騰系列,頻繁地使用暫存器讀取常量和地址,或使用盡量少的使用記憶體。如果某個常量讀取到暫存器中,分析器會注意它,並嘗試解碼函式和其引數。分析器還能完成簡單的算術計算,甚至可以跟蹤壓棧和出棧。

分析器不能區分不同類的名稱[different kinds of names]。如果你將某些函式指定為已知的名稱,OllyDbg將會解碼所有到該地址的呼叫。這是幾個預定義的特殊名稱WinMain, DllEntryPoint and WinProc。你可能使用這些標籤標記主程式、DLL的的入口以及視窗過程(注意:OllyDbg不檢查使用者自定義的標籤是否唯一)。另外,假定預定義引數assumepredefined arguments是一種更好的方法,不幸的是,沒有一般規則能夠做到100%的準確分析。在某些情況下,例如當模組包含了P—Code或程式碼段中包換了大量的資料,分析器可能將一些資料解釋成程式碼。如果統計分析顯示程式碼部分很可能是壓縮包或者經過加密了,分析器會發出警告。如果你想使用Hit跟蹤[Hit trace],我建議你不要使用模糊分析[fuzzy analysis],因為設定斷點的地方可能正是資料部分

自解壓檔案[Self—extractablefiles] 通常有一個自提取器,在“正式”程式碼段之外。如果你選擇自解壓選項[SFX option]中的“擴充套件程式碼段,包含提取器[Extend code section to include self—extractor]”,OllyDbg將會擴充套件程式碼段,形式上允許分析它,並可以使用Hit跟蹤[Hit] trace和Run跟蹤[Run trace]。


掃描器將特定的目標檔案或者目標庫(包括OMF和COFF兩種格式),提取出程式碼段,然後將這些段定位在當前模組的程式碼節[Codesection]中.如果段定位好了,掃描器將從目標檔案中的除錯資訊提取名稱(也就是所謂的庫標籤[librarylabels])。這極大的增加了程式碼與資料的可讀性。掃描器並不會對已識別的目標檔案進行標籤匹配,所以它不能識別非常小或相似的函式(比如:兩個函式只是在重定位有區別)。因此要經常檢查掃描器傳送到登陸視窗的警告列表!

某些DLL的輸出符號僅僅是一個序號。許多符號都是井號加數字(比如:MFC42.#1003),這非常不便於理解。幸運的是,軟體零售商提供了輸入連線庫(implibs),它與序號符號名相關。

使用implib掃描器的方法:從主選單中選擇除錯[Debug]—>選擇輸入連結庫[Select importlibraries]。當你載入應用程式時,OllyDbg會讀取連結庫並從內建表格[internal tables]中提取符號名。每次遇到序號符號,而對應的連結庫已經註冊到OllyDbg中時,這個序號符號會被替換。

最簡單的方法是:執行 OllyDbg,點選選單上的檔案[File]—>開啟[Open],選擇你想除錯的程式。如果程式需要命令列引數,你可以在對話方塊底部的輸入欄中,輸入引數或者選擇以前除錯時輸入過的一條引數。

OllyDbg 能夠除錯獨立的DLL[stand—alone DLLs]。在這種情況下,OllyDbg 會建立並執行一個小的應用程式來載入連結庫並根據你的需要呼叫輸出函式。

如果你想重新啟動上一次除錯的程式,只要按一下 Ctrl+F2(這是重啟程式的快捷鍵)(???),這樣OllyDbg會以同樣的引數執行這個程式。另一種做法是在選單中選擇檔案[File],從歷史列表中選擇程式。你也可以在 Windows 資源管理器中將可執行檔案或 DLL 檔案拖拽到OllyDbg中。

當然,你可以在OllyDbg啟動時,執行指定帶有執行引數的被除錯程式。例如:你可以在桌面建立一個OllyDbg的快捷方式,右擊並選擇“屬性”,在“快捷方式”中的“目標”中新增除錯的程式的全路徑。這樣,你每次雙擊快捷方式時,OllyDbg 將自動執行被除錯程式。注意:DLL檔案不支援這種方式。

你可以把正在執行的程序掛接到OllyDbg中。在選單中開啟檔案[File]—>掛接[Attach],從程序列表中選擇要掛接的程序。注意:在你關閉OllyDbg的同時,這個程序也會被關閉。不要掛接系統程序,否則可能會導致整個作業系統的崩潰。(事實上在大多數情況下,作業系統禁止你掛接敏感程序)。

OllyDbg 可以作為即時[just—in—time]偵錯程式。這需要在系統登錄檔中註冊。在選單中選擇選項[Options]—>即時除錯[Just—in—time debugging] 並在彈出的對話方塊中單擊按鈕“設定OllyDbg為即時偵錯程式”[MakeOllyDbgjust—in—time debugger]。今後,如果某個應用程式發生了非法操作,系統將提示你是否用OllyDbg 除錯這個程式。作業系統會啟動OllyDbg並直接停在發生異常的地方。如果你選擇了“掛接時不詢問”[attaching without confirmation],則在即時除錯時OllyDbg不會彈出詢問對話方塊。如果想恢復成以前的即時偵錯程式[Restore oldjust—in—time debuger],按相應的按鈕即可。

另一種方法是把OllyDbg新增到與可執行檔案關聯的快捷選單中(這個想法是 Jochen Gerster 提出的)。在主選單中,選擇選項[Options]—>新增到資源管理器中[Addto Explorer]。以後你可以在所有的檔案列表中,右擊可執行檔案或DLL,在快捷選單中選擇OllyDbg。這個功能會建立四個登錄檔鍵值:

HKEY_CLASSES_ROOT\exefile\shell\Open with OllyDbg

HKEY_CLASSES_ROOT\exefile\shell\Open with OllyDbg\command

HKEY_CLASSES_ROOT\dllfile\shell\Open with OllyDbg

HKEY_CLASSES_ROOT\dllfile\shell\Open with OllyDbg\command

OllyDbg能夠除錯控制檯程式(基於文字的)。

OllyDbg不能除錯.NET應用程式。.NET程式是由微軟的中間語言這種偽指令組成的,或是on—the—fly to native ?6 commands編譯的。

注意:如果你執行的是Windows NT、2000 或XP作業系統,你應該擁有管理員許可權以便能夠除錯程式。。

對於使用者來說,CPU視窗在OllyDbg中是最重要的視窗。你除錯自己程式的絕大部分操作都要在這個視窗中進行。它包括以下五個面板(這五個面板的大小都是可以調節的):

l  反彙編[Disassembler]

l  資訊[Information]

l  資料[Dump]

l  暫存器[Registers]

l  棧[Stack]

按TAB鍵,可以切換到下一個CPU面板中(順時針方向)。

按Shift+TAB,可以切換到前一個CPU面板(逆時針方向)。

OllyDbg支援數種不同型別的斷點:

一般斷點[Ordinary breakpoint], 將你想中斷的命令的第一個位元組,用一個特殊命令INT3(偵錯程式陷阱)來替代。你可以在反彙編視窗中選中要設斷點的指令行並按下 F2 鍵就可以設定一個此型別的斷點。也可以在快捷選單中設定。再次按下F2 鍵時,斷點將被刪除。注意,程式將在設斷指令被執行之前中斷下來。INT3斷點的設定數量是沒有限制的。當你關閉被除錯程式或者偵錯程式的時候,OllyDbg將自動把這些斷點儲存到硬碟中,永遠不要試圖在資料段或者指令的中間設定這種斷點,如果你試圖在程式碼段以外設定斷點,OllyDbg將會警告。你可以在安全選項[Security options]中永遠關閉這個提示,在某些情況下偵錯程式會插入自帶的臨時INT3斷點。

條件斷點[Conditional breakpoint](快捷鍵 Shift+F2)是一個帶有條件表示式的普通INT3斷點。當偵錯程式遇到這類斷點時,它將計算表示式的值,如果結果非零或者表示式無效,將暫停被除錯程式,當然,由條件為假的斷點引起的開銷是非常高的(主要歸因於作業系統的反應時間)。在Windows NT、奔騰Ⅱ/450處理器環境下OllyDbg每秒最多處理2500個條件為假的斷點。條件斷點的一個典型使用情況就是在Windows訊息上設定斷點(比如 WM_PAINT)。為此,你可以將偽變數 MSG 同適當的引數說明聯合使用。如果視窗被啟用,參考一下後面的訊息斷點描述。

條件記錄斷點Conditional logging breakpoint](Shift+F4)是一種條件斷點,每當遇到此類斷點或者滿足條件時,它將記錄已知函式表示式或引數的值。例如,你可以在一些視窗過程函式上設定記錄斷點並列出對該函式的所有呼叫。或者只對接收到的WM_COMMAND訊息識別符號設斷,或者對建立檔案的函式(CreateFile)設斷,並且記錄以只讀方式開啟的檔名等,記錄斷點和條件斷點速度相當,並且從記錄視窗中瀏覽上百條訊息要比按上百次F9輕鬆的多,你可以為表示式選擇一個預先定義好的解釋說明。你可以設定通過的次數—每次符合暫停條件時,計數器就會減一。如果通過計數在減一前,不等於零,OllyDbg就會繼續執行。如果一個迴圈執行100次(十進位制),在迴圈體內設定一個斷點,並設定通過次數為99(十進位制)。OllyDbg將會在最後一次執行迴圈體時暫停。

另外,條件記錄斷點允許你傳遞一個或多個命令給外掛[plugins]。例如,你需要使用命令列外掛改變一個暫存器的內容,然後繼續執行程式。

訊息斷點[Message breakpoint]和條件記錄斷點基本相同,除了OllyDbg會自動產生一個條件,這個條件允許在視窗過程的入口處設定某些訊息(比如WM_PSINT)斷點,你可以在視窗[Windows]中設定它。

跟蹤斷點[Trace breakpoint] 是在每個選中命令上設定的一種特殊的INT3斷點。如果你設定了Hit跟蹤[hit trace],斷點會在命令執行後移除,並在該地址處做一個標記。如果你使用的是Run跟蹤[run trace],OllyDbg會新增跟蹤資料記錄並且斷點仍然是保持啟用狀態。

記憶體斷點[Memory breakpoint]OllyDbg每一時刻只允許有一個記憶體斷點。你可以在反彙編視窗、CPU視窗、資料視窗中選擇一部分記憶體,然後使用快捷選單設定記憶體斷點。如果有以前的記憶體斷點,將被自動刪除。你有兩個選擇:在記憶體訪問(讀,寫,執行)時中斷,或記憶體寫入時中斷。設定此類斷點時,OllyDbg將會改變所選部分的記憶體塊的屬性。在與80x86相容的處理器上將會有4096位元組的記憶體被分配並保護起來。即使你僅僅選擇了一個位元組,OllyDbg 也會將整個記憶體塊都保護起來。這將會引起大量的錯誤警告,請小心使用此類斷點。某些系統函式(特別是在Windows95/98下)在訪問受保護的記憶體時不但不會產生除錯事件反而會造成被除錯程式的崩潰。

硬斷點[Hardware breakpoint](僅在Windows ME,NT或2000下可用)在80x86相容的處理器上,允許你設定4個硬體斷點。和記憶體斷點不同,硬體斷點並不會降低執行速度,但是最多隻能覆蓋四個位元組。在單步執行或者跟蹤程式碼時,OllyDbg能夠使用硬斷點代替INT3斷點。

記憶體訪問一次性斷點[Single—shot break on memory access](僅在Windows NT或2000下可用)。你可以通過記憶體視窗的快捷選單(或按F2),對整個記憶體塊設定該類斷點。當你想捕捉呼叫或返回到某個模組時,該類斷點就顯得特別有用。中斷髮生以後,斷點將被刪除。

暫停Run跟蹤[Run trace pause] (快捷鍵:Ctrl+T)是在每一步Run跟蹤[run trace]時都要檢查的一個條件集。你可以在EIP進入某個範圍或超出某個範圍時暫停,某個條件為真時暫停,或者命令與指定的模式匹配時暫停,或者當命令可疑的時候暫停。注意,這一選擇會極大的(高達20%)降低Run跟蹤的速度。OllyDbg也可以在一些除錯事件[debugging events]上暫停程式執行。比如載入或解除安裝DLL,啟動或終止執行緒,或者程式發出除錯字串的時候。

資料視窗用於顯示記憶體或檔案的內容。你可以從以下預處理格式[predefined formats]中選擇一種顯示方式:位元組[byte]、文字[text]、整數[integer]、浮點數[float]、地址[address],反彙編[disassembly]、 PE頭[PE Header]。

所有的dump視窗支援備份[backup]、搜尋和編輯操作。CPU 視窗[CPU window]的Dump面板允許你對可執行程式碼的資料和可執行檔案(.exe,或.dll)的記憶體對映做如下操作:定義標籤[labels]、設定記憶體斷點[memory breakpoints], 查詢參考[references]。資料選單[Dump menu]只顯示與選中部分相關的命令。

如果 備份[backup]可用,則單擊第一個列標題欄,會在地址[Address]/備份[Backup] 兩種顯示模式之間切換。點選其他列標題欄,會改變Dump模式。

像反彙編視窗一樣,資料視窗也儲存了大量檢視記憶體地址的歷史記錄。你可以通過“+”和“—”鍵來訪問過去檢視過的資料地址空間。要翻動一位元組的資料,可以按住Ctrl+↓或Ctrl+↑

可執行模組視窗(快捷鍵:Alt+E)列出了當前被除錯程序載入的所有可執行模組。它也顯示了很多有用的資訊,比如模組大小、入口地址、模組版本、以及可執行檔案路徑等。一些資訊,如以十進位制顯示的模組大小、入口地址的符號名、是否為系統模組等,通常是被隱藏的。如果想看,可以增加相應欄的寬度。快捷選單支援以下操作:

重新整理[Actualize]—重新掃描模組並去除對新載入模組的高亮顯示。在大多數情況下,OllyDbg會自動完成該操作。

檢視記憶體[View memory]—開啟記憶體視窗,並定位到屬於該模組映象的第一個記憶體塊處。

在CPU視窗中檢視程式碼[Viewcode in CPU](快捷鍵:回車鍵)—在反彙編視窗中顯示模組的可執行程式碼。

跟進到入口[Follow entry]—在反彙編視窗中跟進到模組的入口處。

在CPU視窗中檢視資料[Dumpdata in CPU]—在CPU視窗的資料面板中顯示模組的資料段。塊程式碼段。

顯示名稱[View names](快捷鍵:Ctrl+N)—顯示當前模組定義或使用的全部名稱[names](包括輸出表、引入表、連結庫、使用者自定義)。

標記為系統DLL[Mark assystem DLL],標記為非系統DLL[Mark as non—system DLL]—將選中模組標記為系統或非系統屬性。如果設定為系統屬性,則在Run跟蹤[Run trace]時會直接執行(不進行跟蹤)這個模組,從而大大加快跟蹤速度。預設情況下,所有駐留在系統目錄(通常在Windows 95/98下為c:\windows\system,在WinNT/2000/XP下為c:\winnt\system32)的模組都認為是系統模組。

立即更新.udd檔案[Update .uddfile now]—向檔案“<模組名>.udd”寫入模組相關的全部資料,udd檔案儲存了在除錯期間設定的斷點、標籤、註釋、監視、分析等資訊。當模組解除安裝時OllyDbg會自動建立.udd檔案。

檢視可執行檔案[View executable file]—顯示可執行檔案的全部內容。

檢視全部資源[View all resources]—以列表形式顯示模組定義的全部資源,並帶有一個簡簡訊息。OllyDbg並不把資源當作單獨實體來支援。你可以提取[Dump]並以二進位制的形式進行編輯。

檢視資源字串[View resource strings]—以列表形式顯示資源字串及其識別符號。

檢視Run跟蹤的統計[View runtrace profile]—在此模組中計算統計[profile]。

分析全部模組[Analyze all modules]—允許同時分析全部模組。分析將從程式碼中提取大量的有用資訊;程式碼經過分析後再進行除錯,通常會非常快並且可靠。

滑鼠雙擊某一行,將會在反彙編視窗中顯示模組的執行程式碼。

記憶體對映視窗顯示了被除錯程式分配的所有記憶體塊。因為沒有標準的方法來完成這項任務,所以 OllyDbg可能會把一個大的記憶體塊分成幾個部分。然而,在大多數情況下,並非一定要精確處理。如果想檢視由應用程式通過呼叫GlobalAlloc ()和LocalAlloc()等申請的記憶體塊列表,請使用堆列表[Heap list]。

如果記憶體塊是可執行模組的一個節,OllyDbg則會報告這個記憶體塊所包含的資料型別:程式碼、資料、資源等。

Windows95/98是和WindowsNT/2000是有一些區別的。在Windows95/98下,OllyDbg是不能顯示被對映檔案的名稱的。另外,Windows95/98不允許的訪存型別為讀和寫,然而,在WindowsNT/2000下,OllyDbg卻有擁有更多功能,包括執行訪問,寫複製[copy—on—write]以及監視標誌位。OllyDbg忽略寫複製[copy—on—write]屬性。

如果OllyDbg發現程式分配了新記憶體或者重新分配了已經存在的記憶體塊,它將在記憶體對映視窗中高亮顯示相應的記錄,去掉高亮度顯示,可以選擇快捷選單中的重新整理[Actualize]項。你可以按Alt+M來呼叫記憶體視窗。

以下是快捷選單中可以選擇的選單項:

重新整理[Actualize]—更新已分配記憶體的列表並去除對新記憶體塊的高亮顯示。

在反彙編視窗中檢視[View in Disassembler]—在反彙編視窗中檢視:在反彙編視窗中開啟記憶體塊,這一選項僅在某些模組的記憶體塊中包含可執行程式碼或者自解壓器時可用

在CPU資料視窗中檢視[Dumpin CPU]—在CPU的資料視窗中顯示記憶體塊的內容。

資料視窗[Dump]—在單獨視窗中顯示記憶體塊內容。如果記憶體塊的型別已知,則OllyDbg會自動選擇顯示格式。

檢視全部資源[View all resources]—如果記憶體塊包含資源資料,則列出所有資源及相關資料。OllyDbg並不把資源當作單獨實體來支援。你可以顯示其資料並以二進位制的形式進行編輯。

檢視資源字串[View resource strings]—如果記憶體塊包含資源資料,則列出全部資源字串及其識別符號。

搜尋[Search]—允許搜尋所有的記憶體塊,從選擇處開始,搜尋匹配的二進位制串。如果找到,則OllyDbg將顯示該記憶體塊。記憶體映像視窗和資料視窗共享同一種搜尋模式,所以你可以在彈出的資料視窗中立即繼續搜尋該二進位制串出現的下一位置。按Esc鍵可以關閉資料視窗。

搜尋下一個[Search next](快捷鍵:Ctrl+L)—繼續上次搜尋。

設定訪問中斷[Set break—on—access](快捷鍵:F2,僅在WindowsNT/2000下可用)—保護整個記憶體塊。當中斷髮生後OllyDbg暫停被除錯程式並清除斷點。這類斷點在你想捕捉呼叫或返回到某個模組的時候特別有用。

清除訪問中斷[Remove break—on—access](快捷鍵:F2)—從記憶體塊中清除訪問中斷保護。

設定記憶體訪問斷點[Set memory breakpoint on access]—在整個記憶體塊上設定斷點,每當該記憶體塊被訪問時程式都將中斷。OllyDbg只支援一個記憶體訪問斷點。在Windows95/98下,當系統程式訪問含有記憶體斷點的記憶體塊時,可能會導致所被除錯程式崩潰,因此,不到萬不得已,請不要設定這種斷點。

設定記憶體寫入斷點[Set memory breakpoint on write]—在整個記憶體塊上設定斷點,每當該記憶體塊被寫入資料時程式都將中斷。在Windows95/98下,當系統程式訪問含有記憶體斷點的記憶體塊時,可能會導致所被除錯程式崩潰,因此,不到萬不得已,請不要設定這種斷點。

清除記憶體斷點[Remove memory breakpoint]—清除記憶體斷點。

清除自解壓記憶體斷點[Remove SFX memory breakpoint]—停止搜尋自解壓程式[self—extractable(SFX) program]的真實入口。這個搜尋使用了特殊型別的記憶體斷點。

訪問設定[Set access]—設定整個記憶體塊的保護屬性,可選擇的有:

禁止訪問[No access]

只讀[Read only]

讀/寫[Read/write]

執行[Execute]

執行/讀[Execute/read]

完全訪問[Full access]

複製到剪下板[Copy to clipboard]

整行[Whole line]—以多行文字(包括解釋)的方式把所選記錄複製到剪下板,如果複製時想排除某些列,可將該列的寬度置為最小(該欄剩餘的邊框將變灰)。

整個表格[Whole table]—以多行文字的方式將整個記憶體映像資訊複製到剪下板,該文字的第一行為視窗標題("記憶體對映[Memorymap]"),第二行為列標題欄,後面幾行的內容為記憶體資料記錄。複製將保持列的寬度。如果複製時想排除某些列,可將該列的寬度置為最小(該欄剩餘的邊框將變灰)。

監視[Watch]視窗包含若干個表示式[expressions]。它在第二列裡顯示這些表示式的值。OllyDbg 會把這些表示式儲存到主模組的.UDD檔案中,因此它們在下一次除錯時同樣有效。

監察器[inspector]是顯示若干變數、1/2維陣列或是選定專案結構陣列[selecteditems of array of structures]的獨立視窗。它的表示式與監視視窗中的基本相同,只是多包含了兩個引數:%A和%B。你可以指定這兩個引數的界限,OllyDbg 將會用所有可能的組合代替表示式中的%A和%B。從0開始一直到界限(不包含界限),並在表格中顯示結果。引數%B(列數)的界限不能超過16。

例如,如果你指定了表示式%A+%B,並且限定%A和%B的上限為3,你將獲得如下的表格:

OllyDbg 以簡單而有效的執行緒管理為特色。如果你單步除錯、跟蹤、執行到返回或者執行到所選,則執行緒管理器將停止除當前執行緒以外的所有執行緒。即使當前執行緒被掛起,它也會將其恢復。在這種情況下,如果你手動掛起或者恢復執行緒,動作將被延期。如果你執行被除錯的應用程式,OllyDbg將恢復最初的執行緒狀態。(從偵錯程式的角度來看,Hit跟蹤[hit trace]和自由執行是等效的)。

依據這種方案,執行緒視窗可能會有如下五種執行緒狀態:

啟用[Active]            執行緒執行中,或被除錯資訊暫停t

掛起[Suspended]      執行緒被掛起

跟蹤[Traced]           執行緒被掛起,但OllyDbg正在單步跟蹤此執行緒

暫停[Paused]         執行緒是活動的,但OllyDbg臨時將其掛起,並在跟蹤其它的執行緒

結束[Finished]         執行緒結束

執行緒視窗同時也顯示了最後的執行緒錯誤(GetlastError函式的返回值)並計算該執行緒以使用者模式和系統模式(僅NT/2000/XP)執行的時間。執行緒視窗還會高亮主執行緒的識別符號。

以下在快捷選單中可用:

重新整理[Actualize]—標記所有執行緒為舊的。

掛起[Suspend]—掛起執行緒。

恢復[Resume]—恢復先前掛起的執行緒。

設定優先順序[Set priority]—調整程序中執行緒的優先順序。以下選項可用:

空閒[Idle]                         —程序中執行緒的最低優先順序

最低[Lowest]      

低[Low]      

標準[Normal]      

高[High]      

最高[Highest]      

時間臨界[Time critical]     —最高優先順序

在CPU視窗開啟[Open inCPU](雙擊)—在CPU視窗中顯示所選執行緒的當前狀態。

複製到剪下板[Copy to clipboard]:

整行[Whole line]—全部行——以多行文字的形式並帶註釋將所選記錄複製到剪下板。如果在複製時想排除某個欄目,可以將該欄的寬度置為最小(欄目的殘留部分將變灰)。

整個表格[Whole table]—整個表格——以多行文字的形式將整個記憶體映象複製到剪下板,該文字的第一行包含視窗標題(“記憶體對映[Memorymap]”),第二行是欄目標題,所有後繼行是記憶體資料記錄。複製將保持欄目的寬度。如果在複製時想排除某些欄目,可以將該欄的寬度置為最小(欄目的殘留部分將變灰)。

呼叫棧視窗(快捷鍵:Alt+K)根據選定執行緒的棧,嘗試反向跟蹤函式呼叫順序並將其顯示出來,同時包含被呼叫函式的已知的或隱含的引數。如果呼叫函式建立了標準的堆疊框架(PUSH EBP; MOV EBP,ESP),則這個任務非常容易完成。現代的優化編譯器並不會為棧框架而操心,所以OllyDbg另闢蹊徑,採用了一個變通的辦法。例如,跟蹤程式碼到下一個返回處,並計算其中全部的入棧、出棧,及 ESP 的修改。如果不成功,則嘗試另外一種辦法,這個辦法風險更大,速度也更慢:移動棧,搜尋所有可能的返回地址,並檢查這個地址是否被先前的已分析的命令呼叫。如果還不行,則會採用啟發式搜尋。棧移動[Stack Walk]可能會非常慢。OllyDbg 僅在呼叫棧視窗開啟時才會使用。

呼叫棧視窗包含5個欄目:地址[Address]、棧[Stack]、過程[Procedure],呼叫來自[Called from],框架[Frame]。

地址[Adress]欄包含棧地址,棧[Stack]欄顯示了相應的返回地址或引數值。

函式[Procedure](或 函式/引數[Procedure / arguments])顯示了被呼叫函式的地址,在某些情況下,OllyDbg並不能保證該地址是正確的並會新增如下標記之一:

?                                   找到的入口點不可靠

可能[Maybe]        OllyDbg無法找到精確的入口點,報告的地址是用啟發式演算法猜測的。

包含[Includes]       OllyDbg無法找到入口點,僅知道該函式包含顯示的地址

通過按例標題欄上的按鈕或從選單中選擇“隱藏/顯示引數[Hide/Show arguments]”,可以在顯示或隱藏函式的引數之間切換。

呼叫來自[Called from]用於顯示呼叫該函式的命令地址。

最後一欄是框架[Frame]這一欄預設是隱藏的,如果框架指標的值(暫存器EBP)已知的話,則該欄用於顯示這個值。

當呼叫函式經過分析[analyzed].後,棧移動會更可靠並且迅速。

呼叫樹(快捷鍵:在反彙編視窗中Ctrl+K)利用分析[Analysis]的結果來找出指定函式過程直接或間接呼叫的函式列表,同時列出指定函式過程被呼叫的地址。為了避免由此可能造成的副作用。呼叫樹會判斷選定函式是否明確地是遞迴的。 “明確地”意味著它不會跟蹤目標未知的呼叫,比如CALL EAX。如果函式過程中有未知呼叫,呼叫樹將會新增標記“未知目標”。

某些函式呼叫將會新增如下注釋之一:

葉子[Leaf]           不呼叫其他函式

純函式[Pure]        不呼叫函式,不會產生副作用

單返回[RETN]       只有一個RETN 命令

系統[Sys]                   系統動態連結庫中的函式。系統動態連結庫定義為儲存在系統目錄下的動態連結庫。

如果想在呼叫樹上移動,可以雙擊“被呼叫[Calledfrom]”或“呼叫/直接呼叫[Calls/Callsdirectly]”兩欄中的地址。呼叫樹視窗儲存了移動記錄(快捷鍵“—”和“+”)。

如果被除錯的程式包含幾個模組,推薦你分析所有模組。Call tree 不會試圖處理系統函式。

外觀選項[Appearance options]

常規[General]

預設[Defaults]

對話方塊[Dialogs]

目錄[Directories]

字型[Fonts]

顏色[Colours]

程式碼高亮[Code highlighting]

除錯選項[Debugging options] (Alt+O)

安全[Security]

除錯[Debug]

事件[Events]

異常[Exceptions]

跟蹤[Trace]

自解壓[SFX]

字串[Strings]

地址[Addresses]

命令[Commands]

反彙編[Disasm]

CPU

暫存器[Registers]

棧[Stack]

分析1[Analysis 1]

分析2[Analysis 2]

分析3[Analysis 3]

即時除錯[Just—in—time debugging]

新增到資源管理器[Add to Explorer]

OllyDbg 允許你使用以下的搜尋方式:

符號名(標籤)[Symbolic name (label)]

二進位制串[binary string]

常量[constant]

命令[command]

命令序列[sequence of commands]

模組間呼叫[intermodular calls]

修改過的命令或資料[modified command or data]

自定義標籤[user—defined label]

自定義註釋[user—defined comment

文字字串[text string]

Run跟蹤的記錄[recordin run trace]

參考命令[referencing commands]

自解壓檔案由提取程式和壓縮的原程式兩部分組成。當遇到自解壓檔案(SFX)檔案時,我們通常希望跳過解壓部分,而直接跳到原始程式的入口(真正的入口)。

OllyDbg 包含了幾個便於完成這一任務的功能。

通常提取程式的載入地址都在執行程式碼之外。在這種情況下,OllyDbg 將這類檔案均視作為自解壓檔案(SFX)。

當自解壓選項[SFX options]要求跟蹤真正入口時,OllyDbg 在整個程式碼節[Code section]設定記憶體斷點,最初這裡是空的,或者只包含壓縮資料。當程式試圖執行某個在這個保護區域的命令,而這些命令不是RET和JMP時,OllyDbg 會報告真正的入口。這就是提取工作的原理。

上面的方法非常慢。有另外一種比較快的方法。每次讀取資料發生異常時,OllyDbg 使這個4K記憶體區域變為可讀,而使原先可讀的區域變為無效。而每次發生寫資料異常時,OllyDbg 使這個區域變為可寫,而使原先可寫的區域變為無效。當程式執行在保留的保護區域中的指令時,OllyDbg 報告真正的入口。但是,當