<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 495,comments - 227,trackbacks - 0
    一、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)
    上面提到的幾個快捷鍵對于一般的調試基本上已夠用了。要開始調試只需設置好斷點,找到你感興趣的代碼段再按 F8 或 F7 鍵來一條條分析指令功能就可以了。就寫到這了,改天有空再接著灌。

    OllyDBG 入門系列(二)-字串參考

    作者:CCDebuger
    上一篇是使用入門,現在我們開始正式進入破解。今天的目標程序是看雪兄《加密與解密》第一版附帶光盤中的 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”(注意這里查找內容要區分大小寫)來查找,找到一處:

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

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



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

    我們在上圖中地址 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 入門系列(三)-函數參考

    作者:CCDebuger
    現在進入第三篇,這一篇我們重點講解怎樣使用 OllyDBG 中的函數參考(即名稱參考)功能。仍然選擇 crackmes.cjb.net 鏡像打包中的一個名稱為 CrackHead 的crackme。老規矩,先運行一下這個程序看看:

    呵,竟然沒找到輸入注冊碼的地方!別急,我們點一下程序上的那個菜單“Shit”(真是 Shit 啊,呵呵),在下拉菜單中選“Try It”,會來到如下界面:

    我們點一下那個“Check It”按鈕試一下,哦,竟然沒反應!我再輸個“78787878”試試,還是沒反應。再試試輸入字母或其它字符,輸不進去。由此判斷注冊碼應該都是數字,只有輸入正確的注冊碼才有動靜。用 PEiD 檢測一下,結果為 MASM32 / TASM32,怪不得程序比較小。信息收集的差不多了,現在關掉這個程序,我們用 OllyDBG 載入,按 F9 鍵直接讓它運行起來,依次點擊上面圖中所說的菜單,使被調試程序顯示如上面的第二個圖。先不要點那個“Check It”按鈕,保留上圖的狀態。現在我們沒有什么字串好參考了,我們就在 API 函數上下斷點,來讓被調試程序中斷在我們希望的地方。我們在 OllyDBG 的反匯編窗口中右擊鼠標,在彈出菜單中選擇 查找->當前模塊中的名稱 (標簽),或者我們通過按 CTR+N 組合鍵也可以達到同樣的效果(注意在進行此操作時要在 OllyDBG 中保證是在當前被調試程序的領空,我在第一篇中已經介紹了領空的概念,如我這里調試這個程序時 OllyDBG 的標題欄顯示的就是“[CPU - 主線程, 模塊 - CrackHea]”,這表明我們當前在被調試程序的領空)。通過上面的操作后會彈出一個對話框,如圖:

    對于這樣的編輯框中輸注冊碼的程序我們要設斷點首選的 API 函數就是 GetDlgItemText 及 GetWindowText。每個函數都有兩個版本,一個是 ASCII 版,在函數后添加一個 A 表示,如 GetDlgItemTextA,另一個是 UNICODE 版,在函數后添加一個 W 表示。如 GetDlgItemTextW。對于編譯為 UNCODE 版的程序可能在 Win98 下不能運行,因為 Win98 并非是完全支持 UNICODE 的系統。而 NT 系統則從底層支持 UNICODE,它可以在操作系統內對字串進行轉換,同時支持 ASCII 和 UNICODE 版本函數的調用。一般我們打開的程序看到的調用都是 ASCII 類型的函數,以“A”結尾。又跑題了,呵呵。現在回到我們調試的程序上來,我們現在就是要找一下我們調試的程序有沒有調用 GetDlgItemTextA 或 GetWindowTextA 函數。還好,找到一個 GetWindowTextA。在這個函數上右擊,在彈出菜單上選擇“在每個參考上設置斷點”,我們會在 OllyDBG 窗口最下面的那個狀態欄里看到“已設置 2 個斷點”。另一種方法就是那個 GetWindowTextA 函數上右擊,在彈出菜單上選擇“查找輸入函數參考”(或者按回車鍵),將會出現下面的對話框:

    看上圖,我們可以把兩條都設上斷點。這個程序只需在第一條指令設斷點就可以了。好,我們現在按前面提到的第一條方法,就是“在每個參考上設置斷點”,這樣上圖中的兩條指令都會設上斷點。斷點設好后我們轉到我們調試的程序上來,現在我們在被我們調試的程序上點擊那個“Check It”按鈕,被 OllyDBG 斷下:
    00401323 |. E8 4C010000         CALL            ; GetWindowTextA
    00401328 |. E8 A5000000         CALL CrackHea.004013D2                      ; 關鍵,要按F7鍵跟進去
    0040132D |. 3BC6                CMP EAX,ESI                                 ; 比較
    0040132F |. 75 42               JNZ SHORT CrackHea.00401373                 ; 不等則完蛋
    00401331 |. EB 2C               JMP SHORT CrackHea.0040135F
    00401333 |. 4E 6F 77 20 7>      ASCII "Now write a keyg"
    00401343 |. 65 6E 20 61 6>      ASCII "en and tut and y"
    00401353 |. 6F 75 27 72 6>      ASCII "ou're done.",0
    0040135F |> 6A 00               PUSH 0                                      ; Style = MB_OK|MB_APPLMODAL
    00401361 |. 68 0F304000         PUSH CrackHea.0040300F                      ; Title = "Crudd's Crack Head"
    00401366 |. 68 33134000         PUSH CrackHea.00401333                      ; Text = "Now write a keygen and tut and you're done."
    0040136B |. FF75 08             PUSH DWORD PTR SS:[EBP+8]                   ; hOwner
    0040136E |. E8 19010000         CALL               ; MessageBoxA
    從上面的代碼,我們很容易看出 00401328 地址處的 CALL CrackHea.004013D2 是關鍵,必須仔細跟蹤。而注冊成功則會顯示一個對話框,標題是“Crudd's Crack Head”,對話框顯示的內容是“Now write a keygen and tut and you're done.”現在我按一下 F8,準備步進到 00401328 地址處的那條 CALL CrackHea.004013D2 指令后再按 F7 鍵跟進去。等等,怎么回事?怎么按一下 F8 鍵跑到這來了:
    00401474 $- FF25 2C204000      JMP DWORD PTR DS:[    ; USER32.GetWindowTextA
    0040147A $- FF25 30204000      JMP DWORD PTR DS:[]     ; USER32.LoadCursorA
    00401480 $- FF25 1C204000      JMP DWORD PTR DS:[]       ; USER32.LoadIconA
    00401486 $- FF25 20204000      JMP DWORD PTR DS:[]       ; USER32.LoadMenuA
    0040148C $- FF25 24204000      JMP DWORD PTR DS:[]     ; USER32.MessageBoxA
    原來是跳到另一個斷點了。這個斷點我們不需要,按一下 F2 鍵刪掉它吧。刪掉 00401474 地址處的斷點后,我再按 F8 鍵,呵,完了,跑到 User32.dll 的領空了。看一下 OllyDBG 的標題欄:“[CPU - 主線程, 模塊 - USER32],跑到系統領空了,OllyDBG 反匯編窗口中顯示代碼是這樣:
    77D3213C 6A 0C                 PUSH 0C
    77D3213E 68 A021D377           PUSH USER32.77D321A0
    77D32143 E8 7864FEFF           CALL USER32.77D185C0
    怎么辦?別急,我們按一下 ALT+F9 組合鍵,呵,回來了:
    00401328 |. E8 A5000000        CALL CrackHea.004013D2                     ; 關鍵,要按F7鍵跟進去
    0040132D |. 3BC6               CMP EAX,ESI                                ; 比較
    0040132F |. 75 42              JNZ SHORT CrackHea.00401373                ; 不等則完蛋
    光標停在 00401328 地址處的那條指令上。現在我們按 F7 鍵跟進:
    004013D2 /$ 56                PUSH ESI                                    ; ESI入棧
    004013D3 |. 33C0              XOR EAX,EAX                                 ; EAX清零
    004013D5 |. 8D35 C4334000     LEA ESI,DWORD PTR DS:[4033C4]               ; 把注冊碼框中的數值送到ESI
    004013DB |. 33C9              XOR ECX,ECX                                 ; ECX清零
    004013DD |. 33D2              XOR EDX,EDX                                 ; EDX清零
    004013DF |. 8A06              MOV AL,BYTE PTR DS:[ESI]                    ; 把注冊碼中的每個字符送到AL
    004013E1 |. 46                INC ESI                                     ; 指針加1,指向下一個字符
    004013E2 |. 3C 2D             CMP AL,2D                                   ; 把取得的字符與16進制值為2D的字符(即“-”)比較,這里主要用于判斷輸入的是不是負數
    004013E4 |. 75 08             JNZ SHORT CrackHea.004013EE                 ; 不等則跳
    004013E6 |. BA FFFFFFFF       MOV EDX,-1                                  ; 如果輸入的是負數,則把-1送到EDX,即16進制FFFFFFFF
    004013EB |. 8A06              MOV AL,BYTE PTR DS:[ESI]                    ; 取“-”號后的第一個字符
    004013ED |. 46                INC ESI                                     ; 指針加1,指向再下一個字符
    004013EE |> EB 0B             JMP SHORT CrackHea.004013FB
    004013F0 |> 2C 30             SUB AL,30                                   ; 每位字符減16進制的30,因為這里都是數字,如1的ASCII碼是“31H”,減30H后為1,即我們平時看到的數值
    004013F2 |. 8D0C89            LEA ECX,DWORD PTR DS:[ECX+ECX*4]            ; 把前面運算后保存在ECX中的結果乘5再送到ECX
    004013F5 |. 8D0C48            LEA ECX,DWORD PTR DS:[EAX+ECX*2]            ; 每位字符運算后的值與2倍上一位字符運算后值相加后送ECX
    004013F8 |. 8A06              MOV AL,BYTE PTR DS:[ESI]                    ; 取下一個字符
    004013FA |. 46                INC ESI                                     ; 指針加1,指向再下一個字符
    004013FB |> 0AC0              or AL,AL
    004013FD |.^ 75 F1            JNZ SHORT CrackHea.004013F0                 ; 上面一條和這一條指令主要是用來判斷是否已把用戶輸入的注冊碼計算完
    004013FF |. 8D040A            LEA EAX,DWORD PTR DS:[EDX+ECX]              ; 把EDX中的值與經過上面運算后的ECX中值相加送到EAX
    00401402 |. 33C2              XOR EAX,EDX                                 ; 把EAX與EDX異或。如果我們輸入的是負數,則此處功能就是把EAX中的值取反
    00401404 |. 5E                POP ESI                                     ; ESI出棧。看到這條和下一條指令,我們要考慮一下這個ESI的值是哪里運算得出的呢?
    00401405 |. 81F6 53757A79     XOR ESI,797A7553                            ; 把ESI中的值與797A7553H異或
    0040140B \. C3                RETN
    這里留下了一個問題:那個 ESI 寄存器中的值是從哪運算出來的?先不管這里,我們接著按 F8 鍵往下走,來到 0040140B 地址處的那條 RETN 指令(這里可以通過在調試選項的“命令”標簽中勾選“使用 RET 代替 RETN”來更改返回指令的顯示方式),再按一下 F8,我們就走出 00401328 地址處的那個 CALL 了。現在我們回到了這里:
    0040132D |. 3BC6             CMP EAX,ESI                                  ; 比較
    0040132F |. 75 42            JNZ SHORT CrackHea.00401373                  ; 不等則完蛋
    光標停在了 0040132D 地址處的那條指令上。根據前面的分析,我們知道 EAX 中存放的是我們輸入的注冊碼經過計算后的值。我們來看一下信息窗口:
    ESI=E6B5F2F9
    EAX=FF439EBE
    左鍵選擇信息窗口中的 ESI=E6B5F2F9,再按右鍵,在彈出菜單上選“修改寄存器”,我們會看到這樣一個窗口:

    可能你的顯示跟我不一樣,因為這個 crackme 中已經說了每個機器的序列號不一樣。關掉上面的窗口,再對信息窗口中的 EAX=FF439EBE 做同樣操作:

    由上圖我們知道了原來前面分析的對我們輸入的注冊碼進行處理后的結果就是把字符格式轉為數字格式。我們原來輸入的是字串“12345666”,現在轉換為了數字 12345666。這下就很清楚了,隨便在上面那個修改 ESI 圖中顯示的有符號或無符號編輯框中復制一個,粘貼到我們調試的程序中的編輯框中試一下:

    呵呵,成功了。且慢高興,這個 crackme 是要求寫出注冊機的。我們先不要求寫注冊機,但注冊的算法我們要搞清楚。還記得我在前面說到的那個 ESI 寄存器值的問題嗎?現在看看我們上面的分析,其實對做注冊機來說是沒有多少幫助的。要搞清注冊算法,必須知道上面那個 ESI 寄存器值是如何產生的,這弄清楚后才能真正清楚這個 crackme 算法。今天就先說到這里。
    posted on 2007-06-27 16:14 SIMONE 閱讀(4445) 評論(0)  編輯  收藏 所屬分類: C++
    主站蜘蛛池模板: 亚洲午夜精品一区二区公牛电影院| 亚洲AV无码乱码国产麻豆穿越| 久久亚洲精品中文字幕无码| 亚洲国产精品无码久久98| 三年片免费高清版| 永久中文字幕免费视频网站| 国产精品亚洲аv无码播放| avtt天堂网手机版亚洲| 中文字字幕在线高清免费电影| 免费中文熟妇在线影片| 亚洲成av人片在线观看无码不卡| 亚洲啪AV永久无码精品放毛片| 久久aa毛片免费播放嗯啊| 亚洲国产香蕉人人爽成AV片久久 | 国产精品亚洲片夜色在线| 美女视频黄的免费视频网页| 国产伦精品一区二区三区免费下载 | 日韩在线视频免费| 成年女性特黄午夜视频免费看| 国产亚洲精AA在线观看SEE| 国产精品亚洲专区无码WEB| 100部毛片免费全部播放完整| 一本久久a久久精品亚洲| 精品韩国亚洲av无码不卡区| 国产成人免费高清激情明星| 亚洲成av人片天堂网| 国产国产人免费人成成免视频 | 国产在线jyzzjyzz免费麻豆| 久久久久亚洲精品成人网小说| 亚洲精品偷拍视频免费观看| 免费国产成人高清视频网站| 亚洲愉拍一区二区三区| 色婷婷7777免费视频在线观看| 久久久无码精品亚洲日韩蜜臀浪潮| 日本高清不卡aⅴ免费网站| 亚洲无码在线播放| 一级毛片免费播放| 亚洲中文无码a∨在线观看| 中文字幕免费视频一| 亚洲一级在线观看| 免费无码黄网站在线观看|