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