Nok2phone的註冊演算法與網路校驗解除---VB程式關鍵處的快速定位

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

這個軟體是一個網友在DFCG論壇要求破解的,他的原貼如:這是一款可以把MID轉換為手機編輯
鍵譜的工具,我自己試著破解過但終不得法,所以還沒能這個能力破解,希望有哪位好人幫我得到註冊碼,並教我如何破解,小弟在這裡先謝過了!
下載地址是:
http://www.hkpcug.org/personal/leoto/n2p_setup/Setup.EXE 
破解作者: yzez[DFCG]
破解工具: peid0.8漢化版、UPXUnpack、OLLYDBG1.09B
破解目的: 本不為破解而破解,只因為技術而破解!

    破解過程:
1、用peid0.8檢查是UPX的殼,用UPXUnpack輕鬆脫殼,脫殼後的程式可以正常執行,不需要修復輸入表,是VB
程式,用OLLYDBG1.09B載入程式,用:vbastrcomp設定斷點,按F9讓程式執行,這個過程中要按幾次F9,才會出
現註冊視窗,出現註冊視窗後輸入註冊資訊,使用者名稱:yzez[DFCG],註冊碼:12345678,下面的重點是VB程式的關
鍵處的快速定位,這不是一個萬能方法,破無常法,這裡僅供參考,具體過程往下看:

66024722 >  CMP     DWORD PTR SS:[ESP+4], 2****用vbastrcomp設定斷點,中斷與此,按F9執行!
66024727    JE      MSVBVM60.660470E0
6602472D    PUSH    30001
66024732    PUSH    DWORD PTR SS:[ESP+8]             
66024736    PUSH    DWORD PTR SS:[ESP+10]
6602473A    PUSH    DWORD PTR SS:[ESP+18]
6602473E    CALL    DWORD PTR DS:[6610FE74]****追進此CALL,可以快速到達註冊演算法的核心處,按F7跟進!
66024744    TEST    EAXEAX
66024746    JL      MSVBVM60.660470E7
6602474C    DEC     EAX
6602474D    RETN    0C
 
===================================================================================================
6602473E    CALL    DWORD PTR DS:[6610FE74]此CALL追進後來到這裡,這是一個過渡,不是重點,直接按F8
快速透過:
7716C0CF >  PUSH    EBP
7716C0D0    MOV     EBPESP
7716C0D2    SUB     ESP, 18
7716C0D5    MOV     EAXDWORD PTR SS:[EBP+8]
7716C0D8    PUSH    EAX
7716C0D9    CALL    OLEAUT32.77168DE7
7716C0DE    ADD     ESP, 4
7716C0E1    MOV     DWORD PTR SS:[EBP-8], EAX
7716C0E4    MOV     ECXDWORD PTR SS:[EBP+C]
7716C0E7    PUSH    ECX
7716C0E8    CALL    OLEAUT32.77168DE7
7716C0ED    ADD     ESP, 4
   這個CALL結束後會跳回到:66024722 >  CMP     DWORD PTR SS:[ESP+4]這個比較的上面一行,按一次F8就可以
直接來到關鍵處。
************************以下是關鍵程式碼!*****************************************************************

004B82AD   .  TEST    EAXEAX*********************進入關鍵處後停在這裡!
004B82AF   .  JE      yzez.004B87D3****************下面有很長一段,搞什麼飛機?網路校驗你懂不懂?
004B82B5   .  MOV     EAXDWORD PTR SS:[EBP-28]
004B82B8   .  TEST    EAXEAX
004B82BA   .  JE      yzez.004B87D3
004B82C0   .  PUSH    yzez.004124D8**** "http://members.hknet.com/~leoto/nok2phone/n2p_reg/"(這是註冊的主頁)
004B82C5   .  MOV     ECXDWORD PTR SS:[EBP-24]
004B82C8   .  PUSH    ECX
004B82C9   .  CALL    EBX                              
004B82CB   .  MOV     EDXEAX*******把“http://members.hknet.com/~leoto/nok2phone/n2p_reg/yzez[DFCG]"你的注
*****************冊使用者名稱移入EDX,準備網路校驗!
004B82CD   .  LEA     ECXDWORD PTR SS:[EBP-2C]
004B82D0   .  CALL    EDI                             
004B82D2   .  PUSH    EAX
004B82D3   .  PUSH    yzez.00412544                    ;  UNICODE ".txt"
004B82D8   .  CALL    EBX                              ;  MSVBVM60.__vbaStrCat
004B82DA   .  MOV     DWORD PTR SS:[EBP-78], EAX** "http://members.hknet.com/~leoto/nok2phone/n2p_reg/yzez[DFCG].txt"
*************這是你在對方主機上的註冊資訊的存放處,你有交註冊費嗎?
004B82DD   .  MOV     ECX, 8
004B82E2   .  MOV     DWORD PTR SS:[EBP-80], ECX
004B82E5   .  MOV     DWORD PTR SS:[EBP-108], 0
004B82EF   .  MOV     DWORD PTR SS:[EBP-110], 3
004B82F9   .  SUB     ESP, 10
004B82FC   .  MOV     EDXESP
*************省略若干程式碼!********************************************************************************************
004B8347   .  PUSH    EAX
004B8348   .  LEA     EDXDWORD PTR SS:[EBP-68]
004B834B   .  PUSH    EDX
004B834C   .  CALL    DWORD PTR DS:[<&MSVBVM60.__vbaOb>;  MSVBVM60.__vbaObjSet
004B8352   .  PUSH    EAX
004B8353   .  LEA     EAXDWORD PTR SS:[EBP-90]
004B8359   .  PUSH    EAX
004B835A   .  CALL    DWORD PTR DS:[<&MSVBVM60.__vbaLa>******此CALL進行一次網路校驗,如果你交了註冊費用,對方主機上
*************就會有你的資訊,有你的資訊,這裡返回EAX的值為0,否則EAX的值為1
004B8360   .  ADD     ESP, 30
004B8363   .  PUSH    EAX
004B8364   .  CALL    DWORD PTR DS:[<&MSVBVM60.__vbaSt>;  MSVBVM60.__vbaStrVarMove
004B836A   .  MOV     EDXEAX
004B836C   .  LEA     ECXDWORD PTR SS:[EBP-20]
004B836F   .  CALL    EDI                              ;  MSVBVM60.__vbaStrMove
004B8371   .  LEA     ECXDWORD PTR SS:[EBP-2C]
*************再次省略若干程式碼!VB的程式真是又長又臭呀!**********************************************************
004B83C1   .  CALL    DWORD PTR DS:[<&MSVBVM60.__vbaFr>
004B83C7   .  MOV     EAXDWORD PTR SS:[EBP+8]
004B83CA   .  MOV     EDXDWORD PTR DS:[EAX]
004B83CC   .  LEA     ECXDWORD PTR SS:[EBP-144]
004B83D2   .  PUSH    ECX
004B83D3   .  MOV     ECXDWORD PTR SS:[EBP-24]
004B83D6   .  PUSH    ECX
004B83D7   .  PUSH    EAX
004B83D8   .  CALL    DWORD PTR DS:[EDX+73C]****你一定會來到這裡,到這裡停!演算法CALL,一定要按F7追進!
004B83DE   .  MOV     EDXDWORD PTR SS:[EBP-20]
004B83E1   .  PUSH    EDX
004B83E2   .  PUSH    yzez.00411B8C                    ;  UNICODE "Nok2Phone"
004B83E7   .  CALL    DWORD PTR DS:[<&MSVBVM60.__vbaSt>;  MSVBVM60.__vbaStrCmp*****再一次比較校驗!
004B83ED   .  NEG     EAX
004B83EF   .  SBB     EAXEAX
004B83F1   .  NEG     EAX
004B83F3   .  XOR     ECXECX
004B83F5   .  MOV     EDXDWORD PTR SS:[EBP-28]********輸入的試驗碼的十六進值入EDX,這裡是:BC614E(12345678)
004B83F8   .  CMP     EDXDWORD PTR SS:[EBP-144]*******比較兩者是否相等或者是否為0,SS:[EBP-144]存放的數值是:
******************2ACEED6B,就是上述對使用者名稱計算後的值。
004B83FE   .  SETNE   CL********************************不相等置CL的值為1,相等置CL的值為0
004B8401   .  OR      EAXECX**************************EAX與ECX相或,EAX的值是多少,就是網路校驗返回的值,
**************************如果透過網路校驗返回值是0,否則EAX的值是1,這裡當然是1,因為你沒有交錢!
004B8403   .  JNZ      yzez.004B8921********************不相等就跳,這裡一定不能跳,要解除它的網路驗證,就在
*****************這裡動手吧!把JNZ改成JE!把”0F85“改成”0F84“。修改後即使有網路驗證,你也會註冊成功!
004B8409   .  MOV     EAXDWORD PTR DS:[4CD91C]********不跳就往下。
004B840E   .  TEST    EAXEAX
004B8410   .  JNZ     SHORT yzez.004B8422
004B8412   .  PUSH    yzez.004CD91C
****************省略一部分無關程式碼!************************************************************************
004B86C4   .  PUSH    EAX
004B86C5   .  LEA     EAXDWORD PTR SS:[EBP-110]
004B86CB   .  PUSH    EAX
004B86CC   .  LEA     ECXDWORD PTR SS:[EBP-A0]
004B86D2   .  PUSH    ECX
004B86D3   .  CALL    ESI                             
004B86D5   .  PUSH    EAX
004B86D6   .  LEA     EDXDWORD PTR SS:[EBP-B0]
004B86DC   .  PUSH    EDX
004B86DD   .  LEA     EAXDWORD PTR SS:[EBP-C0]
004B86E3   .  PUSH    EAX
004B86E4   .  CALL    ESI                              
004B86E6   .  PUSH    EAX
004B86E7   .  CALL    DWORD PTR DS:[<&MSVBVM60.#595>]***********你能來到這裡你就可以大笑了!因為你的錢不用往外拿
****************************************************************了!註冊成功!

*****************省略若干程式碼!******************************************************************************
004B891A   .  CALL    EDI                              ;  MSVBVM60.__vbaStrMove
004B891C   .  JMP     yzez.004B8A54
004B8921   >  MOV     EAXDWORD PTR DS:[4CD91C]********上面如果不相等就跳到這裡!往下走!
004B8926   .  TEST    EAXEAX
********************再次省略一大段程式碼!**********************************************************************
004B8AC4   .  PUSH    ECX
004B8AC5   .  PUSH    10
004B8AC7   .  LEA     EDXDWORD PTR SS:[EBP-80]
004B8ACA   .  PUSH    EDX
004B8ACB   .  CALL    DWORD PTR DS:[<&MSVBVM60.#595>]*******到了這裡兄弟留下買路錢吧!註冊失敗!
004B8AD1   .  LEA     EAXDWORD PTR SS:[EBP-50]
******************又是省略!*********************************************************************************
004B8BDF   .  C3            RETN

=============================================================================================================
演算法CALL:004B83D8 CALL  DWORD PTR DS:[EDX+73C],追進後我們來到這裡:

00444DC0    PUSH    EBP
00444DC1    MOV     EBPESP
00444DC3    SUB     ESP, 14
00444DC6    PUSH    <JMP.&MSVBVM60.__vbaExceptHandle>
00444DCB    MOV     EAXDWORD PTR FS:[0]
00444DD1    PUSH    EAX
00444DD2    MOV     DWORD PTR FS:[0], ESP
00444DD9    SUB     ESP, 44
00444DDC    PUSH    EBX                              
00444DDD    PUSH    ESI                             
00444DDE    PUSH    EDI                              
00444DDF    MOV     DWORD PTR SS:[EBP-14], ESP
00444DE2    MOV     DWORD PTR SS:[EBP-10], yzez.0040>
00444DE9    XOR     EDIEDI                         
00444DEB    MOV     DWORD PTR SS:[EBP-C], EDI        
00444DEE    MOV     DWORD PTR SS:[EBP-8], EDI        
00444DF1    MOV     DWORD PTR SS:[EBP-28], EDI       
00444DF4    MOV     DWORD PTR SS:[EBP-30], EDI       
00444DF7    MOV     DWORD PTR SS:[EBP-40], EDI       
00444DFA    MOV     EDXDWORD PTR SS:[EBP+C]************使用者名稱移入EDX中
00444DFD    LEA     ECXDWORD PTR SS:[EBP-28]
00444E00    CALL    DWORD PTR DS:[<&MSVBVM60.__vbaSt>
00444E06    PUSH    1
00444E08    CALL    DWORD PTR DS:[<&MSVBVM60.__vbaOn>
00444E0E    MOV     ESI, 1******************************把1移入ESI,ESI做計數器!
00444E13    MOV     EAXDWORD PTR SS:[EBP-28]**********使用者名稱移入EAX中
00444E16    PUSH    EAX*********************************EAX入棧,即使用者名稱入棧!
00444E17    PUSH    EDI*********************************EDI入棧,EDI的初始值是:0                              
00444E18    CALL    DWORD PTR DS:[<&MSVBVM60.__vbaSt>***此CALL又跳回到中斷處,不管,按F8就行!又一次校驗!
00444E1E    TEST    EAXEAX****************************返回EAX的值為1,因為你沒有交錢!
00444E20    JE      yzez.00444EC1
00444E26    MOV     EBXDWORD PTR DS:[<&MSVBVM60.#5>
00444E2C    MOV     DWORD PTR SS:[EBP-38], 1
00444E33    MOV     DWORD PTR SS:[EBP-40], 2
00444E3A    LEA     ECXDWORD PTR SS:[EBP-40]
00444E3D    PUSH    ECX
00444E3E    MOVSX   EDXSI
00444E41    PUSH    EDX                             
00444E42    MOV     EAXDWORD PTR SS:[EBP-28]
00444E45    PUSH    EAX
00444E46    CALL    DWORD PTR DS:[<&MSVBVM60.#631>]  
00444E4C    MOV     EDXEAX
00444E4E    LEA     ECXDWORD PTR SS:[EBP-30]
00444E51    CALL    DWORD PTR DS:[<&MSVBVM60.__vbaSt>
00444E57    PUSH    EAX
00444E58    CALL    EBX                              
00444E5A    MOVSX   ECXAX*****************************取使用者名稱的第一位的ASCII碼值,第一位使用者名稱是:y
****************************ASCII碼值是:79,79送入ECX中!
00444E5D    ADD     ECXEDI****************************ECX=ECX+EDI=79+0=79                        
00444E5F    JO      yzez.00444F0F***********************溢位轉移!
00444E65    MOV     EDIECX****************************ECX的值:79移入EDI中
00444E67    LEA     ECXDWORD PTR SS:[EBP-30]
00444E6A    CALL    DWORD PTR DS:[<&MSVBVM60.__vbaFr>
00444E70    LEA     ECXDWORD PTR SS:[EBP-40]
00444E73    CALL    DWORD PTR DS:[<&MSVBVM60.__vbaFr>
00444E79    ADD     SI, 1******************************SI=SI+1=1+1=2,小學數學!
00444E7D    JO      yzez.00444F0F**********************溢位轉移!
00444E83    MOV     EDXDWORD PTR SS:[EBP-28]
00444E86    PUSH    EDX                              
00444E87    CALL    DWORD PTR DS:[<&MSVBVM60.__vbaLe>
00444E8D    MOVSX   ECXSI
00444E90    CMP     ECXEAX***************************比較ECX與EAX的值,EAX的值是使用者名稱的位數,這裡是
*****************************10位,故EAX的值是:0A
00444E92  ^ JLE     SHORT yzez.00444E2C****************小於等於就跳回,形成迴圈,迴圈次數取決於輸入的用
***************戶名的位數,這個迴圈的作用是取使用者名稱的每一位ASCII碼值,然後把它們相加,我輸入的使用者名稱
***************計算後的最終結果是:39E!,這個結果被儲存在EDI中!
00444E94    ADD     EDI, 0AD****************************EDI=EDI+0AD=39E+0AD=0000044B
00444E9A    JO      SHORT yzez.00444F0F**********************溢位轉移!
00444E9C    IMUL    EDIEDI, 7*************************EDI=EDI*7=44B*7=00001E0D                     
00444E9F    JO      SHORT yzez.00444F0F**********************溢位轉移!
00444EA1    SUB     EDI, 180****************************EDI=EDI-180=1E0D-180=00001C8D
00444EA7    JO      SHORT yzez.00444F0F**********************溢位轉移!
00444EA9    IMUL    EDIEDI, 17FD7*************************EDI=EDI*17FD7=1C8D*17FD7=2ACEED6B                  
00444EAF    JO      SHORT yzez.00444F0F**********************溢位轉移!
00444EB1    MOV     DWORD PTR SS:[EBP-24], EDI***************把上述計算的值儲存到:SS:[EBP-24]       
00444EB4    CALL    DWORD PTR DS:[<&MSVBVM60.__vbaEx>
00444EBA    PUSH    yzez.00444EF2
00444EBF    JMP     SHORT yzez.00444EE8
00444EC1    MOV     DWORD PTR SS:[EBP-24], 3B9AC9FF
00444EC8    CALL    DWORD PTR DS:[<&MSVBVM60.__vbaEx>
00444ECE    PUSH    yzez.00444EF2
00444ED3    JMP     SHORT yzez.00444EE8
00444ED5    LEA     ECXDWORD PTR SS:[EBP-30]
00444ED8    CALL    DWORD PTR DS:[<&MSVBVM60.__vbaFr>
00444EDE    LEA     ECXDWORD PTR SS:[EBP-40]
00444EE1    CALL    DWORD PTR DS:[<&MSVBVM60.__vbaFr>
00444EE7    RETN******************************************返回!這個子程式結束!

2、演算法小結:
  設使用者名稱的每一位的ASCII碼相加的值是X,則註冊碼SN是:
  SN=[(x+0AD)*7-180]*17FD7的結果的十進位制值。
3、驗證演算法:使用者名稱:yzez[DFCG]
   X=79+7A+65+7A+5B+44+46+43+47+5D=39E
   SN=[(39E+0AD)*7-180]*17FD7=2ACEED6B,十進位制值為:718204267,這就是我們要的註冊碼。
  一個可用的註冊碼:使用者名稱:yzez[DFCG],註冊碼:718204267
4、解除網路驗證,因為這個程式有幾處涉及到網路驗證,所以直接修改跳過驗證,並不太現實,所以我們可以在:
004B8403   .  JNZ      yzez.004B8921處直接修改,改後即使有網路驗證,也會註冊成功!

相關文章