OLLYDBG

OLLYDBG

軟件名稱
OLLYDBG是一個新的動态追蹤工具,将IDA與SoftICE結合起來的思想,Ring 3級調試器,非常容易上手,己代替SoftICE成為當今最為流行的調試解密工具了。[1]同時還支持插件擴展功能,是目前最強大的調試工具。配置: 有多達百餘個選項用來設置 OllyDbg 的外觀和運行。
  • 中文名:OLLYDBG
  • 外文名:
  • 别名:
  • 類别:軟件
  • 平台:window
  • 編寫:彙編代碼

相關條目

追蹤調試器流行工具插件

一,什麼是 OllyDbg?

OllyDbg 是一種具有可視化界面的 32 位彙編-分析調試器。它的特别之處在于可以在沒有源代碼時解決問題,并且可以處理其它編譯器無法解決的難題。

Version 1.10 是最終的發布版本。 這個工程已經停止,我不再繼續支持這個軟件了。但不用擔心:全新打造的 OllyDbg 2.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相應的輸入庫[import library],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 能成為非常方便的調試器!

2005-9-6 15:25 幹龍二,一般原理[General principles]

我希望您能對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[standalone DLLs]文件。操作系統不能直接運行 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個)的參數并且試着猜出未知函數的參數數目。您也可以加入自己的函數說明[your own function descriptions]。它标記出程序入口點和跳轉目的地,識别出跳轉表[table-driven switches]和指向字符串的指針,加入一些注釋,甚至标示出跳轉的方向等等。在分析結果的基礎上,調用樹[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++),使用了一種叫做名稱修飾[name mangling]的技術,把函數類型和參數都加入函數名中。OllyDbg 可以解碼[demangle]這種函數名,使程序更易讀。

譯者注:C++的名稱修飾是編譯器将函數的名稱轉變成為一個唯一的字符串的過程,這個字符串會對函數的類、其命名空間、其參數表,以及其他等等進行編碼。C++的名稱修飾适用于靜态成員函數,也适用于非靜态成員函數。靜态函數的名稱修飾的一個好處之一,是能夠在不同的類裡使用同一個名稱來聲明兩個或者更多的靜态成員函數----而不會發生名稱上的沖突。

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

彙編指令都是很相似的。您經常會搞不清自己是不是已經跟蹤過某一段代碼。在 OllyDbg 中您可以加入自己的标簽[labels]和注釋[comments]。這些極大地方便了調試。注意一旦您注釋了某個DLL,以後每次加載這個DLL時,注釋和标簽都有效----盡管您在調試不同的程序。

OllyDbg可以跟蹤标準的棧幀[stack frames](由PUSH EBP; MOV EBP,ESP所創建的)。現代編譯器有禁止産生标準棧框架的選項,在這種情況下分配棧[stack walk

]是不可能的。當程序運行到已知的函數時,棧窗口[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)格式文件,我也沒有打算在未來的版本中支持這些。安息吧,古老而美好的命令提示符!

三,反彙編器[Disassembler]

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

反彙編器可以正确解碼16位地址。但它假設所有的段都是32位的(段屬性使用32位)。這對于PE[Portable Executable]格式文件總是真的。OllyDbg不支持16位的NE

[New Executables]格式。

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

AAD (ASCII Adjust AX Before Division) -

該命令的解碼後的一般形式為:AAD imm8

AAM (ASCII Adjust AX After Multiply) -

該命令(非十進制數)的一般解碼形式為:AAM imm8

SLDT (Store Local Descriptor Table register) -

操作數總被解碼為16位。這個命令的32位形式會在目的操作數的低16位中存儲段選擇器,并保留高16位不變。

SALC (Sign-extend Carry bit to AL, undocumented) -

OllyDbg 支持這個未公開指令。

PINSRW (Insert Word From Integer Register, Athlon extension to MMX) -

在AMD的官方文檔中,這個命令的内存形式使用了16位内存操作數;然而寄存器形式需要32位寄存器,但隻使用了低16位。為了方便處理,反彙編器解碼寄存器為16

位形式。而彙編器兩種形式都支持。

CVTPS2PI and CVTTPS2PI (Convert Packed Single-Precision Floating to Packed Doubleword, Convert with Truncation Packed Single-Precision Floating 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!指令總是開啟的,盡管您的處理器并不支持這些指令。四,分析器[Analysis]

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

分析器有很高的啟發性。它能區分代碼和數據,标記入口和跳轉目的地址,識别轉換表[switch tables],ASCII 和 UNICODE 串,定位函數過程,循環,高階轉換[

high-level switches]并且能解碼标準API函數的參數(示例[example])。OllyDbg 的其他部分也廣泛的使用了分析後的數據。

這是如何實現的?我将為您揭開這一神秘面紗。第一遍,OllyDbg反彙編代碼段中所有可能的地址,并計算調用的每個目的地址的個數。當然,很多調用是假的,但不可能兩個錯誤的調用都指向了相同的命令,當然如果有三個的話,就更不可能了。因此如果有三個或者更多的調用指向了相同的地址,我可以肯定的說這個地址是某個頻繁使用的子程序的入口。從定位的入口出發,我繼續跟蹤所有的跳轉和函數調用,等等。按這種方法,我可能準确定位99.9% 的命令。但是,某些字節并不在這個鍊條上。我再用20多種高效的啟發方法(最簡單的方法,比如“直接訪問前64K内存是不允許的,像在MOV ,EAX中”)來探測他們

有時,分析器在您感興趣的地方分析錯誤。有兩種解決方法:或者從選中的部分移除分析(快捷鍵退格鍵),這樣 OllyDbg 将使用默認的解碼(反彙編)方式;或者設置

解碼提示[decoding hints]并重新分析。注意:在某些情況下,當分析器認為您的提示是不合适的,或者有沖突,則可能忽略您的設置。

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

同樣地,循環是一個封閉的連續的命令序列,并有一個到開始處的跳轉作為一個入口,還有若幹個出口。循環與高級操作命令 do, while 和 for 相對應。OllyDbg 能夠識别任何複雜的嵌套循環。他們會在反彙編欄[Disassembly]中用長而粗括号标記。如果入口不是循環的第一個命令,OllyDbg會用一個小三角進行标記。

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

MOV edX,

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不檢查用戶自定義的标簽是否唯一)。另外,假定預定義參數assume predefined arguments是一種更好的方法

不幸的是,沒有一般規則能夠做到100%的準确分析。在某些情況下,例如當模塊包含了P-Code或代碼段中包換了大量的數據,分析器可能将一些數據解釋成代碼。如果統計分析顯示代碼部分很可能是壓縮包或者經過加密了,分析器會發出警告。如果您想使用Hit跟蹤[Hit trace],我建議您不要使用模糊分析[fuzzy analysis],因為設置斷點的地方可能正是數據部分。

自解壓文件[Self-extractable files] 通常有一個自提取器,在“正式”代碼段之外。如果您選擇自解壓選項[SFX option]中的“擴展代碼段,包含提取器[Extend code section to include self-extractor]”,OllyDbg将會擴展代碼段,形式上允許分析它,并可以使用Hit跟蹤[Hit] trace和Run跟蹤[Run trace]。

2005-9-6 15:27 幹龍五,Object掃描器[Object scanner]

掃描器将特定的目标文件或者目标庫(包括OMF和COFF兩種格式),提取出代碼段,然後将這些段定位在當前模塊的代碼節[Code section]中.如果段定位好了,掃描器将從目标文件中的調試信息提取名稱(也就是所謂的庫标簽[library labels])。這極大的增加了代碼與數據的可讀性.

掃描器并不會對已識别的目标文件進行标簽匹配,所以它不能識别非常小或相似的函數(比如:兩個函數隻是在重定位有區别)。因此要經常檢查掃描器發送到登陸窗口的警告列表!六,Implib掃描器 [Implib scanner]

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

使用implib掃描器的方法:從主菜單中選擇調試[Debug]|選擇輸入鍊接庫[Select import libraries]。當您加載應用程序時,OllyDbg會讀取鍊接庫并從内置表格[

internal tables]中提取符号名。每次遇到序号符号,而對應的鍊接庫已經注冊到OllyDbg中時,這個序号符号會被替換。七,如何開始調試[How to start debugging session]

最簡單的方法是:運行 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為即時調試器”[Make OllyDbg just-in-time debugger]。今後,如果某個應用程序發生了非法操作,系統将提示您是否用 OllyDbg 調試這個程序。操作系統會啟動 OllyDbg 并直接停在發生異常的地方。如果您選擇了“挂接時不詢問”[attaching without confirmation],則在即時調試時OllyDbg不會彈出詢問對話框。如果想恢複成以前的即時調試器[Restore old just-in-time debuger],按相應的按鈕即可。

另一種方法是把 OllyDbg 添加到與可執行文件關聯的快捷菜單中(這個想法是 Jochen Gerster 提出的)。在主菜單中,選擇選項[Options]|添加到資源管理器中[Add to Explorer]。以後您可以在所有的文件列表中,右擊可執行文件或DLL,在快捷菜單中選擇OllyDbg。這個功能會創建四個注冊表鍵值:

HKEY_CLASSES_ROOTexefileshellOpen with OllyDbg

HKEY_CLASSES_ROOTexefileshellOpen with OllyDbgcommand

HKEY_CLASSES_ROOTdllfileshellOpen with OllyDbg

HKEY_CLASSES_ROOTdllfileshellOpen with OllyDbgcommand

OllyDbg能夠調試控制台程序(基于文字的)。

OllyDbg不能調試.NET應用程序。.NET程序是由微軟的中間語言這種僞指令組成的,或是on-the-fly to native ?6 commands編譯的。

注意:如果您運行的是Windows NT、2000 或XP操作系統,您應該擁有管理員權限以

八,CPU 窗口[CPU window]

對于用戶來說,CPU窗口在OllyDbg中是最重要的窗口。您調試自己程序的絕大部分操作都要在這個窗口中進行。它包括以下五個面闆(這五個面闆的大小都是可以調節的):

反彙編[Disassembler]

信息[Information]

數據[Dump]

寄存器[Registers]

棧[Stack]

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

按Shift+TAB,可以切換到前一個CPU面闆(逆時針方向)。九,斷點[Breakpoints]

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,啟動或終止線程,或者程序發出調試字符串的時候。

10,數據窗口[Dump]

數據窗口用于顯示内存或文件的内容。您可以從以下預處理格式[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 l鍵并按上/下方向鍵。

可執行模塊窗口[Executable modules window]

可執行模塊窗口(快捷鍵:Alt+E)列出了當前被調試進程加載的所有可執行模塊。它也顯示了很多有用的信息,比如模塊大小、入口地址、模塊版本、以及可執行文件路徑等。一些信息,如以十進制顯示的模塊大小、入口地址的符号名、是否為系統模塊等,通常是被隐藏的。如果想看,可以增加相應欄的寬度。快捷菜單支持以下操作:

刷新[Actualize] - 重新掃描模塊并去除對新加載模塊的高亮顯示。在大多數情況下,OllyDbg會自動完成該操作。

查看内存[View memory] - 打開内存窗口,并定位到屬于該模塊鏡像的第一個内存塊處。

在CPU窗口中查看代碼[View code in CPU] (快捷鍵:回車鍵) - 在反彙編窗口中顯示模塊的可執行代碼。

跟進到入口[Follow entry] - 在反彙編窗口中跟進到模塊的入口處。

在CPU窗口中查看數據[Dump data in CPU] -在CPU窗口的數據面闆中顯示模塊的數據段。塊代碼段。

顯示名稱[View names] (快捷鍵:Ctrl+N) -顯示當前模塊定義或使用的全部名稱[names](包括輸出表、引入表、鍊接庫、用戶自定義)。

标記為系統DLL[Mark as system DLL],

标記為非系統DLL[Mark as non-system DLL] - 将選中模塊标記為系統或非系統屬性。如果設置為系統屬性,則在Run跟蹤[Run trace] 時會直接執行(不進行跟蹤)這個模塊,從而大大加快跟蹤速度。默認情況下,所有駐留在系統目錄(通常在Windows 95/98下為c:windowssystem ,在WinNT/2000/XP下為c:winntsystem32)的模塊都認為是系統模塊。

立即更新.udd文件[Update .udd file now] -向文件“.udd”寫入模塊相關的全部數據,udd文件保存了在調試期間設置的斷點、标簽、注釋、監視、分析等信息。當模塊卸載時OllyDbg會自動創建.udd文件。

查看可執行文件[View executable file] - 顯示可執行文件的全部内容。

查看全部資源[View all resources] - 以列表形式顯示模塊定義的全部資源,并帶有一個簡短信息。OllyDbg并不把資源當作單獨實體來支持。您可以提取[Dump]并以二進制的形式進行編輯。

查看資源字符串[View resource strings] -以列表形式顯示資源字符串及其标識符。

查看Run跟蹤的統計[View run trace profile] - 在此模塊中計算統計[profile] 。相關信息:Run跟蹤[Run trace].

分析全部模塊[Analyze all modules] -允許同時分析全部模塊。分析将從代碼中提取大量的有用信息;代碼經過分析後再進行調試,通常會非常快并且可靠。

鼠标雙擊某一行,将會在反彙編窗口中顯示模塊的執行代碼。十,内存映射窗口[Memory map window]

内存映射窗口顯示了被調試程序分配的所有内存塊。因為沒有标準的方法來完成這項任務,所以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數據窗口中查看[Dump in 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] -以多行文本的方式将整個内存映像信息複制到剪切闆,該文本的第一行為窗口标題("内存映射[Memory map]"), 第二行為列标題欄,後面幾行的内容為内存數據記錄。複制将保持列的寬度。如果複制時想排除某些列,可将該列的寬度置為最小(該欄剩餘的邊框将變灰)。十一,監視與監察器[Watches and inspectors]

監視[Watch] 窗口包含若幹個表達式[expressions]。它在第二列裡顯示這些表達式的值。OllyDbg 會把這些表達式保存到主模塊的.UDD文件中,因此它們在下一次調試時同樣有效。

監察器[inspector]是顯示若幹變量、1/2維數組或是選定項目結構數組[selected items of array of structures]的獨立窗口。它的表達式與監視窗口中的基本相同,隻是多包含了兩個參數:%A和%B。您可以指定這兩個參數的界限,OllyDbg 将會用所有可能的組合代替表達式中的%A和%B。從0開始一直到界限(不包含界限),并在表格中顯示結果。參數%B(列數)的界限不能超過16。

例如,如果您指定了表達式%A+%B,并且限定%A和%B的上限為3,您将獲得如下的表格:

十三,線程[Threads]

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 in CPU](雙擊)- 在CPU窗口中顯示所選線程的當前狀态。十四,複制到剪切闆[Copy to clipboard]

整行[Whole line] -全部行--以多行文本的形式并帶注釋将所選記錄複制到剪切闆。如果在複制時想排除某個欄目,可以将該欄的寬度置為最小(欄目的殘留部分将變灰)。

整個表格[Whole table] - 整個表格--以多行文本的形式将整個内存映象複制到剪切闆,該文本的第一行包含窗口标題(“内存映射[Memory map]”),第二行是欄目标題,所有後繼行是内存數據記錄。複制将保持欄目的寬度。如果在複制時想排除某些欄目,可以将該欄的寬度置為最小(欄目的殘留部分将變灰)。十五,調用棧[Call stack]

調用棧窗口(快捷鍵: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].後,棧移動會更可靠并且迅速。十六,調用樹[Call tree]

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

某些函數調用将會添加如下注釋之一:

葉子[Leaf] 不調用其他函數

純函數[Pure] 不調用函數,不會産生副作用

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

系統[Sys] 系統動态鍊接庫中的函數。系統動态鍊接庫定義為保存在系統目錄下的動态鍊接庫。

如果想在調用樹上移動,可以雙擊“被調用[Called from]”或“調用/直接調用[Calls/Calls directly]”兩欄中的地址。調用樹窗口保存了移動記錄(快捷鍵“-”和“+”)。

如果被調試的程序包含幾個模塊,推薦您分析所有模塊。Call tree 不會試圖處理系統函數。十七,選項[Options]

外觀選項[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]十八,搜索[Search]

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跟蹤的記錄[record in run trace]

參考命令[referencing commands]

十九,自解壓文件[Self-extracting (SFX) files]

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

OllyDbg 包含了幾個便于完

相關詞條

相關搜索

其它詞條