注:內容整理自《逆向工程核心原理》,結合我的OllyDbg版本修改了一些內容
1. OllyDbg常用命令及其快捷鍵
指令 | 快捷鍵 | 含義 |
Restart | Ctrl+F2 | 重新開始調試 |
Step Into | F7 | 執行一句OP code,若遇到CALL,進入函數代碼內部 |
Step Over | F8 | 執行一句OP code,若遇到CALL,僅執行函數自身,不跟隨進入 |
Run | F9 | 運行(遇到斷點時暫停) |
Execute till return | Ctrl+F9 | 執行函數代碼內的命令,直到遇到RETN命令,用於跳出函數體 |
Execute till cursor | F4 | 執行到光標所在位置 |
Comment | ; | 添加注釋 |
User-defined comment | 鼠標右鍵菜單Search for-User defined comment | 查看用戶輸入的注釋目錄 |
Label | : | 添加標簽 |
User-defined label | 鼠標右鍵菜單Search for-User defined Label | 查看用戶輸入的標簽目錄 |
Breakpoint | F2 | 設置或取消斷點 |
All referenced text strings | 鼠標右鍵菜單Search for-All referenced text strings | 查看代碼中引用的字符串 |
All intermodular calls | 鼠標右鍵菜單Search for-All intermodular calls | 查看代碼中調用的所有API函數 |
Name in all modules | 鼠標右鍵菜單Search for-Name in all modules | 查看所有API函數 |
Edit data | Ctrl+E | 編輯數據 |
Assemble | 空格鍵 | 編寫匯編代碼 |
Copy to executable file | 鼠標右鍵菜單Copy to executable file | 創建文本副本(修改的項目被保留) |
2. 設置點的方法(這里我們假設大本營的地址為004010ED)
①Goto命令
執行Goto命令(Ctrl+G),在打開的對話框中輸入004010ED,然后單擊OK按鈕,這樣光標就會自動定位到004010ED處
然后執行Execute till cursor(F4)命令,讓調試流運行到該處
②設置斷點
選中004010ED這一行(可以手動找,也可以使用上述Goto命令中的第一步),設置BreakPoint(F2),調試運行到斷點處會暫停
然后執行Run debugged application(F9)即可讓調試直接運行到斷點處暫停
注:在OllyDbg菜單欄中選擇View-Breakpoints(Alt+B),可以打開Breakpoints對話框,列出代碼中設置的斷點。在斷點列表中雙擊某個斷點會直接跳轉到相應位置
③使用注釋
選中004010ED這一行(可以手動找,也可以使用上述Goto命令中的第一步),按;鍵添加注釋
在鼠標右鍵菜單中選擇Search for-User defined comment,就能看到用戶輸入的所有注釋,雙擊相應注釋,光標將自動定位到相應位置
然后執行Execute till cursor(F4)命令,讓調試流運行到該處
④使用標簽
選中004010ED這一行(可以手動找,也可以使用上述Goto命令中的第一步),按:鍵為其添加標簽
在鼠標右鍵菜單中選擇Search for-User defined labels,就能看到用戶設置的所有標簽,雙擊相應標簽,光標將自動定位到相應位置
然后執行Execute till cursor(F4)命令,讓調試流運行到該處
3. 快速查找指定代碼的方法
①代碼執行法
當代碼量不大且程序功能非常明確時,逐條執行指令來查找需要查找的位置。
具體方法為結合使用F8和F7
②字符串檢索法
OllyDbg會先經歷一個預分析過程,此過程中會查看進程內存,程序中引用的字符串和調用的API都會被摘錄出來,整理到另外一個列表中,這樣的列表可以使用鼠標右鍵菜單Search for-All referenced strings來查看
地址00401007處有一條PUSH OFFSET 00411AF0指令,該指令中引用的00411AF0處即是字符串Hello World!,雙擊字符串,光標將定位到00401007這一位置
使用Goto命令查看00411AF0地址處的字符串:
即是Hello World!這個字符串
③API檢索法——在調用代碼中設置斷點
OllyDbg的預分析中不僅可以分析出程序中使用的字符串,還可以摘錄出程序運行時調用的API函數列表,可以通過鼠標右鍵菜單中Search for-Intermodular calls來查看該列表
雙擊其中的任意一行可以定位到該處所對應的代碼位置,使用F2下斷點即可。
④API檢索法——在API代碼中設置斷點
我們編寫的應用程序執行某種操作時(如各種IO操作),必須使用OS提供的API向OS提出請求,然后與被調用API對應的系統DLL文件就會被加載到應用程序的進程內存。使用OllyDbg中的Search for-Names可以列出被加載的DLL文件中提供的所有API
單擊Name欄目按名稱排序,通過鍵盤敲出MessageBoxW后,光標會自動定位到MessageBoxW上,雙擊之后就會顯示其代碼???(我這里好像不太行,此處存疑)
在MessageBoxW函數的內部實現中的起始地址按下F2下斷點,調試時程序運行到該處就會暫停。
4. 修改字符串的方法
①直接修改字符串緩沖區
首先找到Hello World!字符串所在的位置(我這里是00411AF0),在Dump窗口中按Ctrl+G,跳轉到這一位置,使用鼠標選中Hello World這一字符串,按Ctrl+E快捷鍵打開編輯窗口
在彈出的編輯窗口的UNICODE文本框中輸入Hello Reversing字符串,Unicode字符串必須以NULL結束,它占據兩個字節(00 00),添加NULL只能在HEX文本框中添加,修改完畢之后點擊OK即可
這種方法的優點是使用起來非常簡單,缺點是對新字符串的長度有限制,新字符串的長度不應比原字符串長(雖然可執行文件保存時一般會給字符串多留出一些空間)
注意:這種修改方式只是暫時的,終止調試后,程序中的字符串仍然沒有改變。要把這種更改保存下來,就要把更改后的程序另保存為一個可執行文件。
方法如下:在Dump窗口中,選中更改后的Hello Reversing字符串,單擊鼠標右鍵Edit-Copy to Executable,會打開Hex窗口,在彈出的Hex窗口中點擊鼠標右鍵,選擇Save file,保存為新的可執行文件即可。
②在其他內存區域新建字符串並傳遞給消息函數
待補充