• 标 题:网络精确时钟 2.25注册算法分析
  • 作 者:txm123
  • 时 间:2003/07/30 08:43pm
  • 链 接:http://bbs.pediy.com

[破解过程]
 
详细过程:
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.每组注册码之间
空一格。
 
破解小结:
这个软件破解是非常容易的,是明码!但研究它的算法却费了我不少时间,搞清楚它的算法,对我等菜鸟来说,很有帮助!