查看單個文章
舊 2006-05-25, 03:44 PM   #1 (permalink)
psac
榮譽會員
 
psac 的頭像
榮譽勳章
UID - 3662
在線等級: 級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時
註冊日期: 2002-12-07
住址: 木柵市立動物園
文章: 17381
現金: 5253 金幣
資產: 33853 金幣
預設 OllyDbg完全教學

一,什麼是 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〕並且對其位置進行轉發IP。

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〕,它以二維表的形式呈現,可以允楹徒峁菇薪飴敕治觥?nbsp;

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 能成為非常方便的偵錯器!

二,一般原理〔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 [0],EAX中」)來探測他們

有時,分析器在您感興趣的地方分析錯誤。有兩種解決方法:或者從選的部分移除分析(快捷鍵退格鍵),這樣 OllyDbg 將使用預設值的解碼(反彙編)方式;或者設定
解碼提示〔decoding hints〕並重新分析。注意:在某些情況下,當分析器認為您的提示是不合適的,或者有衝突,則可能忽略您的設定。

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

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

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

MOV EDX,<switch variable>
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〕。

五,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_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 視窗〔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〕 (快捷鍵:Enter鍵鍵) - 在反彙編視窗中顯示模組的可執行程式碼。

跟進到入口〔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:\windows\system ,在WinNT/2000/XP下為c:\winnt\system32)的模組都認為是系統模組。

立即更新.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 包含了幾個便於完成這一工作的功能。

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

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

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

您可以改正入口位置,選項新的入口,從反彙編視窗的快捷表單中選項「斷點〔Breakpoint〕|設定真正的自解壓入口〔Set real SFX entry here〕」。如果相應的SFX選項是開啟的,OllyDbg下次可以迅速而可靠的跳過自抽取程序。

注意:OllyDbg 在跟蹤採取了保護或者反偵錯技術的解壓程序時通常會失敗。

二十,單步執行與自動執行〔Step-by-step execution and animation〕

您可以通過按 F7(單步步入)或 F8(單步步過),對程序進行單步偵錯。這兩個單步執行操作的主要區別在於:如果現用的指令是一個子函數,按F7,將會進入子函數,並停在子函數的第一條指令上;而按 F8,將會一次執行完這個子函數。如果您單步步過的子函數中含有斷點或其他偵錯事件,執行將會被暫停,但 OllyDbg 會在子函數的後一條指令上,自動下一個斷點,而這個斷點您遲早會碰到。

如果被偵錯程序停在異常上,您可以跳過它,並轉到被偵錯程序建立的關鍵句處。只需簡單的 Shift 鍵和任何一個單步指令。

如果需要連續按F7、F8鍵上百次,您可以使用自動執行(Ctrl+F7或者Ctrl+F8)功能。在這種情況下,OllyDbg 將自動重複F7或者F8操作,並且既時更新所有的視窗。這個程序會在下面情況停止:
__________________
http://bbsimg.qianlong.com/upload/01/08/29/68/1082968_1136014649812.gif
psac 目前離線  
送花文章: 3, 收花文章: 1630 篇, 收花: 3204 次
向 psac 送花的會員:
Jamaalacugs (2018-04-20)
感謝您發表一篇好文章