查看單個文章
舊 2006-05-25, 03:46 PM   #2 (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 金幣
預設

按 Esc 鍵或發出任何單步指令

- OllyDbg 遇到斷點

- 被偵錯程序發生異常

使用「+」和「-」按鍵,可以回朔以前的執行歷史〔execution history〕.

注意:當執行停止時 OllyDbg 將會重新整理大部分視窗。如果動態執行程序非常慢,可以嘗試關掉或最小化沒有用的視窗。

另外,更快捷的找到以前執行指令的辦法是Run跟蹤〔run trace〕。它將新增一個執行傳輸協定並告知您指定指令的執行時間和次數

二一,Hit跟蹤〔Hit trace〕

Hit跟蹤能夠讓您辨別哪一部分程式碼執行了,哪一部分沒有。OllyDbg的實現方法相當簡單。它將選區域的每一條指令處均設定一個INT3斷點。當中斷髮生的時候,OllyDbg便把它去除掉,並把該指令標誌為命中〔hit〕。因為每個跟蹤斷點只執行一次,所以這種方法速度非常快。

在使用Hit跟蹤的時候,一定要注意不能在資料中設定斷點,否則應用程式極有可能崩潰。因此,您必須開啟相關的表單選項,以進行程式碼分析〔analyze〕。我推薦您選項嚴格或啟髮式函數識別〔strict or heuristical procedure recognition〕。如果選項模糊〔Fuzzy〕的話,可能會產生很多難以容忍的錯誤,而且經常把本不是函數的程式碼段識別成函數。

只要您在模組中設定了跟蹤斷點,哪怕只設了一個,OllyDbg都會分配兩倍於程式碼段大小的緩衝區。

注意:當您結束Hit跟蹤的時候,Run跟蹤也會同時結束。

Run 跟蹤〔Run trace〕
Run跟蹤是一種反方向跟蹤程序執行的方式,可以瞭解以前發生的事件。您還可以使用Run跟蹤來瞭解執行的簡單統計〔profile〕。基本上,OllyDbg 是一步一步地執行被偵錯程序的,就像動畫〔animation〕演示一樣,但不會既時重新整理視窗,最重要的是它能將位址、暫存器的內容、消息以及已知的操作數記錄到Run跟蹤緩衝區中。如果被偵錯的程式碼是自修改的,您就能夠儲存原始的指令。可以通過按Ctrl+F11(Run跟蹤步入,進入子函數)或者Ctrl+F12(Run跟蹤步過,一次執行完子函數)開始Run跟蹤,並用F12或者Esc鍵停止跟蹤。

您可以指定在Run跟蹤時執行每一步的條件集(快捷鍵:Ctrl+T)。如果條件符合,Run跟蹤將暫停。條件包括:


?當EIP在某個位址範圍內時暫停〔Pause when EIP is in the address range〕;
?當EIP在某個位址範圍之外時暫停〔Pause when EIP is outside the address range〕;
?當某個條件為真時暫停〔Pause when some condition is true〕;
?當下一條指令可疑時暫停〔Pause when next command is suspicious〕,比如: 可能為非法指令(根據在分析3〔Analysis 3〕中設定的規則而定),訪問不存在的記憶體,設定了單步陷阱標誌〔single-step trap flag〕或者越ESP界訪問棧。注意這個選項會明顯地(大約20%)減慢Run跟蹤的速度;

?當指令執行達到指定的次數(更確切的說,是增加到Run跟蹤的緩衝區裡面的指令數量)時暫停〔Pause after specified number of commands is traced〕。注意計數器不能自動歸零。也就是說,如果您設定指令次數為10,則在第10次執行到該指令時暫停,並不是該指令每執行10次就暫停一次。

?當下一條指令符合指定的樣式之一時暫停〔Pause when next command matches one of the specified patterns〕。您可以使用模糊指令和操作數〔imprecise commands and operands〕及匹配32位暫存器RA和RB,像R32一樣,這兩個暫存器可以替代任何通用32位暫存器,但是在同一條指令中其值是不能變的。而 RA 和 RB
在同一條指令中,則一定是不同的。例如,在程序中含有 XOR EAX,EAX; XOR ESI,EDX 兩條指令,兩條指令均符合樣式 XOR R32,R32;第一條指令符合樣式XOR RA,RA
;而等二條指令 XOR ESI,EDX 符合樣式XOR RA,RB。

毫無疑問,Run跟蹤需要足夠的記憶體,每條指令平均需要佔用16到35字元,同時速度也非常慢。在500-MHZ處理器、Windows NT環境下,它每秒能跟蹤5000條指令。
Windows95更慢:每秒鍾僅2200條指令。但是在許多情況下,例如當一個程序跳轉到不存在的位址的時候,這是找到原因的唯一方法。您可以在Run跟蹤時將准線性指令序列(即序列尾部只有唯一出口)跳過。當OllyDbg遇到這些需跳過的指令序列時,會設定一個臨時斷點,然後跟進到序列中,並一次執行完。當然了,如果排除指令中返回或跳轉的位址在跟蹤範圍之外,將可能導致跟蹤發生錯誤;因此OllyDbg會檢查您想跳過的程式碼塊,如果存在上述情況,會向您詢問。

在大多數情況下,您對跟蹤系統API程式碼不感興趣。跟蹤選項總是跟過系統DLL〔Always trace over system DLLs〕允許您在 跟蹤/自動 模式下跟過API函數。如果模組在系統目錄下,OllyDbg就假設該模組是系統的。您可以在模組〔Modules〕視窗中標記任意DLL是系統的或者非系統的。

為了使執行速度更快,您可以通過設定Run跟蹤斷點,先將Run跟蹤限制在選定的指令或程式碼塊上,然後再執行程序。我把這種做法稱作「強迫Run跟蹤」。一般來說,移除Run跟蹤斷點不會移除Hit跟蹤斷點。但如果您移除了hit跟蹤斷點,同時您也移除了Run跟蹤斷點。


跟蹤指令會儲存到跟蹤緩衝區中,這個緩衝區在跟蹤開始時自動新增。您可以在選項中指定它的大小(最高64MB)。這個緩衝區是循環貯列,當滿了的時候,會丟棄老的記錄。

您可以通過從OllyDbg主表單中選項「偵錯〔Debug〕|開啟或者清除Run跟蹤〔Open or clear run trace〕」,來開啟或者清除Run跟蹤緩衝區。在Run跟蹤緩衝區開啟後,
OllyDbg 會記錄在執行程序中的所有暫停,甚至那些不是由Run跟蹤引起的暫停。例如,您可以通過按 F7 或者 F8 單步執行程序,然後通過使用+鍵和-鍵來反方向跟蹤程序的執行。注意:如果Run跟蹤緩衝區已經關閉,則用這些鍵瀏覽的是歷史〔history〕記錄。在您檢視Run跟蹤記錄時,暫存器和訊息面板會變灰,來強調它們所顯示的暫存器並不是實際的暫存器。跟蹤緩衝區並不儲存推疊頂端或由暫存器所指向的內容。暫存器、訊息和棧在Run跟蹤的時候使用實際的記憶體狀態來解釋暫存器的變化。

OllyDbg能夠記下每個指令在Run跟蹤緩衝區裡面出現的次數。在反彙編視窗快捷表單中,選項是「檢視〔View〕|統計作為註釋〔Profile as comments〕」。這個指令使用統計取代了註釋欄。或者,如果列標題欄可見,則可以按下它幾次直到它顯示統計訊息。注意顯示出來的數位是動態的,而且不計算已經從跟蹤緩衝區中丟棄的指令。您還可以在單獨的統計視窗〔Profile window〕中,按觸發次數排序,來檢視整個模組的統計資料。

在反彙編視窗的快捷表單中選項「Run跟蹤〔Run trace〕|增加到所有函數入口處〔Add entries of all procedures〕」,這樣能夠檢查每個可識別的函數被使用的次數。另一個指令「Run跟蹤〔Run trace〕|增加到函數中所有的分支〔Add branches in procedure〕」會強行跟蹤此函數中所有識別的跳轉目的位址的內容。在這種情況下,統計功能能夠找到最頻繁執行的分支,您可以最佳化這部分的程式碼,以提高速度。

在反彙編視窗中的某條指令上使用快捷表單中選項「搜尋〔Search for〕|Run跟蹤的最新記錄〔Last record in run trace〕」用於尋找該指令是否被執行過,如果執行過,最後一次執行在哪裡。


Run跟蹤視窗顯示跟蹤緩衝區的內容。對每個指令來說包括被指令改變的整數暫存器的內容(更準確的說是給定的記錄變成下一條記錄的變化)。如果您雙按某條指令,視窗會選項在跟蹤緩衝區裡全部含有該指令的記錄,而且您可以通過按+和-鍵來快速的瀏覽;如果您在偵錯選項〔Debugging options〕中設定了 「跟蹤〔Trace〕|同步CPU和
Run跟蹤〔Synchronize CPU and Run trace〕」,雙按記錄則會跟進到對應的反彙編視窗中位置。

注意:當您結束Hit跟蹤時,您同時也強行結束了Run跟蹤。

通用快捷鍵〔Global shortcuts〕

無論現用的OllyDbg視窗是什麼,這些快捷鍵均有效:


Ctrl+F2 - 重新啟動程序,即重新啟動被偵錯程序。如果當前沒有偵錯的程序,OllyDbg會執行歷史列表〔history list〕中的第一個程序。程序重新啟動後,將會移除所有記憶體斷點和硬體斷點。
譯者註:從實際使用效果看,硬體斷點在程序重新啟動後並沒有移除。

Alt+F2 - 關閉,即關閉被偵錯程序。如果程序仍在執行,會彈出一個提示訊息,詢問您是否要關閉程序。

F3 - 彈出「開啟32位.EXE文件」對話視窗〔Open 32-bit .EXE file〕,您可以選項可執行文件,並可以輸入執行參數。

Alt+F5 - 讓OllyDbg總在最前面。如果被偵錯程序在某個斷點處發生中斷,而這時偵錯程序彈出一個總在最前面的視窗(一般為模式消息或模式對話視窗〔modal message or dialog〕),它可能會遮住OllyDbg的一部分,但是我們又不能移動最小化這個視窗。啟動OllyDbg(比如按工具列上的標籤)並按Alt+F5,OllyDbg將設定成總在最前面,會反過來遮住剛才那個視窗。如果您再按一下Alt+F5,OllyDbg會恢復到正常狀態。OllyDbg是否處於總在最前面狀態,將會儲存,在下一次偵錯時依然有效。當前是否處於總在最前面狀態,會顯示在狀態列中。

F7 - 單步步入到下一條指令,如果當前指令是一個函數〔Call〕,則會停在這個函數體的第一條指令上。如果當前指令是是含有REP前綴,則只執行一次重複操作。

Shift+F7 - 與F7相同,但是如果被偵錯程序發生異常而中止,偵錯器會首先嘗試步入被偵錯程序指定的異常處理(請參考忽略Kernel32中的記憶體非法訪問)。

Ctrl+F7 - 自動步入,在所有的函數使用中一條一條地執行指令(就像您按住F7鍵不放一樣,只是更快一些)。當您執行其他一些單步指令,或者程序到達斷點,或者發生異常時,自動步入程序都會停止。每次單步步入,OllyDbg都會更新所有的視窗。所以為了提高自動步入的速度,請您關閉不必要成視窗,對於保留的視窗最好盡量的小。按Esc鍵,可以停止自動步入。

F8 - 單步步過到下一條指令。如果當前指令是一個函數,則一次執行完這個函數(除非這個函數內部包含斷點,或發生了異常)。如果當前指令是含有REP前綴,則會執行完重複操作,並停在下一條指令上。

Shift+F8 - 與F8相同,但是如果被偵錯程序發生異常而中止,偵錯器會首先嘗試步過被偵錯程序指定的異常處理(請參考忽略Kernel32中的記憶體非法訪問)。

Ctrl+F8 - 自動步過,一條一條的執行指令,但並不進入函數使用內部(就像您按住F8鍵不放一樣,只是更快一些)。當您執行其他一些單步指令,或者程序到達斷點,或者發生異常時,自動步過程序都會停止。每次單步步過,OllyDbg都會更新所有的視窗。所以為了提高自動步過的速度,請您關閉不必要成視窗,對於保留的視窗最好盡量的小。按Esc鍵,可以停止自動步過。

F9 - 讓程序繼續執行。

Shift+F9 - 與F9相同,但是如果被偵錯程序發生異常而中止,偵錯器會首先嘗試執行被偵錯程序指定的異常處理(請參考忽略Kernel32中的記憶體非法訪問)。

Ctrl+F9 - 執行直到返回,跟蹤程序直到遇到返回,在此期間不進入子函數也不更新CPU資料。因為程序是一條一條指令執行的,所以速度可能會慢一些。按Esc鍵,可以停止跟蹤。

Alt+F9 - 執行直到返回到用戶程式碼段,跟蹤程序直到指令所屬於的模組不在系統目錄中,在此期間不進入子函數也不更新CPU資料。因為程序是一條一條執行的,所以速度可能會慢一些。按Esc鍵,可以停止跟蹤。

Ctrl+F11 -Run跟蹤步入,一條一條執行指令,進入每個子函數使用,並把暫存器的訊息加入到Run跟蹤的儲存於資料中。Run跟蹤不會同步更新CPU視窗。

F12 - 停止程序執行,同時暫停被偵錯程序的所有執行緒。請不要手動恢復執行緒執行,最好使用繼續執行快捷鍵或表單選項(像 F9)。

Ctrl+F12 - Run跟蹤 步過,一條一條執行指令,但是不進入子函數使用,,並把暫存器的訊息加入到Run跟蹤的儲存於資料中。Run跟蹤不會同步更新CPU視窗。

Esc - 如果當前處於自動執行或跟蹤狀態,則停止自動執行或跟蹤;如果CPU顯示的是跟蹤資料,則顯示真實資料。

Alt+B - 顯示斷點視窗。在這個視窗中,您可以編輯、移除、或跟進到斷點處。

Alt+C - 顯示CPU視窗。

Alt+E - 顯示模組列表〔list of modules〕。

Alt+K - 顯示使用棧〔Call stack〕視窗。

Alt+L - 顯示日誌視窗。

Alt+M - 顯示記憶體視窗。

Alt+O - 顯示選項對話視窗〔Options dialog〕

Ctrl+P - 顯示修正檔視窗。

Ctrl+T - 開啟 暫停 Run跟蹤 對話視窗

Alt+X - 關閉 OllyDbg。

大多數視窗都支持以下的鍵盤指令:


Alt+F3 - 關閉當前視窗。

Ctrl+F4 - 關閉當前視窗。

F5 - 最大化當前視窗或將當前視窗大小改為正常化。

F6 - 切換到下一個視窗。

Shift+F6 - 切換到前一個視窗。

F10 - 開啟與當前視窗或面板相關的快捷表單。

左方向鍵 - 顯示視窗左方一個字元寬度的內容。

Ctrl+左方向鍵 - 顯示視窗左方一欄的內容。

右方向鍵 - 顯示視窗右方一個字元寬度的內容

Ctrl+右方向鍵 - 顯示視窗右方一欄的內容


反彙編視窗中的快捷鍵〔Disassembler shortcuts〕

當CPU視窗中的反彙編面板〔Disassembler pane〕處於啟動狀態時,您可以使用以下快捷鍵:

Enter鍵鍵 - 將選的指令增加到指令歷史〔command history〕中,如果當前指令是一個跳轉、函數或者是轉換表的一個部分,則進入到目的位址。

退格鍵 - 移除選部分的自動分析訊息。如果分析器將程式碼誤識別為資料,這個快捷鍵就非常有用。請參考解碼提示〔decoding hints〕.

Alt+退格鍵 - 撤消所選部分的修改,以制作備份資料的相應內容取代所選部分。僅當制作備份資料存在且與所選部分不同時可用。

Ctrl+F1 -如果API求助文件已經選項,將開啟與首個選項行內的符號名相關聯的說明主題。

F2 -在首個選項的指令上開關INT3 斷點〔Breakpoint〕,也可以雙按該行第二列。

Shift+F2 -在首個選項指令設定條件斷點,參見忽略Kernel32中記憶體訪問異常〔Ignore memory access violations in Kernel32〕。

F4 -執行到所選行,在首個選項的指令上設定一次性斷點,然後繼續執行偵錯程序,直到OllyDbg捕獲到異常或者停止在該斷點上。在程序執行到該指令之前,該一次性斷點一直有效。如有必要,可在斷點視窗〔Breakpoints window〕中移除它。

Shift+F4 -設定記錄斷點(一種條件斷點,當條件滿足時一些陳述式的值會記錄下來), 詳情參見斷點〔Breakpoint〕。

Ctrl+F5 -開啟與首個選項的指令相對應的源文件。

Alt+F7 -轉到上一個找到的參考。

Alt+F8 -轉到下一個找到參考。

Ctrl+A -分析當前模組的程式碼段。

Ctrl+B - 開始二進制搜尋。

Ctrl+C -複製所選內容到記事本。複製時會簡單地按列寬截斷不可見內容,如果希望排除不需要的列,可把這些列的寬度調整到最小。

Ctrl+E -以二進制(十六進制)格式編輯所選內容。

Ctrl+F -開始指令搜尋。

Ctrl+G -轉到某位址。該指令將彈出輸入位址或陳述式的視窗。該指令不會修改 EIP。

Ctrl+J -列出所有的涉及到該位置的使用和跳轉,在您用這個功能之前,您必須使用分析程式碼功能。

Ctrl+K - 檢視與當前函數相關的使用樹〔Call tree〕。在您用這個功能之前,您必須使用分析程式碼功能。

Ctrl+L - 搜尋下一個,重複上一次的搜尋內容。

Ctrl+N - 開啟當前模組的名稱(標籤)列表。

Ctrl+O - 掃瞄object文件。掃瞄Object文件。該指令會顯示掃瞄Object文件對話視窗,您可以在該對話視窗中選項Object文件或者lib文件,並掃瞄這個文件,試圖找到在實際程式碼段中用到的目標模組。


Ctrl+R -搜尋所選指令的參考。該指令掃瞄啟動模組的全部可執行程式碼,以找到涉及到首個選的指令的全部相關參考(包括:常量、跳轉及使用),您可以在參考中使用快捷鍵 Alt+F7 和 Alt+F8來瀏覽這些參考。為便於您使用,被參考的指令也包含在該列表中。

Ctrl+S -指令搜尋。該指令顯示指令尋找〔Find command〕對話視窗供您輸入彙編指令,並從當前指令開始搜尋。

星號〔Asterisk〕(*) -轉到原始位置(啟動執行緒的EIP處)。

Ctrl+星號(*) - 指定新的起始位置,設定當前所選執行緒的EIP為首個選項字元的位址。您可以在選項EIP並撤消該操作。

加號〔Plus〕(+) -如果run跟蹤〔run trace〕 沒有啟動,則根據指令歷史〔command history〕跳到下一條執行過指令的地方;否則跳到Run跟蹤的下一個記錄。

Ctrl+加號 - 跳到前一個函數開始處。(注意只是跳到,並不執行)

減號〔Minus〕(-) - 如果run跟蹤〔run trace〕 沒有啟動,則根據指令歷史〔command history〕跳到前一條執行過指令的地方;否則跳到Run跟蹤的前一個記錄。

Ctrl+減號 - 跳到下一個函數開始處。(注意只是跳到,並不執行)

空格〔Space〕 - 修改指令。您可在顯示對話視窗中以彙編語言修改實際指令或輸入新指令,這些指令將取代實際程式碼,您也可以在想要修改的指令處雙按滑鼠。

冒號〔Colon〕( - 增加標籤。顯示增加標籤視窗〔Add label〕或修改標籤視窗〔Change label〕,您可在此輸入與首個選項的指令中的第一個字元相關聯的標籤(符號名)。注意,在多種編程語言中,冒號可以是標籤的一部分。

分號〔Semicolon〕( - 增加註釋〔comment〕。顯示增加註釋視窗〔Add label〕或修改註釋視窗〔Change label〕,您可在此輸入與首條所選指令的第一個字元相關聯的註釋(註釋串會顯示在最後一列中)。注意,多種彙編語言使用分號作為註釋開始。您也可以在註釋列雙按需要註釋的指令行。

插件〔Plugins〕

插件是一個DLL,存放在OllyDbg的目錄中,用於增加 OllyDbg 的功能。您可以從 OllyDbg 的主頁上(http://home.t-online.de/home/Ollydbg)免費下載插件開發工具包
plug110.zip。

插件可以設定斷點,增加標籤和註釋,修改暫存器和記憶體。插件可以增加到主表單和很多的視窗(比如反彙編視窗、記憶體視窗)的快捷表單中,也可以攔截快捷鍵。插件還可以新增MDI(多我的文件介面)視窗。插件還可以根據模組訊息和OllyDbg.ini文件,將自己資料寫到.udd文件中;並能讀取描述被偵錯程序的各種資料結構。插件API包含了多達170
個函數。

許多第三方插件都可以從Internet網上獲得,比如由網友TBD新增並維護的OllyDbg的論壇(http://ollydbg.win32asmcommunity.net)。

安裝插件的方法:將DLL複製到插件目錄〔plugin directory〕中,然後重新啟動Ollydbg。預設值情況下,這個插件目錄為ollydbg.exe文件所在的目錄。

現在的版本中已經包含了兩個「原始」插件: 書籤〔Bookmark〕 and 指令行〔Command line〕. 他們的來源碼都儲存在plug110.zip.文件中。這些插件都是免費的,您可以任意修改或使用它們。

技巧提示〔Tips and tricks〕

?OllyDbg 可以作為二進制編輯器使用。選項視圖〔View〕→文件〔File〕並選定需要檢視的文件。文件不能大於剩餘記憶體數量。

?假使您修改了記憶體中的執行文件,這時您想恢復修改的部分,但是您忘記哪裡被修改了,您可以把原始文件當作制作備份進行載入,這樣您就可以找到修改的部分了。

分析前,先掃瞄 OBJ 文件。這時 OllyDbg 會對已知 C 函數的參數進行解碼。

一些表格中包含了隱藏資料。可以通過增加列寬來顯示出來。

所有資料視窗(包括反彙編視窗),可以通過雙按顯示相對的位址。

您可以通過 Ctrl +↑ 或 Ctrl+↓ 對資料視窗翻動一個字元。

偵錯獨立的DLL〔Debugging of stand-alone DLLs〕

開啟DLL,也可以直接將其從檔案總管拖放到 OllyDbg 上。OllyDbg 會詢問您並將該檔案的全路徑作為參數傳送給loaddll.exe.。然後連接庫被載入並停在程式碼的入口(
<DllEntryPoint>)。您可以設定斷點,執行或跟蹤啟動程式碼,等等。在啟始化完成後,應該程序會再次暫停。這次停在標籤名為 Firstbp 的位置,其在立即進入主消息循環之前。


現在,您可以使用DLL函數。從主表單選項「偵錯〔Debug〕|使用DLL輸出〔Call DLL export〕」。這時會彈出一個對話視窗。由於這個對話視窗是無模式對話視窗,因此您仍然能夠使用OllyDbg的全部功能,比如檢視程式碼、資料,檢視斷點,修改記憶體等等。
選項您想使用的函數。例如我們將開始使用 USER32.DLL 裡的MessageBox 函數。注意loaddll.exe 已經使用了這個連接庫,因此會假定這個 DLL 已經啟始化而不再使用入口。MessageBox 這個函數名是通用函數名,實事上,這個函數有處理 ASCII 的 MessageBoxA 和處理 Unicode 的MessageBoxW 兩種。我們繼續往下看:
__________________
http://bbsimg.qianlong.com/upload/01/08/29/68/1082968_1136014649812.gif
psac 目前離線  
送花文章: 3, 收花文章: 1631 篇, 收花: 3205 次
有 2 位會員向 psac 送花:
Jamaalacugs (2018-04-20),Jamaalacugs (2018-04-20)
感謝您發表一篇好文章