OllDbg翻譯

看雪資料發表於2003-06-18

本人是菜菜鳥。剛剛接觸OllyDbg,發現中文資料很少,於是去啃它的help。
本人英文也不大好,看英文總沒中文順暢,所以嘗試翻譯一下,加深理解。
順便也讓和我一樣英文不佳的人輕鬆點。多數是意譯,有不確的地方,敬請見諒,並指出。
高手和英文通們就不必看了

我希望你熟悉80x86相容CPU的內部結構,並且有彙編寫程式的經歷。我也希望你
熟悉Microsoft Windows.
OllyDbg是一個單程式多執行緒的“機器程式碼級”debugger,用於Windows環境下的32位程式。它允許你debug和patch PE格式的可執行程式。OllDbg僅僅使用列入文件的Win32 API呼叫,所以可用於下一代32位Windows系統。OllDbg看來也可工作於Windows XP,但是我沒有詳盡的測試,因此不能保證功能完整。
OllyDbg不是面向編譯器。它不含特別的規則顯示某些情況下特定的編譯程式生成哪些程式碼序列。因此,你可以一樣對待任何編譯器編譯的,或者彙編書寫的任何程式碼。
OllyDbg與被除錯的程式同時工作。你可以瀏覽程式碼和資料、設定斷點、停止或繼續執行緒,甚至執行期修改記憶體(有時這叫作軟除錯方式)。當然,如果被請求的操作不是最基本的,OllyDbg就會短時暫停程式,但這對使用者透明。有時不在除錯狀態執行的程式會意外崩潰。OllyDbg,這個“及時”debugger,會指出異常發生的位置。
OllyDbg強烈面向模組。模組這裡指啟動時載入的或動態載入的主執行檔案或動態連線庫。在除錯區,你可以設定斷點,定義新標號和註釋彙編語句。當一些模組從記憶體解除安裝後,OllyDbg儲存這些資訊到副檔名為.UDD名字同被除錯模組的檔案中。下次當裝載這些模組時,OllyDbg自動復原所有除錯資訊,不論程式是否使用這些模組。比如:你除錯使用Mydll的程式Myprog1,並且在Mydll中設定一些斷點。那麼當你除錯Myprog2時,也使用Mydll,你會發現所有在Mydll中的斷點還在那裡,不管Mydll是否裝載在不同的位置。
一些偵錯程式把被除錯程式的記憶體視為單個2**32位元組區域。OllyDbg做了別的處理方法。記憶體由幾個獨立的塊組成。任何記憶體操作都限制於塊內。在大多數案例中,這工作優良並且容易除錯。但是模組包含幾個執行部分等等,你將不能立刻看到整個程式碼。然而這些例外不常見。
OllyDbg是記憶體消耗大戶。啟動時就要分配3MB記憶體,甚至更多。每次分析,備份,跟蹤或檔案轉儲另外再分配。所以當你除錯大工程時消耗40或60M記憶體很正常。
要有效的除錯一些無原始碼的程式,你首先必須理解它是如何工作的。OllyDbg提供了大量的手段使理解更容易

 

分析
OllyDbg整合了快速超強的程式碼分析器。裝載它,可以用彈出式選單或者CPU視窗
的反彙編欄按Ctrl+A或者在執行模組選“Analyze all modules”。
分析器非常有用。它在資料中分辨程式碼,標記入口點和jump的目標,辨認switch
tables,ASCII和UNICODE字串,定位過程、迴圈、高階switch語句和解碼標準
API函式引數(看範例)。OllyDbg的其它部分也廣泛用於資料分析。
這怎麼可能呢?我稍微介紹一下原理。首先,OllyDbg反彙編程式碼區所有可能的地
址,記下所有發現的呼叫及指向的目標。當然,許多這樣的呼叫不正確,但是未
必會有兩個錯誤的呼叫指向同一條命令,並且三個或三個以上更不可能。這樣,
三個或更多呼叫指向同一地址,我就確信該地址是經常使用的子過程入口。從這
個入口開始,我跟蹤所有的跳轉和呼叫,反覆操作。這種方法使我99.9%確定所
有命令。然而,某些位元組不在這條鏈中,我採用大約20個更高效的方法(最簡單
的如:“MOV [RA],Ra"是無效命令).
過程檢測也簡單。過程,從分析器的角度看,就是從入口開始的程式碼的連續區域
,(理論上)可以到達其它命令(除NOP或對齊填充外)。你可以指定三種識別級
。Strict級嚴格確認一個入口和至少一個出口。heuristical級,分析器嘗試確認
入口。如果你選擇fuzzy級,或多或少相容的程式碼區被分離為過程。現代編譯器把
過程分成幾個部分作公用程式碼最佳化。這種情況下,fuzzy級特別有用!然而,誤解
的機率也相當高。
類似的,loop是一個封閉的連續命令序列,這裡最後的命令跳到開頭、一個入口
幾個出口。Loop相當於高階操作語言中的do,while和for。OllyDbg能認識任何復
雜的巢狀迴圈。在反彙編區,他們用長長的大括號標記。如果入口不是迴圈的第
一條命令,OllyDbg用個小三角形作標記。
實現switch語句,多數編譯器把switch變數裝入暫存器,然後減去一部分,像下
面程式碼序列一樣:
    MOV EDX,<switch variable>
    SUB EDX,100
    JB DEFAULTCASE
    JE CASE100        ; Case 100
    DEC EDX
    JNE DEFAULTCASE
    ...               ; Case 101
這些序列也可能包含一級或兩級switch表,直接比較,最佳化,填充等等。如果你
深入研究比較和跳轉樹,很難說哪一條命令是某個case語句。OllyDbg為你代勞。
它標記所有的case語句,包括default,甚至嘗試猜測case的意思,如'A',
WM_PAINT 或者 EXCEPTION_ACCESS_VIOLATION。如果命令序列不修改暫存器(只
由比較命令構成),那麼不大可能是switch語句,但可能是if巢狀:
    if (i==0) {...}
    else if (i==5) {...}
    else if (i==10) {...}
讓OllyDbg解碼if巢狀為switch,選擇Analysis1中相應的選項。
OllyDbg預置超過1900個常用API函式的描述。包括KERNEL32, GDI32, USER32,
ADVAPI32, COMDLG32, SHELL32, VERSION, SHLWAPI, COMCTL32, WINSOCK,
WS2_32 和 MSVCRT。你也可以加入自己的描述。如果分析器遇到已知函式名的調
用(或跳轉到該函式),它嘗試解碼呼叫跟前的PUSH命令。因此,你可以粗略翻
譯該呼叫的功能。OllyDbg也內建大約400個標準C函式的描述。如果你利用新庫,
我建議你分析前先掃描物件檔案。這種情況下,OllyDbg也會解碼已知的C函式參
數。
如果選項“Guess number of arguments of unknown functions”被設定,分析
器嘗試確認呼叫過程進棧的雙字數目,並標記他們為引數Arg1,Arg2等等。注意:
如果有暫存器引數,OllyDbg還是不認識也不包括在上面的統計中。分析器採用了
一個安全的方法。例如,它不分辨無引數過程和返回前用POP恢復暫存器代替捨棄
引數的case語句。然而,能分辨出的函式數目相當多,並非常有助於提高程式碼的
可讀性。
分析器能跟蹤暫存器的值。現代最佳化編譯器,特別是面向Pentium的,經常把常量
和地址裝入暫存器便於重複使用或減小記憶體佔用空間。如果一些常量裝入暫存器
,分析器會注意它,並用於解碼函式及其引數。還能執行簡單的算術計算跟蹤
push和pop命令。
分析器不能區別不同型別的名字。如果你用已有的名字命名一些函式,OllyDbg會
解碼所有該地址的呼叫為原過程。WinMain,DllEntryPoint和WinProc是特殊的預
定義名。你可以使用這些標號標記主程式入口,DLL入口指標和window過程(注意
:OllyDbg不會檢查使用者定義標號的唯一性)。當然,最好的方法是顯示已定義的
引數。
非常不幸,沒有一般的規則用於100%的準確分析。有些情況下,例如當模組包含
p-程式碼或者程式碼區嵌入大量資料,分析器可能認為部分資料是程式碼。如果統計分
析顯示程式碼可能被打包或加密,分析器會警告你。如果你想用hit跟蹤方式,我建
議你不要用fuzzy分析方式,否則斷點被設定在被誤認為程式碼的資料上的機率很高。
自解壓檔案通常在主體程式碼外有解壓程式碼。如果你選擇SFX選項“Extend code
section to include self-extractor”,OllyDbg會擴大程式碼區,形式上允許分
析它並跟蹤。

OllyDbg的help-怎樣開始除錯

最簡單的方法是啟動OllyDbg,點選File|Open,然後選擇你想除錯的程式。程式需要命令列引數輸入對話方塊下方的文字欄。
重新開始除錯最後一個程式的快捷鍵是Ctrl+F2,並且OllyDbg使用相同的引數。
你也可以點選歷史記錄。把程式拖入OllyDbg也可以開始除錯。
當然,當啟動OllyDbg時,你在命令列中也能指定被除錯的程式名和引數。比如:
你可以建立桌面快捷方式指向OllyDbg,選擇屬性,到快捷方式,把程式名加入目
標欄。每次你雙擊這個快捷圖示,OllyDbg自動裝載被除錯程式。
你可以attach OllyDbg到某個正在執行的程式。點選File|Attach,從列表中選擇
該程式。注意:當你關閉OllyDbg,這個程式也會終止。不要試圖attach系統程式
,這很可能使系統完全當機。(事實上,大多數情況下,OS不允許attach敏感進
程)
OllyDbg能作為just-in-time debugger。這需要在登錄檔中登記。點選
Options|Just-in-time debugging,在對話方塊中按“Make OllyDbg just-in-time
debugger”。現在,當一些程式崩潰,你會被詢問是否除錯它。這樣,作業系統
可以啟動OllyDbg並直接停在異常發生處。如果你選擇attaching without
confirmation,OllyDbg不會詢問直接啟動。要恢復原來的just-in-time
debugger,在出現的對話方塊中按相應的按紐就行了。
其它方法還有,把OllyDbg加入可執行檔案的彈出式選單。點選Options|Add to
Explorer,按“Add OllyDbg to menu in Windows Explorer”。以後你可以右擊
可執行檔案點選OllyDbg。這個選項建立登錄檔鍵
HKEY_CLASSES_ROOT\exefile\shell\Open with OllyDbg and
HKEY_CLASSES_ROOT\exefile\shell\Open with OllyDbg\command
OllyDbg可以除錯控制檯(基於文字)程式。
注意:WindowsNT或Windows2000下,你必須有管理員許可權。

Golbal shortcuts(通用快捷鍵)
這些快捷鍵在OllyDbg中通用,不依賴於當前活動視窗。
Ctrl--OllyDbg重置,重新開始除錯。如果沒有活動程式,OllyDbg裝入歷史列表中的第一個程式。OllyDbg重置會釋放記憶體移除硬斷點。
Alt+F2--關閉被除錯的程式。如果程式還在活動狀態,你會被詢問是否執行該操作。
F3--顯示“Open 32-bit .exe file”對話方塊,這裡可以選擇可執行檔案和指定引數
Alt+F5--使OllyDbg顯示在螢幕最前方。如果被除錯程式中斷時顯示視窗遮住OllyDbg的一些區域,不繼續執行又不能移動或最小化它。啟用OllyDbg按Alt+F5可以解決。如果你再次按Alt+F5,OllyDbg會恢復為普通視窗。OllyDbg的當前狀態顯示在狀態列。
F7--step into,執行下一條簡單命令。如果該命令是一個函式呼叫,進入呼叫函式內部。如果命令有REP字首,執行該命令的一步操作。
Shift+F7--與F7相同,除了當被除錯程式遇到某些異常時,首先嚐試呼叫程式自己的異常處理過程。
Ctrl+F7--animate into,一步一步執行程式,也進入函式呼叫(就象你一直按著F7,不過更快)。當你執行一些單步或繼續命令,程式到達有效斷點,一些異常發生時,Animation終止。每步執行,OllyDbg重畫所有視窗。要加速animation,關閉所有視窗而不要只改變現有視窗的大小。終止animation,也可按Esc。
F8-step over,執行下一條簡單命令。如果該命令是一個函式呼叫,立刻執行完該函式(除非函式內部有斷點或產生異常)如果命令有REP字首,執行所有重複操作,並停於下一條命令。
Shift+F8--與F8相同,除了當被除錯程式遇到某些異常時,首先嚐試呼叫程式自己的異常處理過程。
Ctrl+F8--animate over,一步一步執行程式,但不進入函式呼叫(就象你一直按著F8,不過更快)。當你執行一些單步或繼續命令,程式Animation到達有效斷點或異常發生時,Animation終止。每步執行,OllyDbg重畫所有視窗。要加速animation,關閉所有視窗而不要只改變現有視窗的大小。終止animation也可按Esc。
F9--繼續執行程式。
Shift+F9--與F9相同。除了當被除錯程式遇到某些異常時,首先嚐試呼叫程式自己的異常處理過程。
Ctrl+F11--run trace into,一步一步執行程式,要進入函式呼叫,記錄暫存器內容。Run trace 不重繪CPU視窗.
F12-懸掛所有執行緒以停止程式執行。最好用繼續鍵和選單命令(像F9)恢復執行執行緒,而不要用其它手動方法恢復。
Ctrl+F12--run trace over,一步一步執行程式,不進入函式呼叫,記錄暫存器內容。Run trace不重繪CPU視窗。
ESC--如果animation或跟蹤正在進行,將被終止。如果CPU視窗顯示跟蹤時的資料,此時轉為顯示實際資料。
Alt+B--開啟或恢復Breakpoint視窗。這裡可以編輯,刪除和觀察斷點。
Alt+C--開啟或恢復CPU視窗。
Alt+E--開啟或恢復模組列表
Alt+E--開啟或恢復Call stack視窗。
Alt+L--開啟或恢復Log視窗。
Alt+M--開啟或恢復Memory視窗。
Alt+O--開啟Option對話方塊
Ctrl+P--開啟Patch視窗。
Ctrl+T--開啟Pause run trace對話方塊
Alt+X-中斷OllyDbg。
多數視窗可以使用下列快捷鍵:
Alt+F3--關閉活動視窗。
Ctrl+F4--關閉活動視窗。
F5--最大化或恢復活動視窗。
F6--啟用下一個視窗。
Shift+F6--啟用前一個視窗。
F10--開啟啟用視窗或皮膚的右鍵選單。
LeftArrow--左移一個字元。
Ctrl+LeftArrow--左移一行。
RightArrow--右移一個字元。
Ctrl+RightArrow--右移一行。


相關文章