ollydbg破解教學之--------萬能斷點篇

看雪資料發表於2015-11-15

ollydbg破解教學之--------萬能斷點篇

    終於有一點時間總結一下OD破解的經驗,有許多大俠們都認為OD不能下萬能斷點,可是有些軟體的破解需要用到萬能斷
點,以前一直沒有這方面的資料,有的只是OD不能下萬能斷點的斷言,一時心恢之極,可是我原來用TRW和SICE用的挺好,誰知
系統又跟我鬧矛盾,一用TRW和SICE就當機,沒辦法我現在只能用OD,我寫的一些破解文章都是用OD破的,反覆試驗,我終於發
現OD也能下萬能斷點,在我以前寫的一些文章中好象有一篇簡單提到過,但沒有說的很詳細,這次靜下心,想寫一點東西,送給
我心愛的組織DFCG吧,我的破解是從DFCG組織起步的,很感謝DFCG的高手們的幫助,在此說聲謝謝!為了更明確,這次破解所使
用的偵錯程式OD是從看雪論壇臨時下載的OD1.09的漢化版,沒有使用我自己手頭經過改造的OD,在此也感謝看雪論壇,這裡真的
有很多高手,在這個論壇我也學到了很多.這次破解的物件是超級XX王,為保護國產軟體我隱去了軟體相關資訊,我不想給自己
帶來麻煩,現在工作很忙,能少一點麻煩就儘量少一點吧.
    破解作者
             yzez[DFCG]
    破解工具
             ollydbg1.09漢化版,看雪論壇下載.
    破解目的
             本不為破解而破解,只因為技術而破解
    破解環境
             WINDOWS XP,這個我已經在98和XP下各做了兩次,貼圖和我這篇文章是在XP系統下完成的.
    破解過程
1.檢查了一下,該程式無殼,C++編譯,用W32DSM反彙編一堆亂碼,我倒!那就動態除錯吧!用ollydbg1.09載入程式,這次我將教
你們如何用OD下萬能斷點,過程我儘可能詳細一點,下面請看.載入程式選OD選單欄上的外掛-----命令列(快捷鍵是ALT+F1),
在彈出的視窗中輸入萬能斷點命令:bpx hmemcpy,按ENTER鍵,結果又出現一個對話方塊:
Intermodular calls
00401164 CALL DWORD PTR DS:[<&USER32.GetWindowRect>]  USER32.GetWindowRect
0040118F CALL DWORD PTR DS:[<&USER32.GetClientRect>]  USER32.GetClientRect
00401279 CALL DWORD PTR DS:[<&USER32.GetClientRect>]  USER32.GetClientRect 
004013E1 CALL DWORD PTR DS:[<&USER32.GetClientRect>]  USER32.GetClientRect
0040190A CALL DWORD PTR DS:[<&KERNEL32.GetThreadLocale>]   kernel32.GetThreadLocale
0040191C CALL DWORD PTR DS:[<&KERNEL32.GetLocaleInfoA>]    kernel32.GetLocaleInfoA
    還有很多,我就省略了,在這個框裡右鍵單擊,出現一個對話方塊,選中在每個命令中設定斷點(熱鍵是S),單擊,你看每一行
都變成了紅色吧,這表示全部設下斷點了,後面的過程很煩燥,你要一邊按F9,邊按F2把一些無用的斷點去掉,有一點耐心吧,
當然也可以不這樣做,但遇到斷點跳不過的時候,你就得按F2把這個斷點去掉.
感覺在這一點上OD比不上TRW和SICE,到出現註冊資訊框後,你要輸入註冊資訊,然後按確定,程式被斷下來,我的序列號是:
GK342QZ0C6RE03L,我輸入試驗碼:123456789098765.程式中斷在下面:

00471F71  CALL DWORD PTR DS:[<&USER32.GetWindowTex>****按確定後回到OD程式中斷在此,按F8走,在此還沒有到關鍵處!
*****************************************************注意這裡會迴圈兩次,分別處理序列號和試驗碼,按F8走
00471F77  LEA ECX,DWORD PTR DS:[EAX+1]
00471F7A  PUSH ECX
00471F7B  MOV ECX,DWORD PTR SS:[EBP+10]
00471F7E  PUSH EAX
00471F7F  CALL SuperPIM.0043E15D
00471F84  PUSH EAX                                 
00471F85  PUSH ESI                                 
00471F86  CALL DWORD PTR DS:[<&USER32.GetWindowTex>
00471F8C  MOV ECX,DWORD PTR SS:[EBP+10]
00471F8F  PUSH -1
00471F91  CALL SuperPIM.00401D6A
00471F96  JMP SHORT SuperPIM.00471FA3
00471F98  MOV EAX,DWORD PTR SS:[EBP+10]
00471F9B  PUSH DWORD PTR DS:[EAX]                  
00471F9D  PUSH ESI                                 
00471F9E  CALL SuperPIM.00470B61                  
00471FA4  POP ESI
00471FA5  POP EBP
00471FA6  RETN 0C*************************************程式第二次迴圈後最後會返回到0040FE99下面看程式碼:
----------------------------------------------------------------------------------------------------------
0040FE99  LEA EAX,DWORD PTR SS:[EBP-14]****第二次迴圈後會返回到這裡,注意這就是我們要找的關鍵地方,按F8往下!
0040FE9C  PUSH EAX
0040FE9D  CALL SuperPIM.00433D92***********這就是關鍵CALL,按F7追進,一定要進,因為演算法就在這裡面!
0040FEA2  POP ECX
0040FEA3  AND DWORD PTR SS:[EBP-4],0
0040FEA7  LEA ESI,DWORD PTR DS:[EDI+74]
0040FEAA  MOV EAX,DWORD PTR DS:[ESI]******試驗碼入EAX
0040FEAC  CMP DWORD PTR DS:[EAX-C],0******比較試驗碼輸入了嗎?
0040FEB0  JE SHORT SuperPIM.0040FF2F******沒有輸入就跳走,一跳就失敗!
0040FEB2  PUSH 28
0040FEB4  LEA EAX,DWORD PTR SS:[EBP-18]
0040FEB7  PUSH ESI
0040FEB8  PUSH EAX
0040FEB9  CALL SuperPIM.0042CEC8**********此CALL對輸入的註冊碼進行處理,得到一個40位的長字串,有興趣自己跟,
******************************************我已是頭暈的很,不想跟進!
0040FEBE  LEA ECX,DWORD PTR SS:[EBP-14]
0040FEC1  PUSH ECX
0040FEC2  PUSH EAX
0040FEC3  CALL SuperPIM.0040F9B7**********此CALL對序列號處理,也是得到一個40位的長字串
0040FEC8  MOV ECX,DWORD PTR SS:[EBP-18]
0040FECB  ADD ESP,14
0040FECE  ADD ECX,-10
0040FED1  MOV BYTE PTR SS:[EBP-D],AL
0040FED4  CALL SuperPIM.00401B5D**********此CALL進行比較,註冊碼不對,值為0
0040FED9  CMP BYTE PTR SS:[EBP-D],0*******比較是0嗎?
0040FEDD  JE SHORT SuperPIM.0040FF2F******相等就跳,跳就失敗,所以一定不能跳!
0040FEDF  PUSH 0**************************不跳往下你就成功了!下面程式碼省略!
...............................................................省略若干程式碼!.........................
=============================================================================================================
************************************關鍵CALL的程式碼!*******************************************************

00433D92  MOV     EAX, SuperPIM.0049844E****追進關鍵CALL後我們來到這裡!
00433D97  CALL    SuperPIM.00450900
00433D9C  PUSH    ECX
00433D9D  PUSH    ECX
00433D9E  AND     [LOCAL.5], 0
00433DA2  LEA     EAX, [LOCAL.5]
00433DA5  PUSH    EAX
00433DA6  CALL    SuperPIM.00433CA9********此CALL根據電腦硬體資訊得到你的序列號,有興趣跟吧!我是沒有興趣!
00433DAB  AND     [LOCAL.1], 0
00433DAF  PUSH    14
00433DB1  LEA     EAX, [LOCAL.5]
00433DB4  PUSH    EAX
00433DB5  LEA     EAX, [LOCAL.4]
00433DB8  PUSH    EAX
00433DB9  CALL    SuperPIM.0042CEC8*******演算法CALL(1),按F7跟進!
00433DBE  PUSH    28
00433DC0  LEA     EAX, [LOCAL.4]
00433DC3  PUSH    EAX
00433DC4  PUSH    [ARG.1]                          
00433DC7  MOV     BYTE PTR SS:[EBP-4], 1
00433DCB  CALL    SuperPIM.0042CEC8
00433DD0  MOV     ECX, [LOCAL.4]                   
00433DD3  ADD     ESP, 1C
00433DD6  ADD     ECX, -10
*****************************省略N行程式碼!********************************************************
0043454B   RETN
===========================================================================================================
***********************************演算法CALL!*********************************************************

0042CEC8  MOV     EAX, SuperPIM.00497B52********追進演算法CALL我們在這裡!
0042CECD  CALL    SuperPIM.00450900
0042CED2  SUB     ESP, 14
0042CED5  PUSH    EBX
0042CED6  PUSH    ESI                              
0042CED7  XOR     EBX, EBX
0042CED9  PUSH    EDI
0042CEDA  MOV     [LOCAL.8], EBX
0042CEDD  CALL    SuperPIM.004639B5
0042CEE2  MOV     EDX, DWORD PTR DS:[EAX]
0042CEE4  MOV     ECX, EAX                        
0042CEE6  CALL    DWORD PTR DS:[EDX+C]
0042CEE9  LEA     EDI, DWORD PTR DS:[EAX+10]
0042CEEC  MOV     [LOCAL.4], EDI
0042CEEF  MOV     EAX, [ARG.2]
0042CEF2  MOV     EAX, DWORD PTR DS:[EAX]*******序列號:GK342QZ0C6RE03L移入EAX
0042CEF4  MOV     ESI, DWORD PTR DS:[EAX-C]*****序列號的位數15(十六進位制值是F)送入ESI
0042CEF7  CMP     ESI, EBX**********************比較ESI和EBX,ESI的值是F即序列號位數,EBX的初始值是0
0042CEF9  MOV     [LOCAL.1], EBX
0042CEFC  MOV     [LOCAL.8], ESI                 
0042CEFF  JE      SuperPIM.0042CFB2*************相等就跳,這裡當然不相等,所以就不會跳!
0042CF05  MOV     EAX, [ARG.3]******************常數14(十進位制值是20)送入EAX
0042CF08  CMP     EAX, ESI**********************比較EAX和ESI,即14和F比較!                         
0042CF0A  MOV     [LOCAL.6], EAX               
0042CF0D  JG      SHORT SuperPIM.0042CF12*******大於就跳!
0042CF0F  MOV     [LOCAL.6], ESI              
0042CF12  CMP     [LOCAL.6], EBX****************跳到這裡!比較14和0
0042CF15  JLE     SuperPIM.0042CFB2*************小於就跳,這裡當然不會小!所以不跳!
0042CF1B  MOV     EAX, EBX**********************0移入EAX
0042CF1D  CDQ***********************************EDX清0,準備計算!
0042CF1E  IDIV    ESI***************************除,EAX/ESI ,EAX的值是0,ESI的值存放序列號的位數F                          
0042CF20  MOV     EAX, [ARG.2]******************賦EAX地址值
0042CF23  MOV     EAX, DWORD PTR DS:[EAX]*******序列號:GK342QZ0C6RE03L移入EAX
0042CF25  PUSH    EBX***************************EBX入棧
0042CF26  MOV     AL, BYTE PTR DS:[EDX+EAX]*****序列號的第一位G(ASCII碼值47)入AL
0042CF29  MOV     BYTE PTR SS:[EBP-1C], AL******儲存值47
0042CF2C  PUSH    [LOCAL.7]
0042CF2F  CALL    SuperPIM.0042CD8E*************演算法CALL(2),按F7跟進!程式碼直接在下面給出
==============================================================================================================
***************************演算法CALL(2)*****************************************************

0042CD8E  PUSH    EBP
0042CD8F  MOV     EBP, ESP
0042CD91  PUSH    ECX*************************G的ASCII碼值47入ECX
0042CD92  MOVZX   EAX, BYTE PTR SS:[EBP+8]****擴充套件成00000047
0042CD96  MOV     ECX, [ARG.2]****************賦ECX的初始值為0
0042CD99  MOV     [LOCAL.1], EAX
0042CD9C  MOV     EAX, ECX********************ECX的值移入EAX
0042CD9E  IMUL    EAX, ECX********************EAX=EAX*ECX=0*0
0042CDA1  LEA     EAX, DWORD PTR DS:[EAX+EAX*2+7]**EAX+EAX*2+7的值7給EAX
0042CDA5  IMUL    EAX, ECX********************EAX=EAX*ECX=7*0
0042CDA8  ADD     EAX, 0D*********************EAX=EAX+0D=D
0042CDAB  IMUL    EAX, ECX********************EAX=EAX*ECX=D*0=0
0042CDAE  PUSH    ESI*************************序列號位數F入棧!
0042CDAF  LEA     ESI, DWORD PTR DS:[ECX+5]
0042CDB2  PUSH    ESI
0042CDB3  MOV     [ARG.1], EAX
0042CDB6  LEA     EAX, [ARG.1]
0042CDB9  PUSH    4
0042CDBB  PUSH    EAX
0042CDBC  CALL    SuperPIM.0042CD2E***********這個CALL也在計算,我實在不想跟進!
0042CDC1  PUSH    ESI
0042CDC2  LEA     EAX, [LOCAL.1]
0042CDC5  PUSH    4
0042CDC7  PUSH    EAX
0042CDC8  CALL    SuperPIM.0042CD5E**********這個CALL也是計算CALL,煩!不跟了!
0042CDCD  MOV     EAX, [ARG.1]
0042CDD0  ADD     ESP, 18
0042CDD3  XOR     EAX, [LOCAL.1]*************這裡賦EAX的值38000002
0042CDD6  POP     ESI                             
0042CDD7  LEAVE
0042CDD8  RETN
=========================================================================演算法CALL(2)結束==================

0042CF34  POP     ECX                             
0042CF35  POP     ECX                           
0042CF36  PUSH    2B***************************常數2B入棧!
0042CF38  XOR     EDX, EDX
0042CF3A  POP     ECX**************************把常數2B賦給ECX
0042CF3B  DIV     ECX**************************除,EAX/ECX=38000002/2B=014D6535,餘數1B入EDX
0042CF3D  MOV     ECX, EDX*********************結果1B入ECX
0042CF3F  ADD     CL, 30***********************CL=CL+30=1B+30=4B(對應的字串是K)
0042CF42  CMP     CL, 39***********************比較是不是數字9
0042CF45  MOV     BYTE PTR SS:[EBP-14], CL*****儲存字串K
0042CF48  JLE     SHORT SuperPIM.0042CF55******小於就跳走!
0042CF4A  CMP     CL, 41***********************比較是不是A
0042CF4D  JGE     SHORT SuperPIM.0042CF55******大於就跳走
0042CF4F  ADD     CL, 0F6
0042CF52  MOV     BYTE PTR SS:[EBP-14], CL
0042CF55  CMP     EBX, [ARG.3]*****************跳到這裡!比較0和14
0042CF58  JGE     SHORT SuperPIM.0042CF67******大於等於就跳走!
0042CF5A  PUSH    [LOCAL.5]                       
0042CF5D  LEA     ECX, [LOCAL.4]
0042CF60  CALL    SuperPIM.00417EAF
0042CF65  JMP     SHORT SuperPIM.0042CFA5******無條件跳
0042CF67  MOV     EAX, EBX
0042CF69  CDQ
0042CF6A  IDIV    [ARG.3]
0042CF6D  MOVSX   ECX, CL
0042CF70  PUSH    2B
0042CF72  MOV     ESI, EDX
0042CF74  MOVSX   EAX, BYTE PTR DS:[ESI+EDI]
0042CF78  LEA     EAX, DWORD PTR DS:[EAX+ECU-60]
0042CF7C  CDQ
0042CF7D  POP     ECX                            
0042CF7E  IDIV    ECX
0042CF80  ADD     DL, 30
0042CF83  CMP     DL, 39
0042CF86  MOV     BYTE PTR SS:[EBP-14], DL
0042CF89  JLE     SHORT SuperPIM.0042CF96
0042CF8B  CMP     DL, 41
0042CF8E  JGE     SHORT SuperPIM.0042CF96
0042CF90  ADD     DL, 0F6
0042CF93  MOV     BYTE PTR SS:[EBP-14], DL
0042CF96  PUSH    [LOCAL.5]                      
0042CF99  LEA     ECX, [LOCAL.4]
0042CF9C  PUSH    ESI                             
0042CF9D  CALL    SuperPIM.0042CE4B
0042CFA2  MOV     ESI, [LOCAL.8]                  
0042CFA5  MOV     EDI, [LOCAL.4]***************上面跳到這裡!                  
0042CFA8  INC     EBX*************************EBX加1
0042CFA9  CMP     EBX, [LOCAL.6]**************比較1和14                  
0042CFAC  JL      SuperPIM.0042CF1B***********小於就跳,迴圈,序列號只有15位,這裡迴圈20次,取完後又從第一位取出!
************************************迴圈結束後得到的值是:K3L2LPBDW1F2H4B8S0UY這就是我們要的註冊碼!
0042CFB2  MOV     ECX, [ARG.1]
0042CFB5  LEA     EAX, [LOCAL.4]
0042CFB8  PUSH    EAX                             
0042CFB9  CALL    SuperPIM.00401F36
0042CFBE  LEA     ECX, DWORD PTR DS:[EDI-10]
0042CFC1  CALL    SuperPIM.00401B5D
0042CFC6  MOV     ECX, [LOCAL.3]
0042CFC9  MOV     EAX, [ARG.1]
0042CFCC  POP     EDI                              
0042CFCD  POP     ESI                              
0042CFCE  POP     EBX                              
0042CFCF  MOV     DWORD PTR FS:[0], ECX
0042CFD6  LEAVE
0042CFD7  RETN

     寫這篇文章的目的是想說明如何在OD下萬能斷點,演算法過程太煩瑣,就不想多跟了!希望能對大家有點啟發,如果覺得這篇
破文還行幫我頂一下吧!也是希望有更多的人能看到,對更多的人有益,我也是一隻菜鳥,請大家多多指點!
     我的序列號:GK342QZ0C6RE03L
         註冊碼:K3L2LPBDW1F2H4B8S0UY

相關文章