【文章标题】: atani V3.71算法分析
【文章作者】: OCNZHAO[OCN]
【作者邮箱】: ocnzhao@163.com
【软件名称】: atani V3.71
【软件大小】: 1.2M
【下载地址】: 华军软件园
【加壳方式】: 无
【保护方式】: 序列号
【使用工具】: OD,PEID V0.94
【软件介绍】:  动画GIF制作软件,制作动画只需五个步骤。你可以使
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
  
    关键的注册代码的定位比较简单,我们主要看一下算法,算法不是很复杂,高手略过。本想写个注册机,写了几下
  发现超出我的能力了,等学会C再补吧!大体的跟了一下,注释大多是后面加上的。
  00456808  /.  55                push    ebp
  00456809  |.  8BEC              mov     ebp, esp
  0045680B  |.  83C4 8C           add     esp, -74
  0045680E  |.  53                push    ebx
  0045680F  |.  56                push    esi
  00456810  |.  57                push    edi
  00456811  |.  8BF0              mov     esi, eax
  00456813  |.  B8 387D5F00       mov     eax, 005F7D38
  00456818  |.  E8 6F381700       call    005CA08C
  0045681D  |.  66:C745 B4 0800   mov     word ptr [ebp-4C], 8
  00456823  |.  8B15 383E6200     mov     edx, [623E38]            ;  atani.00624A20
  00456829  |.  8B0A              mov     ecx, [edx]
  0045682B  |.  B2 01             mov     dl, 1
  0045682D  |.  A1 E4A66000       mov     eax, [60A6E4]
  00456832  |.  E8 A50B0800       call    004D73DC
  00456837  |.  8BD8              mov     ebx, eax
  00456839  |.  895D FC           mov     [ebp-4], ebx
  0045683C  |.  8BC3              mov     eax, ebx
  0045683E  |.  FF45 C0           inc     dword ptr [ebp-40]
  00456841  |.  66:C745 B4 1400   mov     word ptr [ebp-4C], 14
  00456847  |.  8B10              mov     edx, [eax]
  00456849  |.  FF92 D8000000     call    [edx+D8]
  0045684F  |.  48                dec     eax
  00456850  |.  0F85 68030000     jnz     00456BBE
  00456856  |.  68 3B1B5F00       push    005F1B3B                 ; /EventName = ""
  0045685B  |.  6A 00             push    0                        ; |InitiallySignaled = FALSE
  0045685D  |.  6A 01             push    1                        ; |ManualReset = TRUE
  0045685F  |.  6A 00             push    0                        ; |pSecurity = NULL
  00456861  |.  E8 BA291900       call    <jmp.&KERNEL32.CreateEve>; \CreateEventA
  00456866  |.  8BF8              mov     edi, eax
  00456868  |.  68 E8030000       push    3E8                      ; /Timeout = 1000. ms
  0045686D  |.  57                push    edi                      ; |hObject
  0045686E  |.  E8 4D2C1900       call    <jmp.&KERNEL32.WaitForSi>; \WaitForSingleObject
  00456873  |.  3D 02010000       cmp     eax, 102
  00456878  |.  0F85 40030000     jnz     00456BBE
  0045687E  |.  33D2              xor     edx, edx
  00456880  |.  8B86 CC040000     mov     eax, [esi+4CC]
  00456886  |.  E8 F9BC1000       call    00562584
  0045688B  |.  56                push    esi                      ; /Arg1
  0045688C  |.  E8 EB030000       call    00456C7C                 ; 跟进此CALL***************************
  00456891  |.  59                pop     ecx                      ;  010A2E20
  00456892  |.  84C0              test    al, al                   ;  看见下边的提示了吧,EAX返回0,注册失败
  00456894      75 52             jnz     short 004568E8           ;  不跳失败
  00456896  |.  6A 00             push    0
  00456898  |.  BA 3C1B5F00       mov     edx, 005F1B3C            ;  ASCII "Your registration code is wrong. Restart the 
  program and repeat the registration once again."
  0045689D  |.  66:C745 B4 2000   mov     word ptr [ebp-4C], 20
  004568A3  |.  8D45 F8           lea     eax, [ebp-8]
  004568A6  |.  E8 45E31700       call    005D4BF0
  004568AB  |.  FF45 C0           inc     dword ptr [ebp-40]
  004568AE  |.  8B08              mov     ecx, [eax]
  
  
  
  
  00456DF8  /$  55                push    ebp
  00456DF9  |.  8BEC              mov     ebp, esp
  00456DFB  |.  81C4 58FEFFFF     add     esp, -1A8
  00456E01  |.  B8 64815F00       mov     eax, 005F8164
  00456E06  |.  53                push    ebx
  00456E07  |.  56                push    esi
  00456E08  |.  57                push    edi
  00456E09  |.  E8 7E321700       call    005CA08C                 ;  依次压入下面这些常数,根据注册码来取值
  00456E0E  |.  66:C785 2CFFFFFF >mov     word ptr [ebp-D4], 8     ;  注册码是几就取对应的那个,例如0的话取第一个0x87
  00456E17  |.  BA 451C5F00       mov     edx, 005F1C45            ;  ASCII "87"
  00456E1C  |.  8D85 70FFFFFF     lea     eax, [ebp-90]
  00456E22  |.  E8 C9DD1700       call    005D4BF0
  00456E27  |.  FF85 38FFFFFF     inc     dword ptr [ebp-C8]
  00456E2D  |.  BA 481C5F00       mov     edx, 005F1C48            ;  ASCII "74"
  00456E32  |.  8D85 74FFFFFF     lea     eax, [ebp-8C]
  00456E38  |.  E8 B3DD1700       call    005D4BF0
  00456E3D  |.  FF85 38FFFFFF     inc     dword ptr [ebp-C8]
  00456E43  |.  BA 4B1C5F00       mov     edx, 005F1C4B            ;  ASCII "90"
  00456E48  |.  8D85 78FFFFFF     lea     eax, [ebp-88]
  00456E4E  |.  E8 9DDD1700       call    005D4BF0
  00456E53  |.  FF85 38FFFFFF     inc     dword ptr [ebp-C8]
  00456E59  |.  BA 4E1C5F00       mov     edx, 005F1C4E            ;  ASCII "39"
  00456E5E  |.  8D85 7CFFFFFF     lea     eax, [ebp-84]
  00456E64  |.  E8 87DD1700       call    005D4BF0
  00456E69  |.  FF85 38FFFFFF     inc     dword ptr [ebp-C8]
  00456E6F  |.  BA 511C5F00       mov     edx, 005F1C51            ;  ASCII "64"
  00456E74  |.  8D45 80           lea     eax, [ebp-80]
  00456E77  |.  E8 74DD1700       call    005D4BF0
  00456E7C  |.  FF85 38FFFFFF     inc     dword ptr [ebp-C8]
  00456E82  |.  BA 541C5F00       mov     edx, 005F1C54            ;  ASCII "53"
  00456E87  |.  8D45 84           lea     eax, [ebp-7C]
  00456E8A  |.  E8 61DD1700       call    005D4BF0
  00456E8F  |.  FF85 38FFFFFF     inc     dword ptr [ebp-C8]
  00456E95  |.  BA 571C5F00       mov     edx, 005F1C57            ;  ASCII "97"
  00456E9A  |.  8D45 88           lea     eax, [ebp-78]
  00456E9D  |.  E8 4EDD1700       call    005D4BF0
  00456EA2  |.  FF85 38FFFFFF     inc     dword ptr [ebp-C8]
  00456EA8  |.  BA 5A1C5F00       mov     edx, 005F1C5A            ;  ASCII "99"
  00456EAD  |.  8D45 8C           lea     eax, [ebp-74]
  00456EB0  |.  E8 3BDD1700       call    005D4BF0
  00456EB5  |.  FF85 38FFFFFF     inc     dword ptr [ebp-C8]
  00456EBB  |.  BA 5D1C5F00       mov     edx, 005F1C5D            ;  ASCII "56"
  00456EC0  |.  8D45 90           lea     eax, [ebp-70]
  00456EC3  |.  E8 28DD1700       call    005D4BF0
  00456EC8  |.  FF85 38FFFFFF     inc     dword ptr [ebp-C8]
  00456ECE  |.  BA 601C5F00       mov     edx, 005F1C60            ;  ASCII "72"
  00456ED3  |.  8D45 94           lea     eax, [ebp-6C]
  00456ED6  |.  E8 15DD1700       call    005D4BF0
  00456EDB  |.  FF85 38FFFFFF     inc     dword ptr [ebp-C8]
  00456EE1  |.  BA 631C5F00       mov     edx, 005F1C63            ;  ASCII "30"
  00456EE6  |.  8D45 98           lea     eax, [ebp-68]
  00456EE9  |.  E8 02DD1700       call    005D4BF0
  00456EEE  |.  FF85 38FFFFFF     inc     dword ptr [ebp-C8]
  00456EF4  |.  BA 661C5F00       mov     edx, 005F1C66            ;  ASCII "24"
  00456EF9  |.  8D45 9C           lea     eax, [ebp-64]
  00456EFC  |.  E8 EFDC1700       call    005D4BF0
  00456F01  |.  FF85 38FFFFFF     inc     dword ptr [ebp-C8]
  00456F07  |.  BA 691C5F00       mov     edx, 005F1C69            ;  ASCII "41"
  00456F0C  |.  8D45 A0           lea     eax, [ebp-60]
  00456F0F  |.  E8 DCDC1700       call    005D4BF0
  00456F14  |.  FF85 38FFFFFF     inc     dword ptr [ebp-C8]
  00456F1A  |.  BA 6C1C5F00       mov     edx, 005F1C6C            ;  ASCII "15"
  00456F1F  |.  8D45 A4           lea     eax, [ebp-5C]
  00456F22  |.  E8 C9DC1700       call    005D4BF0
  00456F27  |.  FF85 38FFFFFF     inc     dword ptr [ebp-C8]
  00456F2D  |.  BA 6F1C5F00       mov     edx, 005F1C6F            ;  ASCII "69"
  00456F32  |.  8D45 A8           lea     eax, [ebp-58]
  00456F35  |.  E8 B6DC1700       call    005D4BF0
  00456F3A  |.  FF85 38FFFFFF     inc     dword ptr [ebp-C8]
  00456F40  |.  BA 721C5F00       mov     edx, 005F1C72            ;  ASCII "92"
  00456F45  |.  8D45 AC           lea     eax, [ebp-54]
  00456F48  |.  E8 A3DC1700       call    005D4BF0
  00456F4D  |.  FF85 38FFFFFF     inc     dword ptr [ebp-C8]
  00456F53  |.  BA 751C5F00       mov     edx, 005F1C75            ;  ASCII "85"
  00456F58  |.  8D45 B0           lea     eax, [ebp-50]
  00456F5B  |.  E8 90DC1700       call    005D4BF0
  00456F60  |.  FF85 38FFFFFF     inc     dword ptr [ebp-C8]
  00456F66  |.  BA 781C5F00       mov     edx, 005F1C78            ;  ASCII "98"
  00456F6B  |.  8D45 B4           lea     eax, [ebp-4C]
  00456F6E  |.  E8 7DDC1700       call    005D4BF0
  00456F73  |.  FF85 38FFFFFF     inc     dword ptr [ebp-C8]
  00456F79  |.  BA 7B1C5F00       mov     edx, 005F1C7B            ;  ASCII "55"
  00456F7E  |.  8D45 B8           lea     eax, [ebp-48]
  00456F81  |.  E8 6ADC1700       call    005D4BF0
  00456F86  |.  FF85 38FFFFFF     inc     dword ptr [ebp-C8]
  00456F8C  |.  BA 7E1C5F00       mov     edx, 005F1C7E            ;  ASCII "19"
  00456F91  |.  8D45 BC           lea     eax, [ebp-44]
  00456F94  |.  E8 57DC1700       call    005D4BF0
  00456F99  |.  FF85 38FFFFFF     inc     dword ptr [ebp-C8]
  00456F9F  |.  BA 811C5F00       mov     edx, 005F1C81            ;  ASCII "57"
  00456FA4  |.  8D45 C0           lea     eax, [ebp-40]
  00456FA7  |.  E8 44DC1700       call    005D4BF0
  00456FAC  |.  FF85 38FFFFFF     inc     dword ptr [ebp-C8]
  00456FB2  |.  BA 841C5F00       mov     edx, 005F1C84            ;  ASCII "23"
  00456FB7  |.  8D45 C4           lea     eax, [ebp-3C]
  00456FBA  |.  E8 31DC1700       call    005D4BF0
  00456FBF  |.  FF85 38FFFFFF     inc     dword ptr [ebp-C8]
  00456FC5  |.  BA 871C5F00       mov     edx, 005F1C87            ;  ASCII "32"
  00456FCA  |.  8D45 C8           lea     eax, [ebp-38]
  00456FCD  |.  E8 1EDC1700       call    005D4BF0
  00456FD2  |.  FF85 38FFFFFF     inc     dword ptr [ebp-C8]
  00456FD8  |.  BA 8A1C5F00       mov     edx, 005F1C8A            ;  ASCII "21"
  00456FDD  |.  8D45 CC           lea     eax, [ebp-34]
  00456FE0  |.  E8 0BDC1700       call    005D4BF0
  00456FE5  |.  FF85 38FFFFFF     inc     dword ptr [ebp-C8]
  00456FEB  |.  BA 8D1C5F00       mov     edx, 005F1C8D            ;  ASCII "27"
  00456FF0  |.  8D45 D0           lea     eax, [ebp-30]
  00456FF3  |.  E8 F8DB1700       call    005D4BF0
  00456FF8  |.  FF85 38FFFFFF     inc     dword ptr [ebp-C8]
  00456FFE  |.  BA 901C5F00       mov     edx, 005F1C90            ;  ASCII "35"
  00457003  |.  8D45 D4           lea     eax, [ebp-2C]
  00457006  |.  E8 E5DB1700       call    005D4BF0
  0045700B  |.  FF85 38FFFFFF     inc     dword ptr [ebp-C8]
  00457011  |.  BA 931C5F00       mov     edx, 005F1C93            ;  ASCII "44"
  00457016  |.  8D45 D8           lea     eax, [ebp-28]
  00457019  |.  E8 D2DB1700       call    005D4BF0
  0045701E  |.  FF85 38FFFFFF     inc     dword ptr [ebp-C8]
  00457024  |.  BA 961C5F00       mov     edx, 005F1C96            ;  ASCII "42"
  00457029  |.  8D45 DC           lea     eax, [ebp-24]
  0045702C  |.  E8 BFDB1700       call    005D4BF0
  00457031  |.  FF85 38FFFFFF     inc     dword ptr [ebp-C8]
  00457037  |.  BA 991C5F00       mov     edx, 005F1C99            ;  ASCII "14"
  0045703C  |.  8D45 E0           lea     eax, [ebp-20]
  0045703F  |.  E8 ACDB1700       call    005D4BF0
  00457044  |.  FF85 38FFFFFF     inc     dword ptr [ebp-C8]
  0045704A  |.  BA 9C1C5F00       mov     edx, 005F1C9C            ;  ASCII "11"
  0045704F  |.  8D45 E4           lea     eax, [ebp-1C]
  00457052  |.  E8 99DB1700       call    005D4BF0
  00457057  |.  FF85 38FFFFFF     inc     dword ptr [ebp-C8]
  0045705D  |.  BA 9F1C5F00       mov     edx, 005F1C9F            ;  ASCII "43"
  00457062  |.  8D45 E8           lea     eax, [ebp-18]
  00457065  |.  E8 86DB1700       call    005D4BF0
  0045706A  |.  FF85 38FFFFFF     inc     dword ptr [ebp-C8]
  00457070  |.  BA A21C5F00       mov     edx, 005F1CA2            ;  ASCII "80"
  00457075  |.  8D45 EC           lea     eax, [ebp-14]
  00457078  |.  E8 73DB1700       call    005D4BF0
  0045707D  |.  FF85 38FFFFFF     inc     dword ptr [ebp-C8]
  00457083  |.  BA A51C5F00       mov     edx, 005F1CA5            ;  ASCII "84"
  00457088  |.  8D45 F0           lea     eax, [ebp-10]
  0045708B  |.  E8 60DB1700       call    005D4BF0
  00457090  |.  FF85 38FFFFFF     inc     dword ptr [ebp-C8]
  00457096  |.  BA A81C5F00       mov     edx, 005F1CA8            ;  ASCII "33"
  0045709B  |.  8D45 F4           lea     eax, [ebp-C]
  0045709E  |.  E8 4DDB1700       call    005D4BF0
  004570A3  |.  FF85 38FFFFFF     inc     dword ptr [ebp-C8]
  004570A9  |.  BA AB1C5F00       mov     edx, 005F1CAB            ;  ASCII "25"
  004570AE  |.  8D45 F8           lea     eax, [ebp-8]
  004570B1  |.  E8 3ADB1700       call    005D4BF0
  004570B6  |.  FF85 38FFFFFF     inc     dword ptr [ebp-C8]
  004570BC  |.  BA AE1C5F00       mov     edx, 005F1CAE            ;  ASCII "10"
  004570C1  |.  8D45 FC           lea     eax, [ebp-4]
  004570C4  |.  E8 27DB1700       call    005D4BF0
  004570C9  |.  FF85 38FFFFFF     inc     dword ptr [ebp-C8]
  004570CF  |.  BE C0055F00       mov     esi, 005F05C0
  004570D4  |.  8DBD E8FEFFFF     lea     edi, [ebp-118]
  004570DA  |.  B9 09000000       mov     ecx, 9
  004570DF  |.  F3:A5             rep     movs dword ptr es:[edi],>
  004570E1  |.  BE E4055F00       mov     esi, 005F05E4
  004570E6  |.  8DBD 58FEFFFF     lea     edi, [ebp-1A8]
  004570EC  |.  B9 24000000       mov     ecx, 24
  004570F1  |.  F3:A5             rep     movs dword ptr es:[edi],>
  004570F3  |.  66:C785 2CFFFFFF >mov     word ptr [ebp-D4], 14
  004570FC  |.  33C0              xor     eax, eax
  004570FE  |.  8985 6CFFFFFF     mov     [ebp-94], eax
  00457104  |.  8D95 6CFFFFFF     lea     edx, [ebp-94]
  0045710A  |.  FF85 38FFFFFF     inc     dword ptr [ebp-C8]
  00457110  |.  8B45 10           mov     eax, [ebp+10]
  00457113  |.  E8 A0E01700       call    005D51B8
  00457118  |.  66:C785 2CFFFFFF >mov     word ptr [ebp-D4], 8
  00457121  |.  33D2              xor     edx, edx
  00457123  |.  33C9              xor     ecx, ecx
  00457125  |.  8995 18FFFFFF     mov     [ebp-E8], edx
  0045712B  |.  898D 14FFFFFF     mov     [ebp-EC], ecx
  00457131  |.  66:C785 2CFFFFFF >mov     word ptr [ebp-D4], 20
  0045713A  |.  BA B11C5F00       mov     edx, 005F1CB1
  0045713F  |.  8D85 68FFFFFF     lea     eax, [ebp-98]
  00457145  |.  E8 A6DA1700       call    005D4BF0
  0045714A  |.  FF85 38FFFFFF     inc     dword ptr [ebp-C8]
  00457150  |.  BA B21C5F00       mov     edx, 005F1CB2
  00457155  |.  66:C785 2CFFFFFF >mov     word ptr [ebp-D4], 8
  0045715E  |.  66:C785 2CFFFFFF >mov     word ptr [ebp-D4], 2C
  00457167  |.  8D85 64FFFFFF     lea     eax, [ebp-9C]
  0045716D  |.  E8 7EDA1700       call    005D4BF0
  00457172  |.  FF85 38FFFFFF     inc     dword ptr [ebp-C8]
  00457178  |.  66:C785 2CFFFFFF >mov     word ptr [ebp-D4], 8
  00457181  |.  C785 10FFFFFF 010>mov     dword ptr [ebp-F0], 1
  0045718B  |.  E9 85000000       jmp     00457215                 ;  跳
  00457190  |>  66:C785 2CFFFFFF >/mov     word ptr [ebp-D4], 8    ;  开始处理注册码
  00457199  |.  8D85 58FEFFFF     |lea     eax, [ebp-1A8]
  0045719F  |.  33F6              |xor     esi, esi                ;  清空ESI,内循环的计数器
  004571A1  |.  8985 0CFFFFFF     |mov     [ebp-F4], eax
  004571A7  |.  8DBD E8FEFFFF     |lea     edi, [ebp-118]
  004571AD  |>  8B9D 10FFFFFF     |/mov     ebx, [ebp-F0]          ;  里面的小循环
  004571B3  |.  53                ||push    ebx                    ; /Arg2
  004571B4  |.  8D85 6CFFFFFF     ||lea     eax, [ebp-94]          ; |
  004571BA  |.  50                ||push    eax                    ; |Arg1
  004571BB  |.  E8 ACD91700       ||call    005D4B6C               ; \atani.005D4B6C
  004571C0  |.  83C4 08           ||add     esp, 8
  004571C3  |.  8D85 6CFFFFFF     ||lea     eax, [ebp-94]
  004571C9  |.  E8 E2DE1700       ||call    005D50B0               ;  取出注册码第二段
  004571CE  |.  039D 6CFFFFFF     ||add     ebx, [ebp-94]
  004571D4  |.  4B                ||dec     ebx
  004571D5  |.  8A13              ||mov     dl, [ebx]
  004571D7  |.  3A17              ||cmp     dl, [edi]              ;  一直累加计数器,直到等于SN_I
  004571D9  |.  75 26             ||jnz     short 00457201         ;  不相等,跳
  004571DB  |.  8BD6              ||mov     edx, esi
  004571DD  |.  C1E2 02           ||shl     edx, 2                 ;  edx*4
  004571E0  |.  8D85 70FFFFFF     ||lea     eax, [ebp-90]
  004571E6  |.  03D0              ||add     edx, eax
  004571E8  |.  8D85 64FFFFFF     ||lea     eax, [ebp-9C]
  004571EE  |.  E8 21DD1700       ||call    005D4F14               ;  取出对应上面给的表的数字,1时取0x74,依此类推
  004571F3  |.  8B95 0CFFFFFF     ||mov     edx, [ebp-F4]          ;  另一张表,记为T1[i]
  004571F9  |.  8B0A              ||mov     ecx, [edx]
  004571FB  |.  018D 18FFFFFF     ||add     [ebp-E8], ecx          ;  对应注册码查表的中值再相加
  00457201  |>  8385 0CFFFFFF 04  ||add     dword ptr [ebp-F4], 4  ;  +4
  00457208  |.  46                ||inc     esi                    ;  ESI加一
  00457209  |.  47                ||inc     edi                    ;  EDI加一
  0045720A  |.  83FE 24           ||cmp     esi, 24                ;  循环条件,ESI<0X24
  0045720D  |.^ 7C 9E             |\jl      short 004571AD         ;  内循环
  0045720F  |.  FF85 10FFFFFF     |inc     dword ptr [ebp-F0]      ;  计数器加一
  00457215  |>  83BD 6CFFFFFF 00   cmp     dword ptr [ebp-94], 0   ;  判断第二段注册码
  0045721C  |.  74 0B             |je      short 00457229          ;  是0跳
  0045721E  |.  8B85 6CFFFFFF     |mov     eax, [ebp-94]
  00457224  |.  8B50 FC           |mov     edx, [eax-4]            ;  第二段注册码的位数
  00457227  |.  EB 02             |jmp     short 0045722B
  00457229  |>  33D2              |xor     edx, edx
  0045722B  |>  3B95 10FFFFFF     |cmp     edx, [ebp-F0]           ;  循环条件,[EBP-FO]<SN_1
  00457231  |.^ 0F8D 59FFFFFF     \jge     00457190                ;  跳回计算
  00457237  |.  83BD 64FFFFFF 00  cmp     dword ptr [ebp-9C], 0    ;  [EBP-9C]中存放着查表结果,第二段是1111的结果0x74747474
  0045723E  |.  74 0B             je      short 0045724B
  00457240  |.  8B85 64FFFFFF     mov     eax, [ebp-9C]
  00457246  |.  8B58 FC           mov     ebx, [eax-4]
  00457249  |.  EB 02             jmp     short 0045724D
  0045724B  |>  33DB              xor     ebx, ebx
  0045724D  |>  66:C785 2CFFFFFF >mov     word ptr [ebp-D4], 8
  00457256  |.  83FB 08           cmp     ebx, 8                   ;  第一位大于4
  00457259  |.  7E 46             jle     short 004572A1           ;  不跳
  0045725B  |.  83FB 12           cmp     ebx, 12                  ;  第一位如果大于6
  0045725E  |.  7F 41             jg      short 004572A1           ;  跳
  00457260  |.  83EB 08           sub     ebx, 8                   ;  
  00457263  |.  8D85 64FFFFFF     lea     eax, [ebp-9C]
  00457269  |.  8BCB              mov     ecx, ebx
  0045726B  |.  BA 01000000       mov     edx, 1                   ;  EDX=1
  00457270  |.  E8 4FDE1700       call    005D50C4                 ;  取串,从第2位开始取
  00457275  |.  8BD0              mov     edx, eax
  00457277  |.  8D85 64FFFFFF     lea     eax, [ebp-9C]
  0045727D  |.  E8 7EDC1700       call    005D4F00
  00457282  |.  8B85 64FFFFFF     mov     eax, [ebp-9C]
  00457288  |.  E8 AB5A1600       call    005BCD38                 ;  转换成十六进制
  0045728D  |.  83C3 07           add     ebx, 7                   ;  EBX=EBX+2,EBX=9
  00457290  |.  99                cdq                              ;  扩展
  00457291  |.  F7FB              idiv    ebx                      ;  /EBX
  00457293  |.  0385 18FFFFFF     add     eax, [ebp-E8]            ;  /EBX+(T1[2]++T1[SN_1+1])
  00457299  |.  8985 14FFFFFF     mov     [ebp-EC], eax            ;  保存
  0045729F  |.  EB 49             jmp     short 004572EA           ;  计算完,跳
  004572A1  |>  83FB 04           cmp     ebx, 4                   ;  第一位注册码<8计算
  004572A4  |.  7C 44             jl      short 004572EA
  004572A6  |.  83FB 08           cmp     ebx, 8
  004572A9  |.  7F 3F             jg      short 004572EA
  004572AB  |.  83EB 04           sub     ebx, 4
  004572AE  |.  8D85 64FFFFFF     lea     eax, [ebp-9C]
  004572B4  |.  8BCB              mov     ecx, ebx
  004572B6  |.  BA 01000000       mov     edx, 1
  004572BB  |.  E8 04DE1700       call    005D50C4
  004572C0  |.  8BD0              mov     edx, eax
  004572C2  |.  8D85 64FFFFFF     lea     eax, [ebp-9C]
  004572C8  |.  E8 33DC1700       call    005D4F00                 ;  取后四位
  004572CD  |.  8B85 64FFFFFF     mov     eax, [ebp-9C]            ;  
  004572D3  |.  E8 605A1600       call    005BCD38                 ;  转化成十六进制
  004572D8  |.  83C3 02           add     ebx, 2                   ;  EBX中是第一位注册码+2
  004572DB  |.  99                cdq                              ;  扩展,开除
  004572DC  |.  F7FB              idiv    ebx                      ;  S/6
  004572DE  |.  0385 18FFFFFF     add     eax, [ebp-E8]            ;  s/6+T1的查表和
  004572E4  |.  8985 14FFFFFF     mov     [ebp-EC], eax
  004572EA  |>  66:C785 2CFFFFFF >mov     word ptr [ebp-D4], 38
  004572F3  |.  8D85 60FFFFFF     lea     eax, [ebp-A0]            ;  
  004572F9  |.  8B95 14FFFFFF     mov     edx, [ebp-EC]
  004572FF  |.  E8 50DA1700       call    005D4D54                 ;  上面计算结果转化为十进制
  ---------------------------------
           省略一段代码
  ---------------------------------
  00457399  |>  83BD 60FFFFFF 00   cmp     dword ptr [ebp-A0], 0
  004573A0  |.  74 0B             |je      short 004573AD
  004573A2  |.  8B8D 60FFFFFF     |mov     ecx, [ebp-A0]
  004573A8  |.  8B41 FC           |mov     eax, [ecx-4]
  004573AB  |.  EB 02             |jmp     short 004573AF
  004573AD  |>  33C0              |xor     eax, eax
  004573AF  |>  83F8 09           |cmp     eax, 9
  004573B2  |.^ 0F8C 60FFFFFF     \jl      00457318
  004573B8  |.  66:C785 2CFFFFFF >mov     word ptr [ebp-D4], 50
  004573C1  |.  BA B51C5F00       mov     edx, 005F1CB5
  004573C6  |.  8D85 54FFFFFF     lea     eax, [ebp-AC]
  004573CC  |.  E8 1FD81700       call    005D4BF0
  004573D1  |.  FF85 38FFFFFF     inc     dword ptr [ebp-C8]
  004573D7  |.  8D95 54FFFFFF     lea     edx, [ebp-AC]
  004573DD  |.  8D85 68FFFFFF     lea     eax, [ebp-98]
  004573E3  |.  E8 18DB1700       call    005D4F00
  004573E8  |.  FF8D 38FFFFFF     dec     dword ptr [ebp-C8]
  004573EE  |.  8D85 54FFFFFF     lea     eax, [ebp-AC]
  004573F4  |.  BA 02000000       mov     edx, 2
  004573F9  |.  E8 D2DA1700       call    005D4ED0
  004573FE  |.  66:C785 2CFFFFFF >mov     word ptr [ebp-D4], 8
  00457407  |.  BB 01000000       mov     ebx, 1
  0045740C  |>  66:C785 2CFFFFFF >/mov     word ptr [ebp-D4], 68
  00457415  |.  33C0              |xor     eax, eax
  00457417  |.  8D95 50FFFFFF     |lea     edx, [ebp-B0]
  0045741D  |.  8985 50FFFFFF     |mov     [ebp-B0], eax
  00457423  |.  52                |push    edx                     ; /Arg1
  00457424  |.  FF85 38FFFFFF     |inc     dword ptr [ebp-C8]      ; |
  0045742A  |.  8BD3              |mov     edx, ebx                ; |
  0045742C  |.  8D85 60FFFFFF     |lea     eax, [ebp-A0]           ; |
  00457432  |.  B9 02000000       |mov     ecx, 2                  ; |
  00457437  |.  E8 04DE1700       |call    005D5240                ; \atani.005D5240
  0045743C  |.  8D85 50FFFFFF     |lea     eax, [ebp-B0]           ; 上面计算结果两两分组
  00457442  |.  E8 DDDE1700       |call    005D5324                ; 转换成十六进制
  00457447  |.  8BF0              |mov     esi, eax
  00457449  |.  FF8D 38FFFFFF     |dec     dword ptr [ebp-C8]
  0045744F  |.  8D85 50FFFFFF     |lea     eax, [ebp-B0]
  00457455  |.  BA 02000000       |mov     edx, 2
  0045745A  |.  E8 71DA1700       |call    005D4ED0
  0045745F  |.  66:C785 2CFFFFFF >|mov     word ptr [ebp-D4], 5C
  00457468  |.  83FE 24           |cmp     esi, 24                 ;  与0x24比较
  0045746B      0F8D 84000000     jge     004574F5                 ;  ESI大于0x24跳到下面
  00457471  |.  66:C785 2CFFFFFF >|mov     word ptr [ebp-D4], 74
  0045747A  |.  8A9435 E8FEFFFF   |mov     dl, [ebp+esi-118]       ;  查表
  00457481  |.  8D85 4CFFFFFF     |lea     eax, [ebp-B4]           ;  表是0123456789ABCDEFGHIJKLMNOPQRSTUVWXY
  00457487  |.  E8 34D81700       |call    005D4CC0
  0045748C  |.  FF85 38FFFFFF     |inc     dword ptr [ebp-C8]
  00457492  |.  8BD0              |mov     edx, eax
  00457494  |.  33C0              |xor     eax, eax
  00457496  |.  8D8D 48FFFFFF     |lea     ecx, [ebp-B8]
  0045749C  |.  8985 48FFFFFF     |mov     [ebp-B8], eax
  004574A2  |.  8D85 68FFFFFF     |lea     eax, [ebp-98]
  004574A8  |.  FF85 38FFFFFF     |inc     dword ptr [ebp-C8]
  004574AE  |.  E8 75DA1700       |call    005D4F28
  004574B3  |.  8D95 48FFFFFF     |lea     edx, [ebp-B8]
  004574B9  |.  8D85 68FFFFFF     |lea     eax, [ebp-98]
  004574BF  |.  E8 3CDA1700       |call    005D4F00
  004574C4  |.  FF8D 38FFFFFF     |dec     dword ptr [ebp-C8]
  004574CA  |.  8D85 48FFFFFF     |lea     eax, [ebp-B8]
  004574D0  |.  BA 02000000       |mov     edx, 2
  004574D5  |.  E8 F6D91700       |call    005D4ED0
  004574DA  |.  FF8D 38FFFFFF     |dec     dword ptr [ebp-C8]
  004574E0  |.  8D85 4CFFFFFF     |lea     eax, [ebp-B4]
  004574E6  |.  BA 02000000       |mov     edx, 2
  004574EB  |.  E8 E0D91700       |call    005D4ED0
  004574F0  |.  E9 92000000       |jmp     00457587
  004574F5  |>  66:C785 2CFFFFFF >|mov     word ptr [ebp-D4], 80
  004574FE  |.  33C9              |xor     ecx, ecx
  00457500  |.  8D85 44FFFFFF     |lea     eax, [ebp-BC]
  00457506  |.  898D 44FFFFFF     |mov     [ebp-BC], ecx
  0045750C  |.  50                |push    eax                     ; /Arg1
  0045750D  |.  FF85 38FFFFFF     |inc     dword ptr [ebp-C8]      ; |
  00457513  |.  8D85 60FFFFFF     |lea     eax, [ebp-A0]           ; |
  00457519  |.  B9 01000000       |mov     ecx, 1                  ; |
  0045751E  |.  8BD3              |mov     edx, ebx                ; |
  00457520  |.  E8 1BDD1700       |call    005D5240                ; \atani.005D5240
  00457525  |.  8D95 44FFFFFF     |lea     edx, [ebp-BC]
  0045752B  |.  33C0              |xor     eax, eax
  0045752D  |.  8985 40FFFFFF     |mov     [ebp-C0], eax
  00457533  |.  8D8D 40FFFFFF     |lea     ecx, [ebp-C0]
  00457539  |.  FF85 38FFFFFF     |inc     dword ptr [ebp-C8]
  0045753F  |.  8D85 68FFFFFF     |lea     eax, [ebp-98]
  00457545  |.  E8 DED91700       |call    005D4F28
  0045754A  |.  8D95 40FFFFFF     |lea     edx, [ebp-C0]
  00457550  |.  8D85 68FFFFFF     |lea     eax, [ebp-98]
  00457556  |.  E8 A5D91700       |call    005D4F00
  0045755B  |.  FF8D 38FFFFFF     |dec     dword ptr [ebp-C8]
  00457561  |.  8D85 40FFFFFF     |lea     eax, [ebp-C0]
  00457567  |.  BA 02000000       |mov     edx, 2
  0045756C  |.  E8 5FD91700       |call    005D4ED0
  00457571  |.  FF8D 38FFFFFF     |dec     dword ptr [ebp-C8]
  00457577  |.  8D85 44FFFFFF     |lea     eax, [ebp-BC]
  0045757D  |.  BA 02000000       |mov     edx, 2
  00457582  |.  E8 49D91700       |call    005D4ED0
  00457587  |>  66:C785 2CFFFFFF >|mov     word ptr [ebp-D4], 8
  00457590  |.  83C3 02           |add     ebx, 2                  ;  每次EBX加2
  00457593  |.  83FB 09           |cmp     ebx, 9                  ;  小于9继续,可以看出查4次表
  00457596  |.^ 0F8C 70FEFFFF     \jl      0045740C                ;  <9,跳回继续计算
  0045759C  |.  66:C785 2CFFFFFF >mov     word ptr [ebp-D4], 8C
  004575A5  |.  8D95 68FFFFFF     lea     edx, [ebp-98]
  004575AB  |.  8B45 08           mov     eax, [ebp+8]
  004575AE  |.  E8 4DD91700       call    005D4F00
  004575B3  |.  8B45 08           mov     eax, [ebp+8]
  004575B6  |.  BA 02000000       mov     edx, 2
  004575BB  |.  66:C785 2CFFFFFF >mov     word ptr [ebp-D4], 98
  004575C4  |.  50                push    eax
  004575C5  |.  8D85 60FFFFFF     lea     eax, [ebp-A0]
  004575CB  |.  FF8D 38FFFFFF     dec     dword ptr [ebp-C8]
  004575D1  |.  E8 FAD81700       call    005D4ED0
  004575D6  |.  FF8D 38FFFFFF     dec     dword ptr [ebp-C8]
  004575DC  |.  8D85 64FFFFFF     lea     eax, [ebp-9C]
  004575E2  |.  BA 02000000       mov     edx, 2
  004575E7  |.  E8 E4D81700       call    005D4ED0
  004575EC  |.  FF8D 38FFFFFF     dec     dword ptr [ebp-C8]
  004575F2  |.  8D85 68FFFFFF     lea     eax, [ebp-98]
  004575F8  |.  BA 02000000       mov     edx, 2
  004575FD  |.  E8 CED81700       call    005D4ED0
  00457602  |.  FF8D 38FFFFFF     dec     dword ptr [ebp-C8]
  00457608  |.  8D85 6CFFFFFF     lea     eax, [ebp-94]
  0045760E  |.  BA 02000000       mov     edx, 2
  00457613  |.  E8 B8D81700       call    005D4ED0
  00457618  |.  8385 38FFFFFF DC  add     dword ptr [ebp-C8], -24
  0045761F  |.  68 D04E5D00       push    005D4ED0                 ; /Arg5 = 005D4ED0
  00457624  |.  6A 03             push    3                        ; |Arg4 = 00000003
  00457626  |.  6A 24             push    24                       ; |Arg3 = 00000024
  00457628  |.  6A 04             push    4                        ; |Arg2 = 00000004
  0045762A  |.  8D8D 70FFFFFF     lea     ecx, [ebp-90]            ; |
  00457630  |.  51                push    ecx                      ; |Arg1
  00457631  |.  E8 36FE1600       call    005C746C                 ; \atani.005C746C
  00457636  |.  83C4 14           add     esp, 14
  00457639  |.  58                pop     eax
  0045763A  |.  66:C785 2CFFFFFF >mov     word ptr [ebp-D4], 8C
  00457643  |.  FF85 38FFFFFF     inc     dword ptr [ebp-C8]
  00457649  |.  8B95 1CFFFFFF     mov     edx, [ebp-E4]
  0045764F  |.  64:8915 00000000  mov     fs:[0], edx
  00457656  |.  5F                pop     edi
  00457657  |.  5E                pop     esi
  00457658  |.  5B                pop     ebx
  00457659  |.  8BE5              mov     esp, ebp
  0045765B  |.  5D                pop     ebp
  0045765C  \.  C3                retn
  
--------------------------------------------------------------------------------
【经验总结】
  算法总结:
  
  (1)程序使用了三张表,分别记位T1,T2,T3.
  
  T1[] = {0x3233C1C, 0x2568005, 0x534C840, 0x5E2635B,
          0x16E3B35, 0x20C0463, 0x295FE40, 0x33ED42E,
          0x4FBF23F, 0x245E91D};
  T2[] ={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,
        0X41,0X42,0X43,0X44,0X45,0X46,0X47,0X48,0X49,0X50,
        0X51,0X52,0X53,0X54,0X55,0X56,0X57,0X58,0X59};
  T3[] = {0X87, 0X74, 0X90, 0X39,0X64,0X53, 0X97,0X99,0X56,0X72,0X30, 0X24,
          0X41,0X15,0X69,0X92,0X85,0X98,0X55,0X19,0X57,0X23,0X32,0X21,0X27,
          0X35,0X44,0X42,0X14,0X11,0X43,0X80,0X84, 0X33,0X25,0X10};
  
  (2)注册码可以分为三段,第一段一位,第二段和第一段有关,第三段根据第二段计算。
  
  (3)第一位注册码必须大于等于4;
  
  (4)第一位注册码是几就对应的取后续的几位注册码;
   例:第一位是5,则紧接着再取5位,假设是12345
  
  (5)根据第二段注册码查表T1对应结果为0x3233C1C, 0x2568005, 0x534C840, 0x5E2635B,
          0x16E3B35;查表T3的对应结果为0X87, 0X74, 0X90, 0X39,0X64;
  
  (6)T3的查表结果组成一个数0X8774903964
  
  后面的计算和第一位有关:
  (7)如果第一位是4,则取第二段的后两位,除以6的商加上T1的查表结果之和,转化成十进制;
  
  (8)如果是5,则取T3的查表结果的2-5位,转换成十六进制除以9的商再加T1的查表结果之和,转化成十进制;
  
  (9)其它的就直接转化成十进制;
  
  (10)上面的几种十进结果每次取出两位,循环4次,如果取出的值大于0x24就取10的商;小于0x24就用它查表T2
     注:0x24就是十进制的36,正好等于T2的大小。
  
  (11)组合上面的三段就是注册码
  
  可用的注册码:
  40004IPQI
  500005P464
  512345T375
  
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2006年05月10日 23:17:58