菜鳥的ollydbg1.08b教學篇 (10千字)

看雪資料發表於2003-01-27

寫之前先說點廢話(誰扔的香蕉皮,雞蛋^^^^^^^^^^^):

  ollydbg是個功能強大的軟體,以前我也不用他(不習慣),而且很多經典教程都是用trw和softice作為示例工具寫的.
初學者(注:和我一樣的人)往往一開始就接觸這些工具,做練習也就用這些工具!可以說已經上手了!
對ollydbg的動態除錯功能也就陌生了!

現在一個很現實的問題讓我改變了習慣,我的鍵盤滑鼠是usb的,顯示器也給我作對!trw和softice都用不成!
無奈只好學用ollydbg.發現這個東西實在太好了!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
*動態除錯的時候還能聽歌聊天泡MM(TRW,SOFTICE只能對黑屏)
*除錯方便,又有函式參考,可以隨意加註釋,輕鬆複製,清楚看到堆疊的變化^^^^^^^
*介面優美,可以隨意設定背景顏色!
*有強大的右鍵功能,使用起來特別方便!(特別適合老人小孩使用~~~~)
*說不出來了~~~其他的優點你自己去發掘吧!!!
我是一隻大菜鳥,接觸破沒多長時間,腦子也不怎麼靈光,水平低得可憐,說的不對的地方請高手指正!!!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~OLLYDBG簡介~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
現在就讓我這隻菜鳥給菜鳥們介紹一下:
1*工作介面:(我們從上往下看)

看到標題欄,選單欄和工具欄(不用讓我做名詞解釋了吧!)
  記住:工具欄的所有功能都能在選單欄裡找到,工具欄是選單欄的快捷按鈕(廢話!)
    各項詳細功能我們在下面說!
  再往下看有四個視窗他們是程式碼窗(左上),暫存器視窗(右上),記憶體視窗(左下)和堆疊視窗(右下)

2*選單欄各項命令功能
*檔案(F)----這些命令用說嗎?
        |____注意**該選單的下部有你上次開啟的紀錄,該紀錄儲存有你上次未清除的斷點**注意**


*檢視(V)------這個選單我只介紹一下我常用的,別的我不會!:-)
        |____執行模組(快捷鍵ALT+E):檢視該程式使用的動態連線庫(我的理解)
        |       
        |____斷點(快捷鍵ALT+B):這個是檢視你所有的斷點,(有時自己設到哪裡都忘了,可以看一下)起到一個輔助功能.
        我就會這麼多!:-(


*除錯(D)-------這個選單是關鍵,不明白你就別除錯軟體了!也只說常用的!
        |_______執行(F9)載入程式後,執行!
        | 
        |_______暫停(F12)
        |
        |_______單步進入(F7)遇見CALL就進!進入該子程!行話:"跟進去"
        |
        |______單步跳過(F8)遇見CALL不進去!不去管子程的內部!第一次粗跟的時候常用!
        |
        |______執行到返回(ALT+F9)就是執行到該子程的返回語句!

剩下的選單不重要~我也不費口舌了~~~我是"天下第一懶"(乾隆皇帝賜給我的名號)
知道這麼多就能開工了~~

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~例項分析~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
目標:FlashPT 2.1 Build 3067
破解人:winroot
工具:PEiD,W32DASM,ASPACKDIE,OLLYDBG
目的:一篇ollydbg的教程,軟體相對簡單!
下載地址:http://www.softreg.com.cn/shareware_view.asp?id=/4C7E305E-226A-43B9-98D2-BE0410D46806/


~~~~~~~~~~~~~~~~~~~~~~~~~~~~破解過程~~~~~~~~~~~~~~~~~~~~~~~~~~~~
破解過程:
該軟體安裝後有3各元件隨便註冊哪一個都一樣.
我選擇Flash轉換解密

1*PEiD查殼,ASPack 2.12 -> Alexey Solodovnikov
2*使用ASPACKDIE脫殼.脫殼後檔名為unpacked.exe
3*使用W32DASM反編譯進行靜態分析!
  載入unpacked.exe-->反編譯-->點選單欄的"參考"選擇字串資料參考
找到"註冊碼錯誤,請重新輸入!"雙擊我們來到
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004D1174(C)
|  ~~~~~~~~~~~~~~~~~~~~是從這裡跳過來的,我們就到這裡看看
:004D120D 6A00                    push 00000000

* Possible StringData Ref from Code Obj ->"提示"
                                  |
:004D120F B974124D00              mov ecx, 004D1274

* Possible StringData Ref from Code Obj ->"註冊碼錯誤,請重新輸入!"

#######################我們來到了004D1174#############################
:004D116B 8B55E4                  mov edx, dword ptr [ebp-1C]
:004D116E 58                      pop eax
:004D116F E8C42CF3FF              call 00403E38
:004D1174 0F8593000000            jne 004D120D                ;看到了吧!就是從這裡我們走向了死亡!
~~~~~~~~~~~~~~~~~~~~~~            ~~~~~~~~~~~~
:004D117A B201                    mov dl, 01
:004D117C A1DCCA4400              mov eax, dword ptr [0044CADC]
:004D1181 E856BAF7FF              call 0044CBDC
:004D1186 8BD8                    mov ebx, eax
:004D1188 BA02000080              mov edx, 80000002
:004D118D 8BC3                    mov eax, ebx
:004D118F E8E8BAF7FF              call 0044CC7C
:004D1194 B101                    mov cl, 01

* Possible StringData Ref from Code Obj ->"software\microsoft\windows\currentversion\chan"
                                        ->"gid"
                                  |
:004D1196 BA98124D00              mov edx, 004D1298
:004D119B 8BC3                    mov eax, ebx
:004D119D E83EBBF7FF              call 0044CCE0
:004D11A2 84C0                    test al, al
:004D11A4 745E                    je 004D1204
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~省略部分程式碼

* Possible StringData Ref from Code Obj ->"提示"
                                  |
:004D11E2 B974124D00              mov ecx, 004D1274

* Possible StringData Ref from Code Obj ->"註冊成功!謝謝您使用本軟體!

程式需要重新啟動"

~~~~~~~~~~~~~~~~~~~~~~~~~~*****爆破******~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
爆破就是爆著破:-)
看一下我們的分析:
:004D1174 0F8593000000            jne 004D120D                ;看到了吧!就是從這裡我們走向了死亡!
那我們就不走這裡了!他jne我們就改成je

*開工!!!!!!!!!!!
*首先,執行ollydbg載入脫殼後的unpacked.exe找到地址004D1174
004D1174    0F85 93000000  JNZ UNPACKED.004D120D

咦!!!!!!!怎麼變成jnz了?(我也不知道為什麼)但他與爆破無關!我們把他改成jz就能起到一樣的效果
1)我們雙擊這裡: JNZ UNPACKED.004D120D是改變它的彙編程式碼___________________注{
2)我們把他改成JZ 004D120D 點彙編後,他就變紅了 再點取消!                    {
3)然後右鍵單擊JZ 004D120D選擇"複製到可執行檔案"                            {雙擊位址列是絕對地址和相對地址的轉換
4)這時彈出一個視窗最上面就是000D1174  0F84 93000000    JE 000D120D        { 例如:我們雙擊004D1174 就會變成$ ==>
我們再右鍵單擊JE 000D120D選擇"儲存檔案"                                    { 雙擊機器碼欄就是設這個地址為斷點
5)輸入你設想的檔名就可以了                                                {例如:雙擊0F85 93000000我們可以看到變紅了
6)執行,呵呵!!已註冊!                                                        {說明我們已經把004D1174設定為斷點再雙擊就恢復
                                             

~~~~~~~~~~~~~~~~~~~~~~~~~***爆破結束***~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
經過上面的過程
如果你覺得不過癮就到登錄檔HKEY_LOCAL_MACHINE\software\microsoft\windows\currentversion\changid
刪除該鍵的鍵值(如果已註冊沒註冊就不用了)
我們繼續這次我們要動態分析了~~
################################動態分析###################################
動態分析的前提就是靜態分析,我們回過頭看一下靜態分析的結果
:004D116B 8B55E4                  mov edx, dword ptr [ebp-1C]
:004D116E 58                      pop eax
:004D116F E8C42CF3FF              call 00403E38        //這個是比較的call
:004D1174 0F8593000000            jne 004D120D

那麼我們就在004D116B設定斷點吧~~~
F2或者雙擊機器碼欄設定斷點---F9(執行)--輸入使用者名稱winroot,獲取ID,ID號碼4835812338,點選註冊,
程式被OLLYDBG攔截,
乖乖~~
你猜我們看見了什麼!!!!一串數字耶!!!3230027325再往右下看堆疊視窗一行ID號碼4835812338,一行3230027325
你看他那張臉,長得都像註冊碼~~~
退出來試一下~~~你快看我的臉  :-)
呵呵~~~~成功~~~
記憶體序號產生器你就自己作吧~鍛鍊一下!

##################################################################
破的還不過癮~~~~~~~~!!!
怎麼辦?
crack的宗旨就是製作出keygen
下面我們就來試一下,
首先還的分析~~透過上面的動態分析我們知道序列號的生成肯定在004D116B上面的某一段程式,
~如何確定只有跟蹤,看註冊碼最新一次是在哪個地方出現!
所以我們再向上看的時候發現了一個迴圈!非常可疑,下斷點跟蹤!
(ollydbg會把迴圈標出來!)
004D10EA  |. C745 F0 000000>MOV DWORD PTR SS:[EBP-10],0
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~F2或者雙擊機器碼欄設定斷點-
--F9(執行)--輸入使用者名稱winroot,獲取ID,ID號碼4835812338,點選註冊,程式被OLLYDBG攔截.
我們按F8(單步跳過)一下一下地執行,注意觀察暫存器和堆疊的變化!!
004D10F1  |. C745 F4 000000>MOV DWORD PTR SS:[EBP-C],0
004D10F8  |. 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]
004D10FB  |. E8 282CF3FF    CALL UNPACKED.00403D28
004D1100  |. 8BF0          MOV ESI,EAX
004D1102  |. 85F6          TEST ESI,ESI
004D1104  |. 7E 2D          JLE SHORT UNPACKED.004D1133
004D1106  |. BB 01000000    MOV EBX,1                  //計數器
004D110B  |> 8B45 FC        /MOV EAX,DWORD PTR SS:[EBP-4]//取id字串
004D110E  |. 807C18 FF 00  |CMP BYTE PTR DS:[EAX+EBX-1],0
004D1113  |. 74 1A          |JE SHORT UNPACKED.004D112F  //是零就跳!
004D1115  |. 8B45 FC        |MOV EAX,DWORD PTR SS:[EBP-4]//EAX=STR
004D1118  |. 8A4418 FF      |MOV AL,BYTE PTR DS:[EAX+EBX-1]//AL=STR[EBX-1]
004D111C  |. 25 FF000000    |AND EAX,0FF
004D1121  |. 33D2          |XOR EDX,EDX
004D1123  |. 0345 F0        |ADD EAX,DWORD PTR SS:[EBP-10]//和第一次的值相加
004D1126  |. 1355 F4        |ADC EDX,DWORD PTR SS:[EBP-C]
004D1129  |. 8945 F0        |MOV DWORD PTR SS:[EBP-10],EAX//存進去
004D112C  |. 8955 F4        |MOV DWORD PTR SS:[EBP-C],EDX
004D112F  |> 43            |INC EBX//計數器加1
004D1130  |. 4E            |DEC ESI
004D1131  |.^75 D8          \JNZ SHORT UNPACKED.004D110B//迴圈取累加和
004D1133  |> 6A 00          PUSH 0                   
004D1135  |. 68 F1E05D00    PUSH 5DE0F1                  //入棧
004D113A  |. 8B45 F0        MOV EAX,DWORD PTR SS:[EBP-10]//取序列號的累加和
004D113D  |. 8B55 F4        MOV EDX,DWORD PTR SS:[EBP-C]
004D1140  |. E8 874FF3FF    CALL UNPACKED.004060CC        //累加和*0x5DE0F1
004D1145  |. 8945 F0        MOV DWORD PTR SS:[EBP-10],EAX
004D1148  |. 8955 F4        MOV DWORD PTR SS:[EBP-C],EDX
004D114B  |. 8D55 E8        LEA EDX,DWORD PTR SS:[EBP-18]
004D114E  |. 8B87 F8020000  MOV EAX,DWORD PTR DS:[EDI+2F8]
004D1154  |. E8 B7D3FBFF    CALL UNPACKED.0048E510        //變成10進位制--真序列號
004D1159  |. 8B45 E8        MOV EAX,DWORD PTR SS:[EBP-18] //取假序列號的字串
004D115C  |. 50            PUSH EAX
004D115D  |. FF75 F4        PUSH DWORD PTR SS:[EBP-C]                ; /Arg2;返回值
004D1160  |. FF75 F0        PUSH DWORD PTR SS:[EBP-10]              ; |Arg1;序列號
004D1163  |. 8D45 E4        LEA EAX,DWORD PTR SS:[EBP-1C]            ; |
004D1166  |. E8 0574F3FF    CALL UNPACKED.00408570                  ; \UNPACKED.00408570
004D116B  |. 8B55 E4        MOV EDX,DWORD PTR SS:[EBP-1C]
004D116E  |. 58            POP EAX
004D116F  |. E8 C42CF3FF    CALL UNPACKED.00403E38//比較
004D1174  |. 0F85 93000000  JNZ UNPACKED.004D120D//跳出錯誤

注意:所有的註釋都是你跟蹤以後根據暫存器和堆疊的變化得出的!也不是在一次跟蹤中得出的,是跟蹤了多次後得出的結論!
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^


結論:我們可以看出序列號是這樣產生的,ID的每一位的ASCII值的累加和再和0x5DE0F1相乘得出的值轉化為10進位制形成序列號~~
所以
name:winroot
id:4835812338
ser=[(0x34+0x38+0x33+0x35+0x38+0x31+0x32+0x33+0x33+0x38)*0x5DE0F1]  =[C0864E3D]  =[3230027325]
                                                                  16          16            10
簡單吧~~
希望我們菜鳥群能出幾個高手~~能寫出來最好的教程,不像我這樣~~貽誤他人~

菜鳥心得:
crack是門操作性很大的學問,所以一定要動手,
看到好的文章一定要試一下自己就會有更深一步的體會,不要看到別人寫過了就不去破了.
學習來不得半點虛假!

相關文章