網路精確時鐘 2.25註冊演算法分析

看雪資料發表於2003-07-30

[破解過程]
 
詳細過程:
1、用FI2.5查殼,無殼,爽!用w32dasm反彙編,查有用資訊:"註冊成功,感謝使用!",雙擊我們來到
這裡:
00405288 51                      push ecx
:00405289 E8C6130000              call 00406654
:0040528E 83C404                  add esp, 00000004
:00405291 8D95D4FBFFFF            lea edx, dword ptr [ebp+FFFFFBD4]
:00405297 52                      push edx
:00405298 B970B84100              mov ecx, 0041B870
:0040529D E88BDFFFFF              call 0040322D--------在此CALL設斷!
:004052A2 85C0                    test eax, eax----------這是經典比較!
:004052A4 7458                    je 004052FE
:004052A6 8D85D4FBFFFF            lea eax, dword ptr [ebp+FFFFFBD4]
:004052AC 50                      push eax
:004052AD B970B84100              mov ecx, 0041B870
:004052B2 E8DCE2FFFF              call 00403593
:004052B7 85C0                    test eax, eax
:004052B9 7418                    je 004052D3
:004052BB 6A00                    push 00000000
:004052BD 6860DB4100              push 0041DB60
* Possible StringData Ref from Data Obj ->"註冊成功,感謝使用!"
                                |
:004052C2 6898664100              push 00416698-------停在此!往上找!第一個跳轉!
2、用0llydbg動態除錯,設斷在::0040529D E88BDFFFFF  call 0040322D,以下是程式程式碼:
00405289  |.  E8 C6130000   CALL    STANDARD.00406654                ; \STANDARD.00406654
0040528E  |.  83C4 04       ADD     ESP, 4
00405291  |.  8D95 D4FBFFFF LEA     EDX, [LOCAL.267]
00405297  |.  52            PUSH    EDX                    ; /Arg1 = 0068EBE4 ASCII "1234567
89"
00405298  |.  B9 70B84100   MOV     ECX, STANDARD.0041B870 ; |
0040529D  |.  E8 8BDFFFFF   CALL    STANDARD.0040322D      ; \STANDARD.0040322D--------在此CALL設斷!按F7
追進此CALL!
004052A2  |.  85C0          TEST    EAX, EAX---------------------------這是經典比較句式,所
以上面的CALL我們要追進!
004052A4  |.  74 58         JE      SHORT STANDARD.004052FE
004052A6  |.  8D85 D4FBFFFF LEA     EAX, [LOCAL.267]
004052AC  |.  50            PUSH    EAX                              ; /Arg1 = 0068EBE4 ASCI
I "123456789"
004052AD  |.  B9 70B84100   MOV     ECX, STANDARD.0041B870           ; |
004052B2  |.  E8 DCE2FFFF   CALL    STANDARD.00403593                ; \STANDARD.00403593
004052B7  |.  85C0          TEST    EAX, EAX
004052B9  |.  74 18         JE      SHORT STANDARD.004052D3
004052BB  |.  6A 00         PUSH    0                                ; /style = MB_OK|MB_APP
LMODAL
004052BD  |.  68 60DB4100   PUSH    STANDARD.0041DB60                ; |Title = "網路\xAB\
xB7時鐘"60
004052C2  |.  68 98664100   PUSH    STANDARD.00416698                ; |Text = "\xD7\xA2\xB2岢
曬\xA6\xAC\xB8行\xBB使用\xA1"
004052C7  |.  8B4D 08       MOV     ECX, [ARG.1]                     ; |
004052CA  |.  51            PUSH    ECX                              ; |hOwner = 0041B870
004052CB  |.  FF15 80424100 CALL    DWORD PTR DS:[<&USER32.MessageBo>; \MessageBoxA
004052D1  |.  EB 16         JMP     SHORT STANDARD.
                 以下是這個CALL的程式碼,追進後:
0040322D  /$  55             PUSH    EBP----停在此!
0040322E  |.  8BEC           MOV     EBP, ESP
00403230  |.  81EC DC000000  SUB     ESP, 0DC
00403236  |.  898D 24FFFFFF  MOV     [LOCAL.55], ECX                  ;  STANDARD.0041B870
0040323C  |.  6A 29          PUSH    29                               ; /Arg2 = 00000029
0040323E  |.  8D85 28FFFFFF  LEA     EAX, [LOCAL.54]                  ; |
00403244  |.  50             PUSH    EAX                              ; |Arg1 = 0068EBE4 ASCII "123456789"
00403245  |.  8B8D 24FFFFFF  MOV     ECX, [LOCAL.55]                  ; |
0040324B  |.  E8 6EFDFFFF    CALL    STANDARD.00402FBE                ; \STANDARD.00402FBE
00403250  |.  85C0           TEST    EAX, EAX
00403252  |.  75 04          JNZ     SHORT STANDARD.00403258
00403254  |.  33C0           XOR     EAX, EAX
00403256  |.  EB 43          JMP     SHORT STANDARD.0040329B
00403258  |>  8D8D 54FFFFFF  LEA     ECX, [LOCAL.43]
0040325E  |.  51             PUSH    ECX                              ; /Arg2 = 0041B870 ASC
II "`CA"
0040325F  |.  8D95 28FFFFFF  LEA     EDX, [LOCAL.54]                  ; |
00403265  |.  52             PUSH    EDX                              ; |Arg1 = 0068EBE4 ASCI
I "123456789"
00403266  |.  8B8D 24FFFFFF  MOV     ECX, [LOCAL.55]                  ; |
0040326C  |.  E8 CA010000    CALL    STANDARD.0040343B                ; \STANDARD.0040343B---演算法CALL1,按F7追進此CALL!
00403271  |.  8B45 08        MOV     EAX, [ARG.1]
00403274  |.  50             PUSH    EAX                              ; /Arg1 = 0068EBE4 ASC
II "123456789"
00403275  |.  E8 DA330000    CALL    STANDARD.00406654                ; \STANDARD.00406654
0040327A  |.  83C4 04        ADD     ESP, 4
0040327D  |.  8D8D 54FFFFFF  LEA     ECX, [LOCAL.43]
00403283  |.  51             PUSH    ECX                              ; /String2 = "`CA"
00403284  |.  8B55 08        MOV     EDX, [ARG.1]                     ; |
00403287  |.  52             PUSH    EDX                              ; |String1 = "12345678
9"
00403288  |.  FF15 B8404100  CALL    DWORD PTR DS:[<&KERNEL32.lstrcmp>; \lstrcmpA
0040328E  |.  85C0           TEST    EAX, EAX
00403290  |.  75 07          JNZ     SHORT STANDARD.00403299
                  以下是演算法CALL1的程式碼,追進後:
0040343B  /$  55             PUSH    EBP--追進後,停在此!
0040343C  |.  8BEC           MOV     EBP, ESP
0040343E  |.  81EC E8000000  SUB     ESP, 0E8
00403444  |.  56             PUSH    ESI
00403445  |.  57             PUSH    EDI
00403446  |.  898D 18FFFFFF  MOV     [LOCAL.58], ECX
0040344C  |.  A1 94624100    MOV     EAX, DWORD PTR DS:[416294]
00403451  |.  8985 1CFFFFFF  MOV     [LOCAL.57], EAX
00403457  |.  8B0D 98624100  MOV     ECX, DWORD PTR DS:[416298]
0040345D  |.  898D 20FFFFFF  MOV     [LOCAL.56], ECX
00403463  |.  8A15 9C624100  MOV     DL, BYTE PTR DS:[41629C]
00403469  |.  8895 24FFFFFF  MOV     BYTE PTR SS:[EBP-DC], DL
0040346F  |.  8B85 1CFFFFFF  MOV     EAX, [LOCAL.57]
00403475  |.  8985 40FFFFFF  MOV     [LOCAL.48], EAX
0040347B  |.  8B8D 20FFFFFF  MOV     ECX, [LOCAL.56]
00403481  |.  898D 44FFFFFF  MOV     [LOCAL.47], ECX
00403487  |.  C745 FC 000000>MOV     [LOCAL.1], 0
0040348E  |.  837D 08 00     CMP     [ARG.1], 0
00403492  |.  75 07          JNZ     SHORT STANDARD.0040349B
00403494  |.  33C0           XOR     EAX, EAX
00403496  |.  E9 F0000000    JMP     STANDARD.0040358B
0040349B  |>  68 AB000000    PUSH    0AB
004034A0  |.  6A 00          PUSH    0
004034A2  |.  8D95 50FFFFFF  LEA     EDX, [LOCAL.44]
004034A8  |.  52             PUSH    EDX
004034A9  |.  E8 22730000    CALL    STANDARD.0040A7D0
004034AE  |.  83C4 0C        ADD     ESP, 0C
004034B1  |.  C785 3CFFFFFF >MOV     [LOCAL.49], 0
004034BB  |.  EB 0F          JMP     SHORT STANDARD.004034CC
004034BD  |>  8B85 3CFFFFFF  /MOV     EAX, [LOCAL.49]------這裡開始計算註冊碼!
004034C3  |.  83C0 04        |ADD     EAX, 4--------------- EAX=EAX+4,這說明每次取四位機器碼進行計算!
004034C6  |.  8985 3CFFFFFF  |MOV     [LOCAL.49], EAX
004034CC  |>  83BD 3CFFFFFF > CMP     [LOCAL.49], 28-------與40比較,28的十進位制值就是40,因
為機器碼是40位!
004034D3  |.  0F8D 82000000  |JGE     STANDARD.0040355B----大於等於就轉移!當然沒取完就得繼續
!
004034D9  |.  8B4D 08        |MOV     ECX, [ARG.1]---------把機器碼送ECX!我的機器碼是:"{2181
533-91212-94319-592381135-11335993}"
004034DC  |.  038D 3CFFFFFF  |ADD     ECX, [LOCAL.49]
004034E2  |.  8B11           |MOV     EDX, DWORD PTR DS:[ECX]----取機器碼計算!並經過轉換!
004034E4  |.  8955 FC        |MOV     [LOCAL.1], EDX--------取機器碼的第一組前四位:{218,經
過轉換為:3831327B!轉換是這樣的:取各位的ASCII碼,{為7B,2為32,1為31,8為38,然後從最後一位開始
,把它們組合起來就是:3831327B!
004034E7  |.  8B45 FC        |MOV     EAX, [LOCAL.1]--------把機器碼送EAX!EAX為3831327B
004034EA  |.  33C9           |XOR     ECX, ECX--------------ECX清零!
004034EC  |.  8B95 44FFFFFF  |MOV     EDX, [LOCAL.47]-------把常數:6B636F6C送EDX!這個常數是
參與計算註冊碼的!
004034F2  |.  52             |PUSH    EDX-------------------EDX入棧!
004034F3  |.  8B95 40FFFFFF  |MOV     EDX, [LOCAL.48]-------把常數:6374656E送EDX!這個常數也
是參與計算註冊碼的!
004034F9  |.  52             |PUSH    EDX-------------------常數:6374656E也入棧!
004034FA  |.  51             |PUSH    ECX
004034FB  |.  50             |PUSH    EAX
004034FC  |.  E8 8F770000    |CALL    STANDARD.0040AC90----演算法CALL2,要追進!
00403501  |.  81CA 00000040  |OR      EDX, 40000000--------EDX或40000000=0E0A33F7 OR 4000000
0=4E0A33F7,這一步我們設為演算法3
00403507  |.  8985 48FFFFFF  |MOV     [LOCAL.46], EAX------把EAX送入[LOCAL.46]=FECA37DA
0040350D  |.  8995 4CFFFFFF  |MOV     [LOCAL.45], EDX------把EDX送入[LOCAL.45]=4E0A33F7
00403513  |.  8D85 28FFFFFF  |LEA     EAX, [LOCAL.54]
00403519  |.  50             |PUSH    EAX                             ; /Arg3 = 0068EA34
0040351A  |.  8B8D 4CFFFFFF  |MOV     ECX, [LOCAL.45]                 ; |
00403520  |.  51             |PUSH    ECX                             ; |Arg2 = 00000000
00403521  |.  8B95 48FFFFFF  |MOV     EDX, [LOCAL.46]                 ; |
00403527  |.  52             |PUSH    EDX                             ; |Arg1 = 00000000
00403528  |.  E8 74FDFFFF    |CALL    STANDARD.004032A1               ; \STANDARD.004032A1--
-此CALL把[LOCAL.45]和[LOCAL.46]的值連線起來組成第一組註冊碼,注意字母大寫轉換成小寫:4e0a33f
7feca37da
0040352D  |.  83C4 0C        |ADD     ESP, 0C
00403530  |.  8D85 28FFFFFF  |LEA     EAX, [LOCAL.54]
00403536  |.  50             |PUSH    EAX                             ; /StringToAdd = ""
00403537  |.  8D8D 50FFFFFF  |LEA     ECX, [LOCAL.44]                 ; |
0040353D  |.  51             |PUSH    ECX                             ; |ConcatString = NULL
0040353E  |.  FF15 9C404100  |CALL    DWORD PTR DS:[<&KERNEL32.lstrca>; \lstrcatA
00403544  |.  68 A0624100    |PUSH    STANDARD.004162A0               ; /StringToAdd = " "
00403549  |.  8D95 50FFFFFF  |LEA     EDX, [LOCAL.44]                 ; |
0040354F  |.  52             |PUSH    EDX                             ; |ConcatString = NULL
00403550  |.  FF15 9C404100  |CALL    DWORD PTR DS:[<&KERNEL32.lstrca>; \lstrcatA
00403556  |.^ E9 62FFFFFF    \JMP     STANDARD.004034BD------跳回繼續!直至機器碼取完為止!
0040355B  |>  C785 3CFFFFFF >MOV     [LOCAL.49], 0A9
00403565  |.  8B85 3CFFFFFF  MOV     EAX, [LOCAL.49]
0040356B  |.  C68405 50FFFFF>MOV     BYTE PTR SS:[EBP+EAX-B0], 0
00403573  |.  B9 2A000000    MOV     ECX, 2A
00403578  |.  8DB5 50FFFFFF  LEA     ESI, [LOCAL.44]
0040357E  |.  8B7D 0C        MOV     EDI, [ARG.2]
00403581  |.  F3:A5          REP     MOVS DWORD PTR ES:[EDI], DWORD P>
00403583  |.  66:A5          MOVS    WORD PTR ES:[EDI], WORD PTR DS:[>
00403585  |.  A4             MOVS    BYTE PTR ES:[EDI], BYTE PTR DS:[>
00403586  |.  B8 01000000    MOV     EAX, 1
0040358B  |>  5F             POP     EDI                              ;  0068F018
0040358C  |.  5E             POP     ESI                              ;  0068F018
0040358D  |.  8BE5           MOV     ESP, EBP
0040358F  |.  5D             POP     EBP                              ;  0068F018
00403590  \.  C2 0800        RETN    8
                       以下是演算法CALL2的程式碼,追進後:
0040AC90  /$  8B4424 08     MOV     EAX, DWORD PTR SS:[ESP+8]----  EAX清零!
0040AC94  |.  8B4C24 10     MOV     ECX, DWORD PTR SS:[ESP+10]---把常數6B636FC送入ECX
0040AC98  |.  0BC8          OR      ECX, EAX----ECX或EAX,ECX為6B636FC!
0040AC9A  |.  8B4C24 0C     MOV     ECX, DWORD PTR SS:[ESP+C]----把常數6374656E移入ECX
0040AC9E  |.  75 09         JNZ     SHORT STANDARD.0040ACA9------不等則跳!
0040ACA0  |.  8B4424 04     MOV     EAX, DWORD PTR SS:[ESP+4]        ;  STANDARD.00403501
0040ACA4  |.  F7E1          MUL     ECX
0040ACA6  |.  C2 1000       RETN    10
0040ACA9  |>  53            PUSH    EBX-------跳到此處!
0040ACAA  |.  F7E1          MUL     ECX----ECX=ECX*1=6374656E*1=6374656E
0040ACAC  |.  8BD8          MOV     EBX, EAX---------EBX清零!
0040ACAE  |.  8B4424 08     MOV     EAX, DWORD PTR SS:[ESP+8]---把第一組機器碼送入EAX:38313
27B
0040ACB2  |.  F76424 14     MUL     DWORD PTR SS:[ESP+14]---6B636FC*3831327B=F835A0E4 r 1792
6394,高位送入EAX,低位送入EDX,故EAX的值為:F835A0E4;EDX的值為:17926394!
0040ACB6  |.  03D8          ADD     EBX, EAX-------EBX=EBX+EAX=F835A0E4+0=F835A0E4
0040ACB8  |.  8B4424 08     MOV     EAX, DWORD PTR SS:[ESP+8]-----把3831327B送入EAX
0040ACBC  |.  F7E1          MUL     ECX----------ECX=ECX*3831327B=6374656E*3831327B=FECA37DA r 15D49
313,高位送入EAX,低位送入EDX,故EAX的值變為:FECA37DA;EDX的值為:15D49313!
0040ACBE  |.  03D3          ADD     EDX, EBX-----EDX=EBX+EDX=F835A0E4+15D49313=0E0A33F7,EDX的值參與第3步的運算!
0040ACC0  |.  5B            POP     EBX                              ;  0068F064
----------------------------------------------------------
演算法基本搞清楚,下面進行總結:
1、每次取機器碼的四位進行計算,如我的機器碼是:{2181533-91212-94319-592381135-11335993}
第1次四位是:{218;第2次四位是:1533;第3次四位是:-912;第4次四位是:12-9
第5次四位是:4319;第6次四位是:-592;第7次四位是:3811;第8次四位是:35-1
第9次四位是:1335 第10次四位是:993}。然後對取出的四位機器碼進行轉換,轉換是這樣的:先取每位機器碼的ASCII碼,然後從最
後一位開始把它組合起來形成一組新值,這組新值參與計算註冊碼!如:第1次四位是:{218,取各位的ASCII碼為:{為7B,2為32,1為
31,8為38,把它們組合起來是:3831327B!第10次四位是:993},取各位的ASCII碼為:9為39,9為39,3為33,}為7D,把它們組合起來就
是:7D333939。
2、第二步運算是:把四位機器碼的新值與兩個常數:6B636F6C和6374656E進行計算形成16位一組的註冊碼,故註冊碼是160位,又長又
臭。前8位的註冊碼(我們假定是A,機器碼的轉換值我們假定為C),它的計算是這樣的:A=(6B636F6C*C的高8位+6374656E*C的低8位) OR
40000000,如第一組的前8位計算是:A=(6B636F6C*3831327B的高8位+6374656E*3831327B的低8位) OR 40000000=(F835A0E4+15D49313)
OR 40000000=0E0A33F7 OR 40000000=4E0A33F7,最後一組註冊碼的計算:A=(6B636F6C*7D333939的高8位+6374656E*7D333939的低8位)
OR 40000000=(FB76DB0C+30A3BBF1) OR 40000000=2C1A96FD OR 40000000=6C1A96FD;
 後8位的註冊碼(我們假定是B),B=6374656E*C的高8位。如第一組的後8位:B=6374656E*3831327B的高8位=FECA37DA;
最後一組的後8位:B=6374656E*7D333939的高8位=FA6A137E,把A、B組合起來構成一組16位的註冊碼,注意大寫字母轉換成小寫字母;
即每組註冊碼由AB構成,如我的第一組註冊碼就是:4e0a33f7feca37da;我的最後一組註冊碼就是:6c1a96fdfa6a137e.每組註冊碼之間
空一格。
 
破解小結:
這個軟體破解是非常容易的,是明碼!但研究它的演算法卻費了我不少時間,搞清楚它的演算法,對我等菜鳥來說,很有幫助!


相關文章