OllyDbg 窗口通用快捷鍵
快捷鍵 | 功能 |
Ctrl + F2 | 重啟程序,即重新啟動被調試程序( 重新載入程序 )。如果當前沒有調試的程序,OllyDbg會運行歷史列表[historylist]中的第一個程序。程序重啟后,將會刪除所有內存斷點和硬件斷點。譯者注:從實際使用效果看,硬件斷點在程序重啟后並沒有移除。 |
Alt + F2 | 關閉,即關閉被調試程序。如果程序仍在運行,會彈出一個提示信息,詢問您是否要關閉程序。 |
F2 | 設置斷點(INT3型斷點),只要在光標定位的位置(上圖中灰色條)按 F2 鍵即可,再按一次 F2鍵則會刪除斷點。 |
Shift + F2 | 設置條件斷點 |
F3 | 彈出 " 打開32位.EXE文件 " 對話框。選擇可執行文件,並可以輸入運行參數。 |
F4 | 運行到所選擇的那一行。作用就是直接運行到光標所在位置處暫停。 即 執行到光標所在位置(直接轉到要調試的位置) |
Shift + F4 | 設置記錄斷點(一種條件斷點,當條件滿足時一些表達式的值會記錄下來), 詳情參見斷點[Breakpoint]。 |
F5 | 最大化當前窗口或將當前窗口大小改為正常化。 |
Alt + F5 | 讓 OllyDbg 總在最前面。 |
F6 | 切換到下一個窗口。 |
Shift + F6 | 切換到前一個窗口。 |
F7 | 單步步入到下一條命令( 單步進入 ),如果當前命令是一個函數[Call],則會停在這個函數體的第一條命令上。如果當前命令是是含有REP前綴,則只執行一次重復操作。 |
Shift + F7 | 與 F7 相同,但是如果被調試程序發生異常而中止,調試器會首先嘗試步入被調試程序指定的異常處理(請參考忽略Kernel32中的內存非法訪問)。 |
Ctr l+ F7 | 自動步入,在所有的函數調用中一條一條地執行命令(就像按住 F7 鍵不放一樣,只是更快一些)。當您執行其他一些單步命令,或者程序到達斷點,或者發生異常時,自動步入過程都會停止。每次單步步入,OllyDbg都會更新所有的窗口。所以為了提高自動步入的速度,請您關閉不必要成窗口,對於保留的窗口最好盡量的小。按Esc鍵,可以停止自動步入。 |
F8 | 單步步過到下一條命令( 單步跳過 )。如果當前命令是一個函數,則一次執行完這個函數(除非這個函數內部包含斷點,或發生了異常)。如果當前命令是含有REP前綴,則會執行完重復操作,並停在下一條命令上。 |
Shift + F8 | 與 F8 相同,但是如果被調試程序發生異常而中止,調試器會首先嘗試步過被調試程序指定的異常處理(請參考忽略 Kernel32 中的內存非法訪問)。 |
Ctrl + F8 | 自動步過,一條一條的執行命令,但並不進入函數調用內部(就像按住 F8 鍵不放一樣,只是更快一些)。當您執行其他一些單步命令,或者程序到達斷點,或者發生異常時,自動步過過程都會停止。每次單步步過,OllyDbg都會更新所有的窗口。所以為了提高自動步過的速度,請您關閉不必要成窗口,對於保留的窗口最好盡量的小。按Esc鍵,可以停止自動步過。 |
F9 | 運行,遇到斷點則停在斷點位置。如果沒有設置相應斷點的話,被調試的程序將直接開始運行直到結束。 |
Shift + F9 | 與 F9 相同,但是如果被調試程序發生異常而中止,調試器會首先嘗試執行被調試程序指定的異常處理(請參考忽略Kernel32中的內存非法訪問)。 |
Ctrl + F9 | 把本層call執行完。即執行函數代碼內的命令,直到遇到 RETN 命令,用於跳出函數體。在此期間不進入子函數也不更新CPU數據。因為程序是一條一條命令執行的,所以速度可能會慢一些。按Esc鍵,可以停止跟蹤。 |
Alt + F9 | 執行直到返回到用戶代碼段,跟蹤程序直到指令所屬於的模塊不在系統目錄中,在此期間不進入子函數也不更新CPU數據。因為程序是一條一條執行的,所以速度可能會慢一些。按Esc鍵,可以停止跟蹤。 |
F10 | 打開與當前窗口或面板相關的快捷菜單。 |
Ctrl + F11 | Run 跟蹤步入,一條一條執行命令,進入每個子函數調用,並把寄存器的信息加入到Run跟蹤的存儲數據中。Run跟蹤不會同步更新CPU窗口。 |
F12 | 暫停程序,F9 可以繼續運行。 |
Ctrl + F12 | Run 跟蹤。步過,一條一條執行命令,但是不進入子函數調用,並把寄存器的信息加入到Run跟蹤的存儲數據中。Run跟蹤不會同步更新CPU窗口。 |
Esc | 如果當前處於自動運行或跟蹤狀態,則停止自動運行或跟蹤。如果CPU顯示的是跟蹤數據,則顯示真實數據。 |
空格 | 點擊反匯編窗口,可以修改原有匯編代碼 |
分號(或者直接雙擊) | 增加注釋 |
回車 Enter | 將選中的命令添加到命令歷史[command history]中,如果當前命令是一個跳轉、函數或者是轉換表的一個部分,則進入到目的地址。即在返匯編窗口里面點擊 call,可以查看 call 內反匯編代碼。 |
Alt + B | 顯示斷點窗口。在這個窗口中,您可以編輯、刪除、或跟進到斷點處。 |
Alt + C | 顯示 CPU 窗口。 |
Alt + E | 顯示模塊列表[list of modules]。 |
Alt + K | 顯示調用棧[Call stack]窗口。 |
Alt + L | 顯示日志窗口。 |
Alt + M | 顯示內存窗口。 |
Alt + O | 顯示選項對話框[Options dialog] |
Alt + X | 關閉 OllyDbg。 |
Ollydbg 斷點:
- 內存斷點:是通過把相應位置指令替換成int3來實現的。因為修改程序代碼你想怎么改就怎么改。所以內存斷點你可以設置很多個。因為修改的是程序的代碼,所以內存斷點很容易被程序自身檢測到。
- 硬件斷點:是通過設置CPU相應硬件寄存器來阻止程序繼續運行的。硬件寄存器數量有限,所以只能設置幾個(目前大多數是4個)。因為不修改程序的代碼,所以硬件斷點則很難被發現(不是絕對的,當硬件斷點不行時,可以試下內存斷點)。
硬件斷點的前置知識。
- 1. 現代cpu為程序調試提供了6個寄存器,名為DRx,仔細說的話就是DR0/DR1/DR2/DR3/DR6/DR7。沒錯就是沒有4和5,我沒寫錯。cpu內部對這6個寄存器作為硬件斷點提供了支持。
- 2. 調試器可以輕易讀寫被調試程序的這6個寄存器,而被調試程序不容易讀寫也通常不需要讀寫。
- 3. DR0~DR3 四個寄存器用來存放欲下斷的地址,DR6和DR7用來控制斷點的大小和觸發斷點的時機。(比如說大小一個byte,觸發時機為寫入時)
------------------------------------------------
硬件斷點就不需要 od 做太多事情了,它只需要把用戶的需求轉換一下格式,寫入被調試程序的DRx系列的寄存器中,並等待系統發來的消息就行了。當od收到了消息就暫停目標程序,你就知道程序斷下了。
關於硬件斷點:
- 1. 寄存器數量的限制導致硬件斷點最多只能同時存在4個,並且od在特定設置或者插件的影響下可能內部還會占用一兩個用來輔助程序調試,導致可用數量十分有限。
- 2. 不僅硬件斷點數量不多,在32位程序中,每個硬件斷點最大范圍是4個字節,這也經常不太夠用。
- 3. 由於cpu 的直接支持,硬件斷點的效率是非常高的,給一個程序設置了硬件斷點,在不觸發的情況下,不會有肉眼可見的效率影響,畢竟只是寫了個寄存器而已。
總結:內存斷點通過修改內存頁的屬性並捕獲異常來間接暫停被調試的程序運行,而硬件斷點是由cpu直接提供支持。因為這樣,所以內存斷點的效率大大低於硬件斷點,但內存斷點的自由性大於硬件斷點,可以下很多很大不用擔心硬件限制。通常在調試程序時,能用硬件斷點就別用內存斷點,太卡了。而且內存斷點經常下了找不着,而硬件斷點od有單獨的窗口顯示。
反匯編窗口中的快捷鍵[Disassembler shortcuts]
當 CPU 窗口中的反匯編面板[Disassembler pane]處於激活狀態時,您可以使用以下快捷鍵:
快捷鍵 | 功能 |
退格鍵 | 移除選中部分的自動分析信息。如果分析器將代碼誤識別為數據,這個快捷鍵就非常有用。 |
Alt + 退格鍵 | 撤消所選部分的修改,以備份數據的相應內容替換所選部分。僅當備份數據存在且與所選部分不同時可用。 |
Ctrl+F1 | 如果API幫助文件已經選擇,將打開與首個選擇行內的符號名相關聯的幫助主題。 |
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]對話框供您輸入匯編命令,並從當前命令開始搜索。 |
星號 (*) | 轉到原始位置(激活線程的EIP處)。 |
Ctrl + 星號(*) | 指定新的起始位置,設置當前所選線程的EIP為首個選擇字節的地址。您可以在選擇EIP並撤消該操作。 |
加號 (+) |
如果run跟蹤[run trace] 沒有激活,則根據命令歷史[command history]跳到下一條運行過命令的地方;否則跳到Run跟蹤的下一個記錄。 |
Ctrl + 加號 | 跳到前一個函數開始處。(注意只是跳到,並不執行) |
減號 (-) | 如果run跟蹤[run trace] 沒有激活,則根據命令歷史[command history]跳到前一條運行過命令的地方;否則跳到Run跟蹤的前一個記錄。 |
Ctrl + 減號 | 跳到下一個函數開始處。(注意只是跳到,並不執行) |
空格 | 修改命令。您可在顯示對話框中以匯編語言修改實際指令或輸入新指令,這些指令將替換實際代碼,您也可以在想要修改的指令處雙擊鼠標。 |
冒號(:) | 添加標簽。顯示添加標簽窗口[Add label]或修改標簽窗口[Change label],您可在此輸入與首個選擇的命令中的第一個字節相關聯的標簽(符號名)。注意,在多種編程語言中,冒號可以是標簽的一部分。 |
分號 (;) | 添加注釋[comment]。顯示添加注釋窗口[Add label]或修改注釋窗口[Changelabel],您可在此輸入與首條所選命令的第一個字節相關聯的注釋(注釋串會顯示在最后一列中)。 注意,多種匯編語言使用分號作為注釋開始。您也可以在注釋列雙擊需要注釋的命令行。 |
命令行插件支持的命令
命令 | 功能 |
? / CALC 表達式 | 判斷表達式。計算給定表達式。 注意,參與計算的數值默認為16進制 |
W / WATCH 表達式 | 添加監視表達式。打開監視窗口並監視表達式 |
AT | 在指定地址進行反匯編 |
FOLLOW | 跟隨命令 |
ORIG | 反匯編於 EIP |
DUMP | 在指定地址進行轉存 |
DA | 轉存為反匯編代碼 |
DB | 使用十六進制字節格式轉存 |
DC | 使用 ASCII 格式轉存 |
DD | 轉存在堆棧格式 |
DU | 轉存在 UNICODE 格式 |
DW | 使用十六進制字詞格式轉存 |
STK | 前往堆棧中的地址 |
AS | (AS + 地址 + 字符串) 在指定地址進行匯編 |
BP | 進行條件中斷(有條件的斷點) |
BPX | 中斷在全部調用 (Call) |
BPD | 清除全部調用中的斷點 |
BC | 清除斷點 |
MR | 內存斷點於訪問時 |
MW | 內存斷點於寫入時 |
MD | 清除內存斷點 |
HR | 訪問時進行硬件中斷 |
HW | 寫入時進行硬件中斷 |
HE | 執行時進行硬件中斷 |
HD | 清除硬件斷點 |
STOP | 停止運行程序調試 |
PAUSE | 暫停執行程序調試 |
RUN | 運行程序進行調試 |
GE | 運行和通過例外 |
SI | 單步進入 Call 中 |
SO | 步過 Call |
TI | 跟蹤進入直到地址 |
TO | 跟蹤步過直到地址 |
TC | 跟蹤進入直到滿足條件 |
TOC | 跟蹤步過直到滿足條件 |
TR | 運行直到返回 |
TU | 運行直到用戶代碼 |
LOG | 查看記錄窗口 |
MOD | 查看模塊窗口 |
MEM | 查看內存窗口 |
CPU | 查看 CPU 窗口 |
CS | 查看 Call 堆棧 |
BRK | 查看斷點窗口 |
OPT | 打開選項設置窗口 |
EXIT | 退出 OllyDbg |
QUIT | 退出 OllyDbg |
OPEN | 打開一個可執行文件 |
CLOSE | 關閉可執行文件 |
RST | 重新運行當前程序 |
HELP | 查看 API 函數的幫助 |
飄雲閣 :https://www.chinapyg.com/thread-37960-1-1.html
?/CALC 表達式 計算給定表達式. 注意,參與計算的數值默認為16進制
A 地址表達式,字串 在指定地址進行匯編。這個命令我不理解用法,請自行研究
AC 分析代碼
ASM 字串 顯示匯編指令機器碼(帶有地址的命令語法為“ASM 命令;地址”)
AT/FOLLOW 地址表達式 在指定地址進行反匯編,即在反匯編窗口對地址反匯編
BC 地址表達式 清除斷點
BP 字串 進行條件中斷(有條件的斷點)
BPD 字串 清除全部調用中的斷點
BPX 字串 在所有調用(Call)上設斷點
BRK 查看斷點窗口
C 地址,字串 在地址處加注釋
CLOSE 關閉調試的可執行文件
CPU 查看CPU窗口
CS 查看Call堆棧
D/DUMP 地址表達式 在指定地址進行轉存,即在數據窗口當前方式顯示指定地址內容
DA 地址表達式 轉存為反匯編代碼。即在數據窗口以反匯編代碼顯示指定地址內容
DASM 字串 顯示機器碼對應的匯編指令
DB 地址表達式 使用十六進制字節格式轉存。即在數據窗口以16進制格式顯示指定地址內容
DC 地址表達式 使用ASCII格式轉存。即在數據窗口以ASCII格式顯示指定地址內容
DD 地址表達式 轉存在堆棧格式。即在數據窗口以堆棧格式顯示指定地址內容
DU 地址表達式 轉存在 UNICODE 格式。即在數據窗口以UNICODE格式顯示指定地址內容
DW 地址表達式 使用十六進制字詞格式轉存。即在數據窗口以16進制字詞格式顯示指定地址內容
EXIT 退出 OllyDbg
FR 查找選定命令/地址的參考
G [地址表達式] 運行到地址
GE [地址表達式] 運行到地址,並忽略異常
H/ HELP 字串 查看API 函數的幫助
HD [地址表達式] 清除硬件斷點
HE 地址表達式 設置硬件執行斷點
HR 地址表達式 設置硬件訪問斷點
HW 地址表達式 設置硬件寫入斷點
L 地址表達式,字串 在地址處設標簽
LOG 查看記錄窗口
MAC 字串 執行宏命令
MD 清除內存斷點
MEM 查看內存窗口
MOD 查看模塊窗口
MR 地址,[表達式] 內存斷點於訪問時
MW 地址,[表達式] 內存斷點於寫入時
OPEN 字串 打開一個可執行文件進行調試
OPT 打開調用選項設置窗口
ORIG 反匯編於EIP,即匯編窗口內容返回到當然執行的命令
OSC 字串 執行OllyScript腳本
PAUSE 暫停執行程序調試
QUIT 退出 OllyDbg
RST 重新運行當前程序
RUN 運行程序
S/SI 單步步入 Call 中
SN 在當前的模塊中查找名稱(標簽)
SO 單步步過 Call
SOB 掃描目標文件
STK 地址表達式 前往堆棧中的地址。即在堆棧窗口中顯示指定地址內容
STOP 停止運行程序調試
T/TI [地址表達式] 跟蹤步入到地址
TC 字串 跟蹤步入直到滿足條件
TO [地址表達式] 跟蹤步過到地址
TOC 字串 跟蹤步過直到滿足條件
TR 運行直到返回
TU 運行直到用戶代碼
W/WATCH 表達式 打開監視窗口並監視表達式
OD 條件斷點
以下演示如何下條件斷點:
在調試過程中,經常希望斷點滿足一定條件時才中斷,這類斷點稱為 條件斷點。
一、條件斷點:
使用方法(如):
在當前行按 [Shift+F2] 鍵 -> 條件斷點 ( 這個不太好用,因為程序BUG偶爾失效 )。
在當前行按 [Shift+F4] 鍵 -> 條件記錄斷點 ( 只要設置上條件語句和按什么條件生效就可以了 )。
條件語句 示例:
EAX == 00401000 ; 當EAX的值為00401000時。
[EAX] == 05201314 ; 比如EAX的值為00401000,而地址00401000處所指向的
; 值等於5201314時,即EAX的值表示為指針。
[[EAX]] == 05201314 ; 比如EAX的值為00401000,地址00401000處所指向的值為00402000,
; 而地址00402000處所指向的值等於5201314時,即EAX的值表示為指針的指針。
EAX == 05201314 && EBX == 0x05201314 ; 當EAX的值等於5201314(十進制),並且EBX的值等於5201314(十六進制)時。
[EBP+8] == WM_COMMAND ;
[[EBP+8]] == 05201314 ;
byte ptr[EAX] == 'y' ;
[EAX] == "coderui" ; 比如EAX的值為00401000,而地址00401000處所指向的字符串
; 為“coderui”時,即EAX的值表示為指針。
[[EAX+4]+4] == WM_LBUTTONUP ;
二、消息斷點:
原理:就是在消息函數上設置條件斷點。
步驟:
1、使用[Ctrl+G]呼出“表達式跟隨窗口”,輸入“TranslateMessage”,然后回車。
2、在“轉到”的位置上使用[Shift+F4]呼出“條件記錄斷點設置窗口”。
3、在“條件”中輸入如下語句“[[ESP+4]]==當前按鈕句柄&&[[ESP+4]+4]==WM_LBUTTONUP”。
4、把“暫停程序”設置為“按條件”,其他都為默認,然后確定。
5、點擊按鈕后,程序會停在“TranslateMessage”函數的系統領空中。
6、查看內存,對代碼段下“內存訪問斷點”,然后經過多次[F9](運行),就會找到關鍵的處理代碼了。
在 OD 的幫助文檔有詳細的說明:
(1) 按寄存器條件中斷:
用OD打開Conditional_bp.exe,在0040147c,按 shift+F2 設置條件斷點:
輸入表達式 eax == 040000,這樣如果 eax 為 0400000h,OD將中斷,
用 OD 幫助文檔解釋下:
040000 - 所有整數常量都認為是十六進制的,除非后面跟了點
EAX - 寄存器EAX的內容,解釋為無符號數
(2) 按存儲器條件中斷
先看下CreateFileA函數:
HANDLE WINAPI CreateFile(
__in LPCTSTR lpFileName,//指向文件名的指針
__in DWORD dwDesiredAccess,
__in DWORD dwShareMode,
__in LPSECURITY_ATTRIBUTES lpSecurityAttributes,
__in DWORD dwCreationDisposition,
__in DWORD dwFlagsAndAttributes,
__in HANDLE hTemplateFile
);
運行 Conditional_bp.exe,對 CreateFileA 設斷,單擊 OpenTest 按鈕,斷下來,在堆棧窗口單擊右鍵,執行Address/Relative to ESP(地址/相對於ESP)菜單:
則堆棧窗口最左邊標識了各參數相對於當前ESP的地址:
假設當CreateFile打開"c:\\1212.txt"時實現中斷,則shift+F2
鍵入字符 [STRING[esp+4]] =="c:\\1212.txt"
用OD幫助文檔解釋下:
[esp+4] - 在地址esp+4處的無符號雙字內容
STRING [123456] - 以地址123456作為開始,以零作為結尾的ASCII字符串。中括號是必須的,因為您要顯示內存的內容
[STRING 123456]=="Brown fox" - 如果從地址0x00123456開始的內存為ASCII字符串"Brown fox"、"BROWN FOX JUMPS"、 "brown fox???",或類似的串,那么其值為1。比較不區分大小寫和文本長度
EAX=="Brown fox" - 同上,EAX按指針對待。
UNICODE [EAX]=="Brown fox" - OllyDbg認為EAX是一個指向UNICODE串的指針,並將其轉換為ASCII,然后與文本常量進行比較
運行,斷了下來
也可直接在CMD框中輸入bp CreateFileA,[STRING[esp+4]]=="c:\\1212.txt"(注意CreateFileA大小寫別錯了,中間有無逗號沒有影響)
如果是UNICODE,就用[UNICODE[ESP+4]]=="c:\\1212.txt"
OD條件斷點BUG:
首先我們看一下 CreateFileA 在 MSDN 中的解釋:
HANDLE CreateFile(
LPCTSTR lpFileName, // pointer to name of the file
DWORD dwDesiredAccess, // access (read-write) mode
DWORD dwShareMode, // share mode
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
// pointer to security attributes
DWORD dwCreationDisposition, // how to create
DWORD dwFlagsAndAttributes, // file attributes
HANDLE hTemplateFile // handle to file with attributes to
// copy
);
從上面我們可以看出第一個參數就是文件名指針,也就是說這個參數中存放的就是文件名稱的地址。在32位程序中調用這個函數時這個參數的堆棧地址就應該是esp+4(4×8=32),同理,下一個參數就應該是esp+8。其它類推,返回值是esp+0。我們現在要判斷文件名,這里的文件名就是esp+4地址所指向的地址中的內容。取地址中的內容在OD中用雙方括號來操作,如取esp+4中的內容就該寫成這樣:[esp+4]。現在我們取的[esp+4]中的內容還是個地址,所以要得到文件名則還要再取這個地址中的內容,就該這樣:[[esp+4]]。而那個STRING前綴在OD中的解釋是以零作為結尾的ASCII字符串。所以我們下條件斷點時這樣寫:
bp CreateFileA,[STRING [esp+4]]=="abcdefghigklmn"
但卻發現斷不下來,寫成這樣:
bp CreateFileA,[[STRING [esp+4]]]=="abcdefghigklmn"
才能斷下來,這里就應該是三層的地址了。為什么這樣目前尚不清楚
以下演示條件記錄斷點
條件記錄斷點除了具有條件斷點作用,還能記錄斷點處函數表達式或參數的值,也可以設置通過斷點的次數,每次符合暫停條件時,計數器減一
如要記錄Conditional_bp.exe調用CreateFileA函數的情況,在CreateFileA函數的第一行,按Shift+F4鍵,出現條件記錄窗口:
在Condition(條件)域中輸入要設置的條件表達式,
Explanation(說明)域中由用戶自己設置一個名稱,Expression(表達式)域中是要記錄的內容的條件,只能設置一個表達式,如填的是[ESP+4},則要選擇"Pointer to ASCII String",才能正確打印出字符串,
Pause program是指OD遇到斷點時是否中斷,Log value of expression是指遇到斷點時是否記錄表達式的值, Log function arguments是指遇到斷點時是澡記錄函數參數,
Never(從不),On condition(按條件),Always(永遠)等條件
OD斷點使用大全
https://blog.csdn.net/liujiayu2/article/details/51788468
攔截窗口:
bp CreateWindow 創建窗口
bp CreateWindowEx(A) 創建窗口
bp ShowWindow 顯示窗口
bp UpdateWindow 更新窗口
bp GetWindowText(A) 獲取窗口文本
攔截消息框:
bp MessageBox(A) 創建消息框
bp MessageBoxExA 創建消息框
bp MessageBoxIndirect(A) 創建定制消息框
攔截警告聲:
bp MessageBeep 發出系統警告聲(如果沒有聲卡就直接驅動系統喇叭發聲)
攔截對話框:
bp DialogBox 創建模態對話框
bp DialogBoxParam(A) 創建模態對話框
bp DialogBoxIndirect 創建模態對話框
bp DialogBoxIndirectParam(A) 創建模態對話框
bp CreateDialog 創建非模態對話框
bp CreateDialogParam(A) 創建非模態對話框
bp CreateDialogIndirect 創建非模態對話框
bp CreateDialogIndirectParam(A) 創建非模態對話框
bp GetDlgItemText(A) 獲取對話框文本
bp GetDlgItemInt 獲取對話框整數值
攔截剪貼板:
bp GetClipboardData 獲取剪貼板數據
攔截注冊表:
bp RegOpenKey(A) 打開子健
bp RegOpenKeyEx 打開子健
bp RegQueryValue(A) 查找子健
bp RegQueryValueEx 查找子健
bp RegSetValue(A) 設置子健
bp RegSetValueEx(A) 設置子健
功能限制攔截斷點:
bp EnableMenuItem 禁止或允許菜單項
bp EnableWindow 禁止或允許窗口
攔截時間:
bp GetLocalTime 獲取本地時間
bp GetSystemTime 獲取系統時間
bp GetFileTime 獲取文件時間
bp GetTickCount 獲得自系統成功啟動以來所經歷的毫秒數
bp GetCurrentTime 獲取當前時間(16位)
bp SetTimer 創建定時器
bp TimerProc 定時器超時回調函數
攔截文件:
bp CreateFileA 創建或打開文件 (32位)
bp OpenFile 打開文件 (32位)
bp ReadFile 讀文件 (32位)
bp WriteFile 寫文件 (32位)
bp GetPrivateProfileStringA (ini文件)
攔截驅動器:
bp GetDriveTypeA 獲取磁盤驅動器類型
bp GetLogicalDrives 獲取邏輯驅動器符號
bp GetLogicalDriveStringsA 獲取當前所有邏輯驅動器的根驅動器路徑
★★VB程序專用斷點★★
bp __vbaStrCmp 比較字符串是否相等
bp __vbaStrComp 比較字符串是否相等
bp __vbaVarTstNe 比較變量是否不相等
bp __vbaVarTstEq 比較變量是否相等
bp __vbaStrCopy 復制字符串
bp __vbaStrMove 移動字符串
bp MultiByteToWideChar ANSI字符串轉換成Unicode字符串
bp WideCharToMultiByte Unicode字符串轉換成ANSI字符串
解自校驗
bpx CreateFileA
bpx GetFileSize
bpx SetFilePointer
bpx ExitProcess
F12堆棧調用
破解思路
C類
Point-H 法
bp GetDlgItem(斷輸入框)
bp MessageBoxA(斷對話框)
字符串法
F12堆棧調用
B、D類
DEDE、PE Explorer 作為強有力的輔助工具
關鍵還是找按妞事件
Point-H法
bp GetDlgItem(斷輸入框)
bp MessageBoxA(斷對話框)
字符串法
F12堆棧調用
V類
VBExplorer、GetVBRes、SmatCheck作為強有力的輔助工具
關鍵還是找按妞事件
bp rtcMsgBox(斷對話框)
*********************************
如果是重啟驗證就使用最開始的那些斷點
C類語言破解
1、bp MessageBoxA(W)(斷對話框)—Ctrl+N
2、Point-H法
3、bp GetDlgItem/GetWindowTextA(W)/GetWindowTextLengthA(W) (斷輸入框)
4、字符串法—插件/搜索所有參考文本
Delphi/BC++語言破解
1、DEDE結合PE Explorer找按妞事件
2、Point-H法
3、bp GetDlgItem/GetWindowTextA(W)/GetWindowTextLengthA(W) (斷輸入框)
4、bp MessageBoxA(W)(斷對話框)—Ctrl+N
5、字符串法—插件/搜索所有參考文本
6、如果程序界面標題有[未注冊/注冊/VIP版/標准版/鑽石版] 之類字樣,可以通過DEDE查找FormCreate/FormShow,找到關鍵標志位
VB語言破解
1、VBExplorer查找按鈕事件
2、有提示框則 bp rtcMsgBox(斷對話框)
3、通過bp __vbaStrCmp/__vbaStrComp/__vbaVarTstEq
4、萬能斷點法(816C24法)
5、字符串法—插件/搜索所有參考文本
易語言破解
1、借助E-Code Explorer查找按鈕事件
2、下消息斷點,查看堆棧再返回
3、eCode法–斷按鈕事件
4、字符串法—插件/搜索所有參考文本
按鈕事件固定模式:
0040EC78 837D F4 00 cmp dword ptr ss:[ebp-C],0 ;關鍵判斷
0040EC7C 0F84 3B000000 je dcse.0040ECBD ;關鍵跳
0040EC82 68 04000080 push 80000004
0040EC87 6A 00 push 0
0040EC89 68 EC904000 push dcse.004090EC
0040EC8E 68 01030080 push 80000301
0040EC93 6A 00 push 0
00 40EC95 68 00000000 push 0
0040EC9A 68 04000080 push 80000004
0040EC9F 6A 00 push 0
0040ECA1 68 F1904000 push dcse.004090F1
0040ECA6 68 03000000 push 3
0040ECAB BB 00030000 mov ebx,300
0040ECB0 E8 92000000 call dcse.0040ED47
0040ECB5 83C4 28 add esp,28
0040ECB8 E9 36000000 jmp dcse.0040ECF3
0040ECBD 68 04000080 push 80000004
0040ECC2 6A 00 push 0
0040ECC4 68 CC904000 push dcse.004090CC
0040ECC9 68 01030080 push 80000301
0040ECCE 6A 00 push 0
0040ECD0 68 00000000 push 0
0040ECD5 68 04000080 push 80000004
0040ECDA 6A 00 push 0
0040ECDC 68 02914000 push dcse.00409102
0040ECE1 68 03000000 push 3
0040ECE6 BB 00030000 mov ebx,300
0040ECEB E8 57000000 call dcse.0040ED47
0040ECF0 83C4 28 add esp,28
0040ECF3 8BE5 mov esp,ebp
0040ECF5 5D pop ebp
0040ECF6 C3 retn
********************************************************************
按鈕事件
1、有注冊錯誤/正確提示
bp MessageBoxA
bp rtcMsgBox
如果事先找不到按鈕事件,可以通過下消息斷點,返回后回溯即可找到按鈕事件起始位置
2、無任何提示
bp GetDlgItem
可以通過bp GetDlgItem獲取按鈕事件代碼
3、未注冊一啟動或者關閉就跳出個注冊框或者提示框
bp RegOpenKey(A)
bp CreateFileA
bp GetPrivateProfileStringA
文件: reg/ini/dll/其他
至於保存到什么文件,可以使用以下方法
1、查找字符串,看是否有可疑文件名或者注冊表鍵名
2、猜。。。下斷點觀察
3、按鈕事件跟蹤
4、未注冊一啟動或者關閉就打開網頁鏈接
bp ShellExecuteA
類似的組合
Cmp/test/其他判斷
Je/jne/jne/jz XXXXXXXX
軟件啟動—>判斷是否注冊—>是否Open
斷下后回溯代碼即可找到關鍵點,常用的方法,轉存跟蹤法
5、未注冊就功能使用限制
判斷是否注冊—>某種功能是否讓你使用,如果不能夠用,一定會有提示的,
或是錯誤提示或是彈出注冊框等,那么從提示入手即可找到解除限制的關鍵
不完美破解:解除功能限制
6、未注冊就日期限制
bp GetLocalTime 獲取本地時間
bp GetSystemTime 獲取系統時間
bp GetFileTime 獲取文件時間
一般下這幾個斷點比較難分析關鍵
捷徑:查找字符串–找可疑文件–一般以DLL多見
只要不讓它讀取到這個DLL即可解除限制
7、Demo(演示試用版)–功能殘缺
這個和上面的功能限制不一樣
功能限制是軟件本身就有這個功能,對程序而言,相對應的功能代碼也存在
Demo即是沒這個功能,空架子一個而已
一句話:破解也無用!
8、網絡驗證
無法登陸有錯誤提示者:下消息斷點回溯代碼,找按鈕事件,從頭來過,從按鈕事件開始跟蹤,
找網絡驗證CALL(所需要登陸的地址在這個CALL里面),接下來就是分析返回值
或者改登陸地址為本地(127.0.0.1),再后面就需要改某些跳轉了
無法登陸自動退出者:下bp ExitProcess斷下(一般可以斷下)回溯代碼,找按鈕事件,從頭來過,從按鈕事件開始跟蹤,
找網絡驗證 CALL(所需要登陸的地址在這個CALL里面),接下來就是分析返回值
或者改登陸地址為本地(127.0.0.1),再后面就需要改某些跳轉了
9、狗加密
一般狗加密軟件,一啟動就會檢測所需要的狗文件,若沒有狗文件,提示錯誤
這里我們有兩個入手點
1、“一啟動就會檢測所需要的狗文件”,下bp CreateFileA等斷點,斷下后,回溯
2、“若沒有狗文件,提示錯誤”,下bp MessageBoxA,斷下后,回溯
總結:
從上面的介紹說明可以看出,有這么一個共同點—按鈕事件,可以這么說,按鈕事件是我們的思路之門
按鈕事件可以這樣得來:
1、通過下相應斷點,回溯代碼
2、通過輔助工具快捷的得到(VBExplorer、DEDE)
***********************************************************************************
重啟驗證
80%-90%的軟件基本都是重啟驗證類型
1、注冊表類型
Bpx RegOpenKeyA(W)
Bpx RegOpenKeyExA(W)
2、ini文件類型(*.reg/*.ini)
Bpx GetPrivateProfileStringA
3、其他文件類型(*.dat/*.lic…)
Bpx CreateFileA(W)
Bpx ReadFile
4、DLL文件操作類型
如果沒有什么有效的攔截函數,不妨試一下Bpx CreateFileA(W).余下的就是通過你的經驗去判斷了(例如:35課)
注意:建議使用Bpx斷點,這樣,比較快捷、准確。尚若Bpx失效,再嘗試bp
方便斷點設置的有以下3個斷點插件,APIBreak中國版(不帶Point-H),APIBreak英文版(帶Point-H)、+BP-Olly
*********************************************************************************
去 nag 框的方法
1、若是 Delphi&BCB程序,可以通過FormCreate法查找到FormCreate,再單步跟蹤,找到窗口的調用CALL,
一般它的具體形式是call dword ptr ds:[edx+E8]
2、OD載入程序后,單步跟蹤,找到窗口的調用CALL
*********************************************************************************
兩種經典方法
1、Point-H法
此法類似下斷點bp GetWindowText(A/W),但是,在某些Point-H斷不下來的情況下,bp GetWindowText(A/W)卻可以斷下來。Point-H能夠斷下來的,bp GetWindowTextA基本上都可以順利斷下
2、轉存跟蹤法
到底是byte/word/Dword斷點,一般情況下是byte,其他特殊情況大家臨場判斷
*********************************************************************************
灰色按鈕
有兩種情況:通過代碼和控件屬性
VB語言:
代碼:ctrl+b查找 816C24,在JMP下斷,然后F2運行程序,把 push ebp 改為 retn,或者把這些代碼全NOP掉
控件屬性:VBExplorer 輔助工具改屬性
Delphi/BC++語言:
代碼:通過DEDE找FormCreate,記下地址,改 retn
控件屬性:相關輔助工具改屬性
易語言:
代碼:bp EnableWindow,斷下后返回,把 push ebp 改為 retn
控件屬性:用十六進制工具查找 BOB4C5A5 ,把它后面的 07 改 05
破解時常用斷點:
VB MASM32 VC BCB 易語言 Delphi
VB破解
1、VBExplorer查找按鈕事件
2、有提示框則bp rtcMsgBox
3、通過bp __vbaStrCmp/__vbaStrComp/__vbaVarTstEq
bp __vbaStrCmp
bp __vbaStrComp
4、萬能斷點法(816C24法)
注冊驗證程序可以用這個斷點下斷,一般離程序訪問注冊表很近:
bp __vbaStrToAnsi
5.F12堆棧調用
總結:
VB 程序破解的關鍵跳轉,一般與其它語言的不同,沒有JPM XXXXXXX
一般以 JE/JNE XXXXXXXXX 跳轉記錄一般不會很遠(雖然是短距離跳轉,但是關鍵就在這里,可以設置大量的信息)。
如果發現False/True 可能是關鍵點
VB:
XXXXXXX JE/JNE XXXXX
設置信息
Delphi BC++ 易語言 VC++ 匯編:
XXXXXXX JE/JNE XXXXX
設置信息
XXXXXXX JMP XXXXX
設置信息
VC++ 匯編(有的 一段,一段的):
XXXXXXX JE/JNE XXXXX
設置信息
retn
push xx
設置信息
retn
push xx
設置信息
retn
易語言
易語言破解思路:
1. 信息框法 bp MessageBoxA(斷對話框)
2.字符串法
查看易語言文本信息:
bp GetProcessHeap F9運行4次,取消斷點 執行ALT+F9 用戶代碼 F8單步走
或者在區段為”.data”/”.ecode”下斷,運行
3.窗口標題法 bp SetWindowTextA
4.F12堆棧調用
0040C0CB=易語言.0040C0CB (ASCII “shaonanshaonvluntan”)
DELPHI破解:
1、DEDE、PE Explorer ResScope作為強有力的輔助工具找按妞事件
2、Point-H法
3、bp GetDlgItem/GetDlgItemTextA(斷輸入框)
4、bp MessageBoxA(W)(斷對話框)—Ctrl+N
5、字符串法—插件/搜索所有參考文本
6、如果程序界面標題有[未注冊/注冊/VIP版/標准版/鑽石版] 之類字樣的
可以通過查找FormCreate/FormShow—-DEDE,找到關鍵標志位!
來判斷程序怎么樣的判斷是否注冊或者用戶類型
7. 窗口標題法 bp SetWindowTextA
8.F12堆棧調用
注冊表:
bpx RegCreateKeyExA 對於Delphi程序程序來說,用這個斷點比較合適
bp RegCreateKeyExA 對於加了殼的程序
注冊碼:Rc1-420+用戶名(不能為整數,)+C00L
C++ 破解
C類
Point-H法
bp GetDlgItem(斷按下按鈕)
bp MessageBoxA(斷對話框)
字符串法
F12堆棧調用
窗口標題法 bp SetWindowTextA
★★C+程序專用斷點★★
bp lstrcmpA (KERNEL32.lstrcmpA) 比較用法
bp _mbscmp //比較
C類程序的經典斷點:
bp GetWindowTextA(斷按下按鈕) //也是適用於其它語言
bp GetWindowTextLengthA(斷按下按鈕) //也是適用於其它語言
bp GetDlgItem(斷按下按鈕) //也是適用於其它語言
bp GetDlgItemTextA
ds:[004021C8]=77C01881 (msvcrt._mbscmp)
BC++破解
1、DEDE、PE Explorer作為強有力的輔助工具找按妞事件
2、Point-H法
3、bp GetDlgItem/GetDlgItemTextA(斷輸入框)
4、bp MessageBoxA(W)(斷對話框)—Ctrl+N
5、字符串法—插件/搜索所有參考文本
6、如果程序界面標題有[未注冊/注冊/VIP版/標准版/鑽石版] 之類字樣的
可以通過查找FormCreate/FormShow—-DEDE,找到關鍵標志位!
來判斷程序怎么樣的判斷是否注冊或者用戶類型
7.窗口標題法 bp SetWindowTextA
8.F12堆棧調用
bpx RegCreateKeyExA 對於Delphi程序程序來說,用這個斷點比較合適
bp RegCreateKeyExA 對於加了殼的程序
MASM32 / TASM32破解
入口點 :
004011C7 6A 00 push 0
004011C9 E8 5E070000 call 0040192C
004011CE A3 70614000 mov dword ptr ds:[406170],eax
004011D3 6A 00 push 0
004011D5 68 EE114000 push MASM32.004011EE
004011DA 6A 00 push 0
004011DC 68 C8000000 push 0C8
Point-H法
bp GetDlgItem(斷按下按鈕)
bp MessageBoxA(斷對話框)
字符串法
F12堆棧調用
窗口標題法 bp SetWindowTextA
OD常用斷點 2
1、限制程序功能函數
EnableMenuItem 允許、禁止或變灰指定的菜單條目
EnableWindow 允許或禁止鼠標和鍵盤控制指定窗口和條目(禁止時菜單變灰)
2、對話框函數
CreateDialog 從資源模板建立一非模態對話窗
CreateDialogParam 從資源模板建立一非模態對話窗
CreateDialogIndirect 從內存模板建立一非模態對話窗
CreateDialogIndirectParam 從內存模板建立一非模態對話窗
DialogBox 從資源模板建立一模態對話窗
DialogBoxParam 從資源模板建立一模態對話窗
DialogBoxIndirect 從內存模板建立一模態對話窗
DialogBoxIndirectParam 從內存模板建立一模態對話窗
EndDialog 結束一模態對話窗
MessageBox 顯示一信息對話框
MessageBoxEx 顯示一信息對話框
MessageBoxIndirect 顯示一定制信息對話框
GetDlgItemInt 得指定輸入框整數值
GetDlgItemText 得指定輸入框輸入字符串
GetDlgItemTextA 得指定輸入框輸入字符串
Hmemcpy 內存復制 (非應用程序直接調用)
3、磁盤處理函數1273?GAMEHK所有–admin?11326
GetDiskFreeSpaceA 獲取與一個磁盤的組織有關的信息,以及了解剩余空間的容量
GetDiskFreeSpaceExA 獲取與一個磁盤的組織以及剩余空間容量有關的信息
GetDriveTypeA 判斷一個磁盤驅動器的類型
GetLogicalDrives 判斷系統中存在哪些邏輯驅動器字母
GetFullPathNameA 獲取指定文件的詳細路徑
GetVolumeInformationA 獲取與一個磁盤卷有關的信息
GetWindowsDirectoryA 獲取Windows目錄的完整路徑名
GetSystemDirectoryA 取得Windows系統目錄(即System目錄)的完整路徑名
4、文件處理函數
CreateFileA 打開和創建文件、管道、郵槽、通信服務、設備以及控制台
OpenFile 這個函數能執行大量不同的文件操作
ReadFile 從文件中讀出數據
ReadFileEx 與ReadFile相似,只是它只能用於異步讀操作,並包含了一個完整的回調
WriteFile 將數據寫入一個文件
WriteFileEx 與WriteFile類似,只是它只能用於異步寫操作,並包括了一個完整的回調
SetFilePointer 在一個文件中設置當前的讀寫位置
SetEndOfFile 針對一個打開的文件,將當前文件位置設為文件末尾
CloseHandle 關閉一個內核對象。其中包括文件、文件映射、進程、線程、安全和同步對象等
_lcreat 創建一個文件
_lopen 以二進制模式打開指定的文件
_lread 將文件中的數據讀入內存緩沖區
_lwrite 將數據從內存緩沖區寫入一個文件
_llseek 設置文件中進行讀寫的當前位置
_lclose 關閉指定的文件
_hread 將文件中的數據讀入內存緩沖區
_hwrite 將數據從內存緩沖區寫入一個文件
OpenFileMappingA 打開一個現成的文件映射對象
CreateFileMappingA 創建一個新的文件映射對象
MapViewOfFile 將一個文件映射對象映射到當前應用程序的地址空間
MapViewOfFileEx (內容同上)
CreateDirectoryA 創建一個新目錄
CreateDirectoryExA 創建一個新目錄
RemoveDirectoryA 刪除指定目錄
SetCurrentDirectoryA 設置當前目錄
MoveFileA 移動文件
DeleteFileA 刪除指定文件
CopyFileA 復制文件
CompareFileTime 對比兩個文件的時間
SetFileAttributesA 設置文件屬性
SetFileTime 設置文件的創建、訪問及上次修改時間
FindFirstFileA 根據文件名查找文件
FindNextFileA 根據調用FindFirstFile函數時指定的一個文件名查找下一個文件
FindClose 關閉由FindFirstFile函數創建的一個搜索句柄
SearchPathA 查找指定文件
GetBinaryTypeA 判斷文件是否可以執行
GetFileAttributesA 判斷指定文件的屬性
GetFileSize 判斷文件長度
GetFileTime 取得指定文件的時間信息
GetFileType 在給出文件句柄的前提下,判斷文件類型
5、注冊表處理函數
RegOpenKeyA 打開一個現有的注冊表項
RegOpenKeyExA 打開一個現有的注冊表項
RegCreateKeyA 在指定的項下創建或打開一個項
RegCreateKeyExA 在指定項下創建新項的更復雜的方式
RegDeleteKeyA 刪除現有項下方一個指定的子項
RegDeleteValueA 刪除指定項下方的一個值
RegQueryValueA 獲取一個項的設置值
RegQueryValueExA 獲取一個項的設置值
RegSetValueA 設置指定項或子項的值
RegSetValueExA 設置指定項的值
RegCloseKey 關閉系統注冊表中的一個項(或鍵)
6、時間處理函數
CompareFileTime 比較兩文件時間
GetFileTime 得文件建立,最后訪問,修改時間
GetLocalTime 得當前本地時間
GetSystemTime 得當前系統時間
GetTickCount 得windows啟動至現時毫秒
SetFileTime 設置文件時間
SetLocalTime 設置本地時間
SetSystemTime 設置系統時間
7、進程函數
CreateProcessA 創建一個新進程
ExitProcess 以干凈的方式關閉一個進程
FindExecutableA 查找與一個指定文件關聯在一起的程序的文件名
FreeLibray 釋放指定的動態鏈庫
GetCurrentProcess 獲取當前進程的一個偽句柄
GetCurrentProcessId 獲取當前進程一個唯一的標識符
GetCurrentThread 獲取當前線程的一個偽句柄
GetExitCodeProces 獲取一個已結束進程的退出代碼
GetExitCodeThread 獲取一個已結束線程的退出代碼
GetModuleHandleA 獲取一個應用程序或動態鏈接庫的模塊句柄
GetPriorityClassA 獲取特定進程的優先級別
LoadLibraryA 載入指定的動態鏈接庫,並將它映射到當前進程使用的地址空間
LoadLibraryExA 裝載指定的動態鏈接庫,並為當前進程把它映射到地址空間
LoadModule 載入一個windows應用程序,並在指定的環境中運行
TerminateProcess 結束一個進程