OllyICE入門教程 OllyICE使用實例教程初學必備

ollyice是一款Windows平臺下知名的反匯編軟件,目前已經代替SoftICE成為當今最為流行的調試解密工具之一,同時,ollyice還支持插件擴展功能,最擅長分析函數過程、循環語句、選擇語句、表、常量、代碼中的字符串、欺騙性指令、API調用、函數中參數的數目和import表等等,這些分析增加瞭二進制代碼的可讀性,減少瞭出錯的可能性,使得我們的調試工作更加容易。需要的朋友們可以下載試試!

需要說明的是,由於OllyDBG 1.1官方以不再更新,故一些愛好者對OllyDBG修改,以新增一些功能或修正一些bug,OllyICE就是其中的一個修改版,取名OllyICE隻是便於區分,其實質還是OllyDBG,本站為大傢提供的就是ollyice v1.10綠色中文版,軟件已經綠色漢化,確保無毒,對中文的支持比較好。

軟件名稱:
ollyice(反匯編工具) v1.10 中文免費綠色版
軟件大小:
4.73MB
更新時間:
2016-08-16立即下載

一、OllyDBG 的安裝與配置

 OllyDBG 1.10 版的發佈版本是個 ZIP 壓縮包,隻要解壓到一個目錄下,運行 OllyDBG.exe 就可以瞭。漢化版的發佈版本是個 RAR 壓縮包,同樣隻需解壓到一個目錄下運行 OllyDBG.exe 即可:

OllyDBG 中各個窗口的功能如上圖。簡單解釋一下各個窗口的功能,更詳細的內容可以參考 TT 小組翻譯的中文幫助:

反匯編窗口:顯示被調試程序的反匯編代碼,標題欄上的地址、HEX 數據、反匯編、註釋可以通過在窗口中右擊出現的菜單 界面選項->隱藏標題 或 顯示標題 來進行切換是否顯示。用鼠標左鍵點擊註釋標簽可以切換註釋顯示的方式。

寄存器窗口:顯示當前所選線程的 CPU 寄存器內容。同樣點擊標簽 寄存器 (FPU) 可以切換顯示寄存器的方式。

信息窗口:顯示反匯編窗口中選中的第一個命令的參數及一些跳轉目標地址、字串等。

數據窗口:顯示內存或文件的內容。右鍵菜單可用於切換顯示方式。

堆棧窗口:顯示當前線程的堆棧。

要調整上面各個窗口的大小的話,隻需左鍵按住邊框拖動,等調整好瞭,重新啟動一下 OllyDBG 就可以生效瞭。

啟動後我們要把插件及 UDD 的目錄配置為絕對路徑,點擊菜單上的 選項->界面,將會出來一個界面選項的對話框,我們點擊其中的目錄標簽:

因為我這裡是把 OllyDBG 解壓在 F:\OllyDBG 目錄下,所以相應的 UDD 目錄及插件目錄按圖上配置。還有一個常用到的標簽就是上圖後面那個字體,在這裡你可以更改 OllyDBG 中顯示的字體。上圖中其它的選項可以保留為默認,若有需要也可以自己修改。修改完以後點擊確定,彈出一個對話框,說我們更改瞭插件路徑,要重新啟動 OllyDBG。在這個對話框上點確定,重新啟動一下 OllyDBG,我們再到界面選項中看一下,會發現我們原先設置好的路徑都已保存瞭。有人可能知道插件的作用,但對那個 UDD 目錄不清楚。我這簡單解釋一下:這個 UDD 目錄的作用是保存你調試的工作。比如你調試一個軟件,設置瞭斷點,添加瞭註釋,一次沒做完,這時 OllyDBG 就會把你所做的工作保存到這個 UDD 目錄,以便你下次調試時可以繼續以前的工作。如果不設置這個 UDD 目錄,OllyDBG 默認是在其安裝目錄下保存這些後綴名為 udd 的文件,時間長瞭就會顯的很亂,所以還是建議專門設置一個目錄來保存這些文件。

另外一個重要的選項就是調試選項,可通過菜單 選項->調試設置 來配置:

新手一般不需更改這裡的選項,默認已配置好,可以直接使用。建議在對 OllyDBG 已比較熟的情況下再來進行配置。上面那個異常標簽中的選項經常會在脫殼中用到,建議在有一定調試基礎後學脫殼時再配置這裡。

除瞭直接啟動 OllyDBG 來調試外,我們還可以把 OllyDBG 添加到資源管理器右鍵菜單,這樣我們就可以直接在 .exe 及 .dll 文件上點右鍵選擇“用Ollydbg打開”菜單來進行調試。要把 OllyDBG 添加到資源管理器右鍵菜單,隻需點菜單 選項->添加到瀏覽器,將會出現一個對話框,先點擊“添加 Ollydbg 到系統資源管理器菜單”,再點擊“完成”按鈕即可。要從右鍵菜單中刪除也很簡單,還是這個對話框,點擊 “從系統資源管理器菜單刪除 Ollydbg”,再點擊“完成”就行瞭。

OllyDBG 支持插件功能,插件的安裝也很簡單,隻要把下載的插件(一般是個 DLL 文件)復制到 OllyDBG 安裝目錄下的 PLUGIN 目錄中就可以瞭,OllyDBG 啟動時會自動識別。要註意的是 OllyDBG 1.10 對插件的個數有限制,最多不能超過 32 個,否則會出錯。建議插件不要添加的太多。

到這裡基本配置就完成瞭,OllyDBG 把所有配置都放在安裝目錄下的 ollydbg.ini 文件中。

二、基本調試方法

OllyDBG 有三種方式來載入程序進行調試,一種是點擊菜單 文件->打開 (快捷鍵是 F3)來打開一個可執行文件進行調試,另一種是點擊菜單 文件- >附加 來附加到一個已運行的進程上進行調試。註意這裡要附加的程序必須已運行。第三種就是用右鍵菜單來載入程序(不知這種算不算)。一般情況下我們選第一種方 式。比如我們選擇一個 test.exe 來調試,通過菜單 文件->打開 來載入這個程序,OllyDBG 中顯示的內容將會是這樣:

調試中我們經常要用到的快捷鍵有這些:

F2:設置斷點,隻要在光標定位的位置(上圖中灰色條)按F2鍵即可,再按一次F2鍵則會刪除斷點。(相當於 SoftICE 中的 F9)

F8:單步步過。每按一次這個鍵執行一條反匯編窗口中的一條指令,遇到 CALL 等子程序不進入其代碼。(相當於 SoftICE 中的 F10)

F7:單步步入。功能同單步步過(F8)類似,區別是遇到 CALL 等子程序時會進入其中,進入後首先會停留在子程序的第一條指令上。(相當於 SoftICE 中的 F8)

F4:運行到選定位置。作用就是直接運行到光標所在位置處暫停。(相當於 SoftICE 中的 F7)

F9:運行。按下這個鍵如果沒有設置相應斷點的話,被調試的程序將直接開始運行。(相當於 SoftICE 中的 F5)

CTR+F9:執行到返回。此命令在執行到一個 ret (返回指令)指令時暫停,常用於從系統領空返回到我們調試的程序領空。(相當於 SoftICE 中的 F12)

ALT+F9:執行到用戶代碼。可用於從系統領空快速返回到我們調試的程序領空。(相當於 SoftICE 中的 F11)

現在我們開始正式進入破解。今天的目標程序是看雪兄《加密與解 密》第一版附帶光盤中的 crackmes.cjb.net 鏡像打包中的 CFF Crackme #3,采用用戶名/序列號保護方式。原版加瞭個 UPX 的殼。剛開始學破解先不涉及殼的問題,我們主要是熟悉用 OllyDBG 來破解的一般方法。我這裡把殼脫掉來分析,附件是脫殼後的文件,直接就可以拿來用。先說一下一般軟件破解的流程:拿到一個軟件先別接著馬上用 OllyDBG 調試,先運行一下,有幫助文檔的最好先看一下幫助,熟悉一下軟件的使用方法,再看看註冊的方式。如果是序列號方式可以先輸個假的來試一下,看看有什麼反 應,也給我們破解留下一些有用的線索。如果沒有輸入註冊碼的地方,要考慮一下是不是讀取註冊表或 Key 文件(一般稱 keyfile,就是程序讀取一個文件中的內容來判斷是否註冊),這些可以用其它工具來輔助分析。如果這些都不是,原程序隻是一個功能不全的試用版,那要 註冊為正式版本就要自己來寫代碼完善瞭。有點跑題瞭,呵呵。獲得程序的一些基本信息後,還要用查殼的工具來查一下程序是否加瞭殼,若沒殼的話看看程序是什 麼編譯器編的,如 VC、Delphi、VB 等。這樣的查殼工具有 PEiD 和 FI。有殼的話我們要盡量脫瞭殼後再來用 OllyDBG 調試,特殊情況下也可帶殼調試。下面進入正題:

我們先來運行一下這個 crackme(用 PEiD 檢測顯示是 Delphi 編的),界面如圖:

這個 crackme 已經把用戶名和註冊碼都輸好瞭,省得我們動手^_^。我們在那個“Register now !”按鈕上點擊一下,將會跳出一個對話框:

好瞭,今天我們就從這個錯誤對話框中顯示的“Wrong Serial, try again!”來入手。啟動 OllyDBG,選擇菜單 文件->打開 載入 CrackMe3.exe 文件,我們會停在這裡:

我們在反匯編窗口中右擊,出來一個菜單,我們在 查找->所有參考文本字串 上左鍵點擊:

當然如果用上面那個 超級字串參考+ 插件會更方便。但我們的目標是熟悉 OllyDBG 的一些操作,我就盡量使用 OllyDBG 自帶的功能,少用插件。好瞭,現在出來另一個對話框,我們在這個對話框裡右擊,選擇“查找文本”菜單項,輸入“Wrong Serial, try again!”的開頭單詞“Wrong”(註意這裡查找內容要區分大小寫)來查找,找到一處:

在我們找到的字串上右擊,再在出來的菜單上點擊“反匯編窗口中跟隨”,我們來到這裡:

見上圖,為瞭看看是否還有其他的參考,可以通過選擇右鍵菜單查找參考->立即數,會出來一個對話框:

分別雙擊上面標出的兩個地址,我們會來到對應的位置:

00440F79 |. BA 8C104400      MOV EDX,CrackMe3.0044108C              ; ASCII "Wrong Serial,try again!"

00440F7E |. A1 442C4400      MOV EAX,DWORD PTR DS:[442C44]

00440F83 |. 8B00             MOV EAX,DWORD PTR DS:[EAX]

00440F85 |. E8 DEC0FFFF      CALL CrackMe3.0043D068

00440F8A |. EB 18            JMP SHORT CrackMe3.00440FA4

00440F8C |> 6A 00            PUSH 0

00440F8E |. B9 80104400      MOV ECX,CrackMe3.00441080              ; ASCII "Beggar off!"

00440F93 |. BA 8C104400      MOV EDX,CrackMe3.0044108C              ; ASCII "Wrong Serial,try again!"

00440F98 |. A1 442C4400      MOV EAX,DWORD PTR DS:[442C44]

00440F9D |. 8B00             MOV EAX,DWORD PTR DS:[EAX]

00440F9F |. E8 C4C0FFFF      CALL CrackMe3.0043D068

我們在反匯編窗口中向上滾動一下再看看:

00440F2C |. 8B45 FC          MOV EAX,DWORD PTR SS:[EBP-4]

00440F2F |. BA 14104400      MOV EDX,CrackMe3.00441014              ; ASCII "Registered User"

00440F34 |. E8 F32BFCFF      CALL CrackMe3.00403B2C                 ; 關鍵,要用F7跟進去

00440F39 |. 75 51            JNZ SHORT CrackMe3.00440F8C            ; 這裡跳走就完蛋

00440F3B |. 8D55 FC          LEA EDX,DWORD PTR SS:[EBP-4]

00440F3E |. 8B83 C8020000    MOV EAX,DWORD PTR DS:[EBX+2C8]

00440F44 |. E8 D7FEFDFF      CALL CrackMe3.00420E20

00440F49 |. 8B45 FC          MOV EAX,DWORD PTR SS:[EBP-4]

00440F4C |. BA 2C104400      MOV EDX,CrackMe3.0044102C              ; ASCII "GFX-754-IER-954"

00440F51 |. E8 D62BFCFF      CALL CrackMe3.00403B2C                 ; 關鍵,要用F7跟進去

00440F56 |. 75 1A            JNZ SHORT CrackMe3.00440F72            ; 這裡跳走就完蛋

00440F58 |. 6A 00 PUSH 0

00440F5A |. B9 3C104400      MOV ECX,CrackMe3.0044103C              ; ASCII "CrackMe cracked successfully"

00440F5F |. BA 5C104400      MOV EDX,CrackMe3.0044105C              ; ASCII "Congrats! You cracked this CrackMe!"

00440F64 |. A1 442C4400      MOV EAX,DWORD PTR DS:[442C44]

00440F69 |. 8B00             MOV EAX,DWORD PTR DS:[EAX]

00440F6B |. E8 F8C0FFFF      CALL CrackMe3.0043D068

00440F70 |. EB 32            JMP SHORT CrackMe3.00440FA4

00440F72 |> 6A 00            PUSH 0

00440F74 |. B9 80104400      MOV ECX,CrackMe3.00441080              ; ASCII "Beggar off!"

00440F79 |. BA 8C104400      MOV EDX,CrackMe3.0044108C              ; ASCII "Wrong Serial,try again!"

00440F7E |. A1 442C4400      MOV EAX,DWORD PTR DS:[442C44]

00440F83 |. 8B00             MOV EAX,DWORD PTR DS:[EAX]

00440F85 |. E8 DEC0FFFF      CALL CrackMe3.0043D068

00440F8A |. EB 18            JMP SHORT CrackMe3.00440FA4

00440F8C |> 6A 00            PUSH 0

00440F8E |. B9 80104400      MOV ECX,CrackMe3.00441080              ; ASCII "Beggar off!"

00440F93 |. BA 8C104400      MOV EDX,CrackMe3.0044108C              ; ASCII "Wrong Serial,try again!"

00440F98 |. A1 442C4400      MOV EAX,DWORD PTR DS:[442C44]

00440F9D |. 8B00             MOV EAX,DWORD PTR DS:[EAX]

00440F9F |. E8 C4C0FFFF      CALL CrackMe3.0043D068

大傢註意看一下上面的註釋,我在上面標瞭兩個關鍵點。有人可能要問,你怎麼知道那兩個地方是關鍵點?其實很簡單,我是根據查看是哪條指令跳到 “wrong serial,try again”這條字串對應的指令來決定的。如果你在 調試選項->CPU 標簽中把“顯示跳轉路徑”及其下面的兩個“如跳轉未實現則顯示灰色路徑”、“顯示跳轉到選定命令的路徑”都選上的話,就會看到是從什麼地方跳到出錯字串處 的:

我們在上圖中地址 00440F2C 處按 F2 鍵設個斷點,現在我們按 F9 鍵,程序已運行起來瞭。我在上面那個編輯框中隨便輸入一下,如 CCDebuger,下面那個編輯框我還保留為原來的“754-GFX-IER-954”,我們點一下那個“Register now !”按鈕,呵, OllyDBG 跳瞭出來,暫停在我們下的斷點處。我們看一下信息窗口,你應該發現瞭你剛才輸入的內容瞭吧?我這裡顯示是這樣:

堆棧 SS:[0012F9AC]=00D44DB4, (ASCII "CCDebuger")

EAX=00000009

上面的內存地址 00D44DB4 中就是我們剛才輸入的內容,我這裡是 CCDebuger。你可以在 堆棧 SS:[0012F9AC]= 00D44DB4, (ASCII "CCDebuger") 這條內容上左擊選擇一下,再點右鍵,在彈出菜單中選擇“數據窗口中跟隨數值”,你就會在下面的數據窗口中看到你剛才輸入的內容。而 EAX=00000009 指的是你輸入內容的長度。如我輸入的 CCDebuger 是9個字符。如下圖所示:

現在我們來按 F8 鍵一步步分析一下:

00440F2C |. 8B45 FC          MOV EAX,DWORD PTR SS:[EBP-4]           ; 把我們輸入的內容送到EAX,我這裡是“CCDebuger”

00440F2F |. BA 14104400      MOV EDX,CrackMe3.00441014              ; ASCII "Registered User"

00440F34 |. E8 F32BFCFF      CALL CrackMe3.00403B2C                 ; 關鍵,要用F7跟進去

00440F39 |. 75 51            JNZ SHORT CrackMe3.00440F8C            ; 這裡跳走就完蛋

當我們按 F8 鍵走到 00440F34 |. E8 F32BFCFF      CALL CrackMe3.00403B2C 這一句時,我們按一下 F7 鍵,進入這個 CALL,進去後光標停在這一句:

我們所看到的那些 PUSH EBX、 PUSH ESI 等都是調用子程序保存堆棧時用的指令,不用管它,按 F8 鍵一步步過來,我們隻關心關鍵部分:

00403B2C /$ 53               PUSH EBX

00403B2D |. 56               PUSH ESI

00403B2E |. 57               PUSH EDI

00403B2F |. 89C6             MOV ESI,EAX                          ; 把EAX內我們輸入的用戶名送到 ESI

00403B31 |. 89D7             MOV EDI,EDX                          ; 把EDX內的數據“Registered User”送到EDI

00403B33 |. 39D0             CMP EAX,EDX                          ; 用“Registered User”和我們輸入的用戶名作比較

00403B35 |. 0F84 8F000000    JE CrackMe3.00403BCA                 ; 相同則跳

00403B3B |. 85F6             TEST ESI,ESI                         ; 看看ESI中是否有數據,主要是看看我們有沒有輸入用戶名

00403B3D |. 74 68            JE SHORT CrackMe3.00403BA7           ; 用戶名為空則跳

00403B3F |. 85FF             TEST EDI,EDI

00403B41 |. 74 6B            JE SHORT CrackMe3.00403BAE

00403B43 |. 8B46 FC          MOV EAX,DWORD PTR DS:[ESI-4]         ; 用戶名長度送EAX

00403B46 |. 8B57 FC          MOV EDX,DWORD PTR DS:[EDI-4]         ; “Registered User”字串的長度送EDX

00403B49 |. 29D0             SUB EAX,EDX                          ; 把用戶名長度和“Registered User”字串長度相減

00403B4B |. 77 02            JA SHORT CrackMe3.00403B4F           ; 用戶名長度大於“Registered User”長度則跳

00403B4D |. 01C2             ADD EDX,EAX                          ; 把減後值與“Registered User”長度相加,即用戶名長度

00403B4F |> 52               PUSH EDX

00403B50 |. C1EA 02          SHR EDX,2                            ; 用戶名長度值右移2位,這裡相當於長度除以4

00403B53 |. 74 26            JE SHORT CrackMe3.00403B7B           ; 上面的指令及這條指令就是判斷用戶名長度最少不能低於4

00403B55 |> 8B0E             MOV ECX,DWORD PTR DS:[ESI]           ; 把我們輸入的用戶名送到ECX

00403B57 |. 8B1F             MOV EBX,DWORD PTR DS:[EDI]           ; 把“Registered User”送到EBX

00403B59 |. 39D9             CMP ECX,EBX                          ; 比較

00403B5B |. 75 58            JNZ SHORT CrackMe3.00403BB5          ; 不等則完蛋

根據上面的分析,我們知道用戶名必須是“Registered User”。我們按 F9 鍵讓程序運行,出現錯誤對話框,點確定,重新在第一個編輯框中輸入“Registered User”,再次點擊那個“Register now !”按鈕,被 OllyDBG 攔下。因為地址 00440F34 處的那個 CALL 我們已經分析清楚瞭,這次就不用再按 F7 鍵跟進去瞭,直接按 F8 鍵通過。我們一路按 F8 鍵,來到第二個關鍵代碼處:

00440F49 |. 8B45 FC          MOV EAX,DWORD PTR SS:[EBP-4]          ; 取輸入的註冊碼

00440F4C |. BA 2C104400      MOV EDX,CrackMe3.0044102C             ; ASCII "GFX-754-IER-954"

00440F51 |. E8 D62BFCFF      CALL CrackMe3.00403B2C                ; 關鍵,要用F7跟進去

00440F56 |. 75 1A            JNZ SHORT CrackMe3.00440F72           ; 這裡跳走就完蛋

大傢註意看一下,地址 00440F51 處的 CALL CrackMe3.00403B2C 和上面我們分析的地址 00440F34 處的 CALL CrackMe3.00403B2C 是不是匯編指令都一樣啊?這說明檢測用戶名和註冊碼是用的同一個子程序。而這個子程序 CALL 我們在上面已經分析過瞭。我們執行到現在可以很容易得出結論,這個 CALL 也就是把我們輸入的註冊碼與 00440F4C 地址處指令後的“GFX- 754-IER-954”作比較,相等則 OK。好瞭,我們已經得到足夠的信息瞭。現在我們在菜單 查看->斷點 上點擊一下,打開斷點窗口(也可以通過組合鍵 ALT+B 或點擊工具欄上那個“B”圖標打開斷點窗口):

為什麼要做這一步,而不是把這個斷點刪除呢?這裡主要是為瞭保險一點,萬一分析錯誤,我們還要接著分析,要是把斷點刪除瞭就要做一些重復工作瞭。還是先禁 用一下,如果經過實際驗證證明我們的分析是正確的,再刪不遲。現在我們把斷點禁用,在 OllyDBG 中按 F9 鍵讓程序運行。輸入我們經分析得出的內容:

用戶名:Registered User

註冊碼:GFX-754-IER-954

點擊“Register now !”按鈕,呵呵,終於成功瞭:

快捷鍵命令

這些快捷鍵命令原版OllyDBG中沒有,是OllyICE後加上去的,相信會大大提高操作的方便性。

1).二進制復制/粘貼快捷鍵
反匯編窗口:Shift+C/Shift+V
數據窗口:Shift+C/Shift+V
註意:數據窗口中,Shift+V時,不必選擇塊大小,會將剪粘板的數據全部粘貼上去。

2).查看數據
push A480033 //如果按回車鍵,則數據窗口中顯示A480033數據,此行按Shift+回車鍵,即可跳到A480033地址;
mov eax,401000 //此行按回車,則數據窗口中顯示401000 數據
mov eax,[401000] //此行按回車,則數據窗口中顯示401000 數據
mov [ebp-4], esp //此行按回車,則數據窗口中顯示ebp-4的值(註意EIP必須指向當前行)
mov eax, [esp+10]//此行按回車,則數據窗口中顯示esp+10的值(註意EIP必須指向當前行)

3).數據窗口查看數據 (來源於heXer)
數據窗口:
00406000 00 10 40 00 00 00 00 00 00 00 00 00 CA 2E 40 00 .@………?@.
^
光標移到“00 10 40 00”第一字節00處,按回車,反匯編窗口顯示401000;Shift+回車,數據窗口顯示401000

4).堆棧窗口 (來源於heXer)
0012FF44 00401D8A //按回車,反匯編窗口顯示0401D8A;Shift+回車,數據窗口顯示0401D8A
0012FF48 00000000

5).數據窗口選擇數據顯示
當光標在數據窗口移動時,會顯示出光標起始地址、結束地址,以及選中的塊大小。

6).數據窗口切換到代碼窗口
00406000 00 12 40 00 00 00 00 00 00 00 00 00 CA 2E 40 00 .@………?@.
^
光標移到“00 12 40 00”第一字節00處,按Ctrl+雙擊鼠標,則反匯編窗口顯示光標所在地址,即00406000開始的代碼

7).反匯編窗口或數據窗口取當前地址
快捷鍵:ctrl+X
例如:
004091C0 push ebp
004091C1 mov ebp, esp
004091C3 push -1 //此行按快捷鍵ctrl+X ,則將地址004091C3復制到剪粘板裡
數據窗口同樣操作。
0040DD40 55 8B EC 83 EC 08 53 56 57 55 FC 8B 5D 0C 8B 45 U

快捷鍵命令增加:kanxue
感謝heXer,CoDe_Inject給與的幫助與提示!

OllyDBG技巧

下文中OD是OllyDBG的簡稱。

Q: OD中如何運行到光標所在處?
A: 將光標移到目標位置,按F4.

Q: 如何用OD修改可執行程序?
A:直接在反匯編代碼區更改,這時可以使用匯編代碼更改,然後選中修改後的匯編代碼,右擊–>復制到可執行文件–>保存文件.

Q:OD中的代碼亂碼,如:
004365E0 >db 68 ; CHAR ‘h’
004365E1 >db A4
004365E2 >db 7A ; CHAR ‘z’
004365E3 >db E5
004365E4 >db B8
004365E5 >db E8
004365E6 >db BB

A:OD右鍵,"分析/從模板中刪除分析",如不行,按Ctrl+A重新分析

Q:OD為什麼刪除瞭斷點,重新加載的時候,這些斷點都會重新出現
A:設置ollydbg.ini,將配制文件裡改成如下:Backup UDD files=1 (by kanxue)

Q:如何還原到OD到分析前的狀態?
A:右鍵 分析/從模塊中刪除掃描

Q:什麼是UDD?
A:OllyDbg 把所有程序或模塊相關的信息保存至單獨的文件中,並在模塊重新加載時繼續使用。這些信息包括瞭標簽、註釋、斷點、監視、分析數據、條件等等

Q:OD的數據窗口顯示一個下劃線,是什麼意思?
A:重定位加下劃線[Underline fixups],幾乎所有的DLL和一部分程序都包含重定位,這樣就可以在內存中的不同基地址加載模塊瞭。當該項開啟時,CPU反匯編窗口或CPU數據窗口中的重定位地址都將添加下劃線。(xing_xsz)

Q:如果已經知道某一CALL的具體作用,能否把後面所有相同的CALL都改成函數名形式?
A:比如 CALL 110000 此中已經知道110000是一個核心計算
則如下操作,讓光標停在CALL 110000 這個語句上,按回車鍵
會跳到110000的地址上去顯示,之後讓光標停在110000上,按
shift 和; (分號) 其實就是完成一個:(冒號)的動作,輸入
名稱,這回所有的調用110000處,都會顯示CALL 你剛才輸入的
名稱瞭.(nig回答)

Q:用OD調試一些加殼程序,如Themida等,可能你會發現下斷後(包括硬件斷點),程序跑到斷點時,OD會出現假死現像。
A:打開OD配置文件ollydbg.ini,你會發現:Restore windows= 123346 //這個Restore windows可能會是一個**的值
現在隻需要將Restore windows=0,重新用OD調試程序,假死問題就消失瞭。 (kanxue)

Q:ollydbg中如何調用pdb文件?
A:
pdb文件是VC++調試編譯生成的文件。由編譯器直接生成。
pdb文件要配合源文件使用。不同的源文件pdb文件不同。
用OD裝入可執行文件後,點擊CPU窗口中的註釋段可出現源碼。
不過不是所有的源碼都可以顯示的。VC++6.0以下都可以顯示。
還有一種不顯示的原因是缺少路徑。點擊OD主菜單的[查看]->[源文件]
如果[源碼]段出現(缺少)字樣的話,說明此路徑的源碼是看不瞭的。設置正確的路徑就可以瞭。
(nantz回答)

Q:運行A.exe,其會調用B.exe,如果用OD再附加B.exe,OD會死掉
A:
1.OD菜單,設置OD為即時調試器;
2.將B.exe的入口改成CC,即INT 3指令,同時記下原指令
3.運行A.exe,其調用B.exe,會導致異常,OD會自動啟動加載B.exe,此時你將INT 3指令恢復原指令。
4.到這步,你己可以任意調試B.exe瞭(kanxue)

Q:用ollydbg調試的時候,斷住kernel32.dll系統函數,然後”執行到用戶代碼“,就可以回到被調程序的代碼。但有時候卻回不來,不知道這又是為什麼?
A:
多半是殺毒軟件(如卡巴對LoadLibraryA)Hook API入口代碼進入ring 0瞭,OllyDbg不能單步跟蹤,這種情況下隻要看堆棧返回地址,在返回地址上下端點,F9執行就可以瞭。(cyclotron回答)