GGLHY 发表于 2011-2-24 20:20:13

****管理系统单机版的注册算法分析

本帖最后由 GGLHY 于 2011-2-24 20:28 编辑

      ****管理系统单机版的注册算法分析

                  在医院陪护期间练手而已!如有错误,还望不吝赐教!谢谢!!!

闲话少叙,直接来到:
005A991F    E8 D051FCFF   call    0056EAF4                   ; 算法CALL
005A9924    84C0            test    al, al                     ; 标志位比较
005A9926    74 27         je      short 005A994F             ; 关键跳,跳则注册失败
005A9928    6A 40         push    40                         ; 注意这里的 40 !
005A992A    B9 90995A00   mov   ecx, 005A9990            ; ASCII "系统提示"
(省略部分代码)
005A9943    C780 4C020000 0>mov   dword ptr , 1
005A994D    EB 18         jmp   short 005A9967
005A994F    6A 10         push    10                         ; 杯具了
005A9951    B9 90995A00   mov   ecx, 005A9990            ; ASCII "系统提示"
(省略部分代码)
005A9962    E8 9D89EEFF   call    00492304


好,咱们进去看看:
005A991F    E8 D051FCFF   call    0056EAF4                   ; 算法CALL
    0056EAF4    55            push    ebp
    (省略部分代码)
    0056EB11    E8 4EF7FFFF   call    0056E264
    0056EB16    8B4D EC         mov   ecx,           ; 机器码到ECX
    0056EB19    8D45 F4         lea   eax,
    0056EB1C    BA 4CEC5600   mov   edx, 0056EC4C          ; ASCII "H0"
    0056EB21    E8 1260E9FF   call    00404B38
   (省略部分代码)
    0056EB5F    33C9            xor   ecx, ecx
    0056EB61    BA 58EC5600   mov   edx, 0056EC58          ; ASCII "Software\wgzm\ckmxczdj"
    0056EB66    8B45 F8         mov   eax,
    0056EB69    E8 367BEDFF   call    004466A4
    0056EB6E    84C0            test    al, al
    0056EB70    74 5A         je      short 0056EBCC
    0056EB72    8D4D E8         lea   ecx,
    0056EB75    BA 78EC5600   mov   edx, 0056EC78          ; ASCII "rc"
    0056EB7A    8B45 F8         mov   eax,
    0056EB7D    E8 1A7EEDFF   call    0044699C
    0056EB82    8B55 E8         mov   edx,           ; 假码
    0056EB85    B8 CC5E5F00   mov   eax, 005F5ECC
    0056EB8A    E8 F15CE9FF   call    00404880
    0056EB8F    8B55 F0         mov   edx,
    0056EB92    8B45 F8         mov   eax,
    0056EB95    E8 967CEDFF   call    00446830
    0056EB9A    BA 84EC5600   mov   edx, 0056EC84          ; ASCII "sysj"
    0056EB9F    8B45 F0         mov   eax,
    0056EBA2    8B08            mov   ecx,
    0056EBA4    FF51 54         call   
    0056EBA7    40            inc   eax
    0056EBA8    75 0E         jnz   short 0056EBB8
    0056EBAA    E8 05D0E9FF   call    0040BBB4
    0056EBAF    DD1D 8C605F00   fstp    qword ptr
    0056EBB5    9B            wait
    0056EBB6    EB 14         jmp   short 0056EBCC
    0056EBB8    BA 84EC5600   mov   edx, 0056EC84          ; ASCII "sysj"
    0056EBBD    8B45 F8         mov   eax,
    0056EBC0    E8 AB7EEDFF   call    00446A70
    0056EBC5    DD1D 8C605F00   fstp    qword ptr
    0056EBCB    9B            wait
    0056EBCC    8D4D E4         lea   ecx,
    0056EBCF    66:BA 3200      mov   dx, 32               ; dx=32
    0056EBD3    8B45 F4         mov   eax,          ;"H0Y31QH89E"
    0056EBD6    E8 39FCFFFF   call    0056E814               ; 算法核心,F7
            0056E814    55            push    ebp
            0056E815    8BEC            mov   ebp, esp
            0056E817    51            push    ecx
            0056E818    B9 04000000   mov   ecx, 4
            0056E81D    6A 00         push    0
            0056E81F    6A 00         push    0
            0056E821    49            dec   ecx
            0056E822^ 75 F9         jnz   short 0056E81D
            0056E824    51            push    ecx
            0056E825    874D FC         xchg    , ecx
            0056E828    53            push    ebx
            0056E829    56            push    esi
            0056E82A    57            push    edi
            0056E82B    8BF9            mov   edi, ecx
            0056E82D    66:8955 FA      mov   , dx            ;DX=32
            0056E831    8945 FC         mov   , eax         ; "H0Y31QH89E",变形的机器码
            0056E834    33C0            xor   eax, eax
            0056E836    55            push    ebp
            0056E837    68 D8EA5600   push    0056EAD8
            0056E83C    64:FF30         push    dword ptr fs:
            0056E83F    64:8920         mov   fs:, esp
            0056E842    66:8B75 FA      mov   si,             ;32到SI
            0056E846    8B45 FC         mov   eax,
            0056E849    E8 9E62E9FF   call    00404AEC
            0056E84E    8BD0            mov   edx, eax               ; H0连接机器码后的长度
            0056E850    8D45 F4         lea   eax,
            0056E853    E8 2066E9FF   call    00404E78
            0056E858    8B45 FC         mov   eax,          ; "H0Y31QH89E",变形的机器码
            0056E85B    E8 8C62E9FF   call    00404AEC
            0056E860    84C0            test    al, al
            0056E862    76 67         jbe   short 0056E8CB
            0056E864    8845 E3         mov   , al         ;"H0Y31QH89E"的长度
            0056E867    B3 01         mov   bl, 1                  ; bl=1
            0056E869    33C0            xor   eax, eax
            0056E86B    8AC3            mov   al, bl
            0056E86D    8B55 FC         mov   edx,          ; "H0Y31QH89E"
            0056E870    0FB64402 FF   movzx   eax, byte ptr [edx+eax>; 依次取H0Y31QH89E每一位
            0056E875    0FB7D6          movzx   edx, si                ;32
            0056E878    03D2            add   edx, edx               ;相加(32+32)
            0056E87A    03C2            add   eax, edx               ;和 + 当前所取的变形机器码的ASC
            0056E87C    B9 5B000000   mov   ecx, 5B
            0056E881    33D2            xor   edx, edx
            0056E883    F7F1            div   ecx                  ; /5B
            0056E885    8BF2            mov   esi, edx               ; 余数
            0056E887    EB 10         jmp   short 0056E899
            0056E889    66:83FE 30      cmp   si, 30               ; 余数与30比较
            0056E88D    73 06         jnb   short 0056E895         ; 不小于则跳
            0056E88F    66:83C6 12      add   si, 12               ; +12再与30比较
            0056E893    EB 04         jmp   short 0056E899
            0056E895    66:83C6 07      add   si, 7                  ; +7
            0056E899    66:83FE 30      cmp   si, 30               ; 余数与30比较
            0056E89D^ 72 EA         jb      short 0056E889         ; 小则跳
            0056E89F    66:83FE 39      cmp   si, 39               ; 余数与39比较
            0056E8A3    76 06         jbe   short 0056E8AB         ; 不大于则跳
            0056E8A5    66:83FE 41      cmp   si, 41               ; 余数与41比较
            0056E8A9^ 72 DE         jb      short 0056E889         ; 小则跳
            0056E8AB    8D45 F4         lea   eax,
            0056E8AE    E8 9164E9FF   call    00404D44
            0056E8B3    33D2            xor   edx, edx
            0056E8B5    8AD3            mov   dl, bl
            0056E8B7    8BCE            mov   ecx, esi               ; 余数
            0056E8B9    884C10 FF       mov   , cl      ; 该余数作为ASC及对应的字符
            0056E8BD    66:83C6 32      add   si, 32               ; +32
            0056E8C1    66:83C6 32      add   si, 32               ; +32。(SI再进行下一轮循环)
            0056E8C5    43            inc   ebx                  ; bl+1
            0056E8C6    FE4D E3         dec   byte ptr       ; (H0连接机器码后的长度)计数器-1
            0056E8C9^ 75 9E         jnz   short 0056E869
            0056E8CB    8D45 F0         lea   eax,           ; 循环结束得到字符串S1,本例为“QGC9ZCCE19”
            0056E8CE    8B55 F4         mov   edx,
            0056E8D1    E8 EE5FE9FF   call    004048C4
            0056E8D6    8D45 F4         lea   eax,
            0056E8D9    E8 4E5FE9FF   call    0040482C
            0056E8DE    8B45 F0         mov   eax,           ; S1
            0056E8E1    E8 0662E9FF   call    00404AEC
            0056E8E6    8BD0            mov   edx, eax               ; S1的长度
            0056E8E8    8D45 F4         lea   eax,
            0056E8EB    E8 8865E9FF   call    00404E78               ;
            0056E8F0    66:8B75 FA      mov   si,             ;=32
            0056E8F4    8B45 F0         mov   eax,
            0056E8F7    E8 F061E9FF   call    00404AEC               ;S1的长度为0吗?
            0056E8FC    84C0            test    al, al
            0056E8FE    76 67         jbe   short 0056E967         ;这里跳,就会略过下面对S1循环运算的过程了
            0056E900    8845 E3         mov   , al         ;S1的长度
            0056E903    B3 01         mov   bl, 1
            0056E905    33C0            xor   eax, eax               ; 重复上面的循环,不过变成S1而非机器码了
            0056E907    8AC3            mov   al, bl               ;参见上面的循环
            0056E909    8B55 F0         mov   edx,
            0056E90C    0FB64402 FF   movzx   eax, byteptr
            0056E911    0FB7D6          movzx   edx, si
            0056E914    03D2            add   edx, edx
            0056E916    03C2            add   eax, edx
            0056E918    B9 5B000000   mov   ecx, 5B
            0056E91D    33D2            xor   edx, edx
            0056E91F    F7F1            div   ecx
            0056E921    8BF2            mov   esi, edx
            0056E923    EB 10         jmp   short 0056E935
            0056E925    66:83FE 30      cmp   si, 30
            0056E929    73 06         jnb   short 0056E931
            0056E92B    66:83C6 12      add   si, 12
            0056E92F    EB 04         jmp   short 0056E935
            0056E931    66:83C6 07      add   si, 7
            0056E935    66:83FE 30      cmp   si, 30
            0056E939^ 72 EA         jb      short 0056E925
            0056E93B    66:83FE 39      cmp   si, 39
            0056E93F    76 06         jbe   short 0056E947
            0056E941    66:83FE 41      cmp   si, 41
            0056E945^ 72 DE         jb      short 0056E925
            0056E947    8D45 F4         lea   eax,
            0056E94A    E8 F563E9FF   call    00404D44
            0056E94F    33D2            xor   edx, edx
            0056E951    8AD3            mov   dl, bl
            0056E953    8BCE            mov   ecx, esi
            0056E955    884C10 FF       mov   , cl
            0056E959    66:83C6 32      add   si, 32
            0056E95D    66:83C6 32      add   si, 32
            0056E961    43            inc   ebx
            0056E962    FE4D E3         dec   byte ptr
            0056E965^ 75 9E         jnz   short 0056E905         ;同样的循环
            0056E967    8BC7            mov   eax, edi               ; 得到字符串S2,本例为"ZWMA83B7VA"
            0056E969    8B4D F0         mov   ecx,           ; S1
            0056E96C    8B55 F4         mov   edx,          ; S2
            0056E96F    E8 C461E9FF   call    00404B38
            0056E974    8D45 EC         lea   eax,
            0056E977    E8 B05EE9FF   call    0040482C
            0056E97C    8D45 E8         lea   eax,
            0056E97F    E8 A85EE9FF   call    0040482C
            0056E984    8D45 E4         lea   eax,
            0056E987    E8 A05EE9FF   call    0040482C
            0056E98C    8B07            mov   eax,              ; S2连接S1,得到字符串S3:"ZWMA83B7VAQGC9ZCCE19"
            0056E98E    E8 5961E9FF   call    00404AEC
            0056E993    83F8 0E         cmp   eax, 0E                ; S3的长度与0E比较
            0056E996    7E 45         jle   short 0056E9DD         ; 不大于则跳
            0056E998    8D45 EC         lea   eax,
            0056E99B    50            push    eax
            0056E99C    8B07            mov   eax,              ; 字符串S3:
            0056E99E    B9 06000000   mov   ecx, 6               ; 这里是参数表示取6位
            0056E9A3    BA 01000000   mov   edx, 1               ; 这里参数表示从第1位取
            0056E9A8    E8 9F63E9FF   call    00404D4C               ; 按照参数取!可以进去看见取得的结果Key1
            0056E9AD    8D45 E8         lea   eax,
            0056E9B0    50            push    eax
            0056E9B1    8B07            mov   eax,              ; 字符串S3:
            0056E9B3    B9 05000000   mov   ecx, 5               ; 这里是参数表示取5位
            0056E9B8    BA 07000000   mov   edx, 7               ; 这里参数表示从第7位取
            0056E9BD    E8 8A63E9FF   call    00404D4C               ; 同样的CALL,得到Key2
            0056E9C2    8D45 E4         lea   eax,
            0056E9C5    50            push    eax
            0056E9C6    8B07            mov   eax,              ; 字符串S3:
            0056E9C8    E8 1F61E9FF   call    00404AEC
            0056E9CD    8BC8            mov   ecx, eax               ; S3的长度
            0056E9CF    8B07            mov   eax,              ; 字符串S3:
            0056E9D1    BA 0C000000   mov   edx, 0C                ; 注意这里的参数0C,从第12位起
            0056E9D6    E8 7163E9FF   call    00404D4C               ; 同样的CALL,得到Key3
            0056E9DB   /EB 7F         jmp   short 0056EA5C
            0056E9DD   |8B07            mov   eax,
            0056E9DF   |E8 0861E9FF   call    00404AEC
            0056E9E4   |83F8 08         cmp   eax, 8               ; S3的长度与8比较
            0056E9E7   |7D 30         jge   short 0056EA19         ; 不小于则跳
            0056E9E9   |8D45 EC         lea   eax,
            0056E9EC   |50            push    eax
            0056E9ED   |8B07            mov   eax,              ; S3
            0056E9EF   |B9 04000000   mov   ecx, 4               ; 取4位
            0056E9F4   |BA 01000000   mov   edx, 1               ; 从第一位起
            0056E9F9   |E8 4E63E9FF   call    00404D4C
            0056E9FE   |8D45 E8         lea   eax,
            0056EA01   |50            push    eax
            0056EA02   |8B07            mov   eax,              ; S3
            0056EA04   |E8 E360E9FF   call    00404AEC
            0056EA09   |8BC8            mov   ecx, eax
            0056EA0B   |8B07            mov   eax,
            0056EA0D   |BA 05000000   mov   edx, 5
            0056EA12   |E8 3563E9FF   call    00404D4C
            0056EA17   |EB 43         jmp   short 0056EA5C
            0056EA19   |8D45 EC         lea   eax,
            0056EA1C   |50            push    eax
            0056EA1D   |8B07            mov   eax,              ; S3
            0056EA1F   |B9 05000000   mov   ecx, 5               ; 取5位
            0056EA24   |BA 01000000   mov   edx, 1               ; 从第1位起
            0056EA29   |E8 1E63E9FF   call    00404D4C
            0056EA2E   |8D45 E8         lea   eax,
            0056EA31   |50            push    eax
            0056EA32   |8B07            mov   eax,
            0056EA34   |B9 04000000   mov   ecx, 4               ; 取4位
            0056EA39   |BA 06000000   mov   edx, 6               ; 从第6位起
            0056EA3E   |E8 0963E9FF   call    00404D4C
            0056EA43   |8D45 E4         lea   eax,
            0056EA46   |50            push    eax
            0056EA47   |8B07            mov   eax,
            0056EA49   |E8 9E60E9FF   call    00404AEC
            0056EA4E   |8BC8            mov   ecx, eax
            0056EA50   |8B07            mov   eax,
            0056EA52   |BA 0A000000   mov   edx, 0A                ;从第10位开始
            0056EA57   |E8 F062E9FF   call    00404D4C
            0056EA5C    837D E4 00      cmp   dword ptr , 0; Key3为空吗?
            0056EA60    74 2C         je      short 0056EA8E         ; 为空则跳!
            0056EA62    FF75 EC         push    dword ptr    ; Key1
            0056EA65    68 F0EA5600   push    0056EAF0
            0056EA6A    FF75 E8         push    dword ptr    ; Key2
            0056EA6D    68 F0EA5600   push    0056EAF0
            0056EA72    FF75 E4         push    dword ptr    ; Key3
            0056EA75    8D45 DC         lea   eax,
            0056EA78    BA 05000000   mov   edx, 5               ; 哈哈,这个参数是干什么用的呢?
            0056EA7D    E8 2A61E9FF   call    00404BAC
            0056EA82    8B45 DC         mov   eax,           ; 真码
            0056EA85    8BD7            mov   edx, edi               ; S3
            0056EA87    E8 58A8E9FF   call    004092E4
            0056EA8C    EB 22         jmp   short 0056EAB0
            0056EA8E    FF75 EC         push    dword ptr
            0056EA91    68 F0EA5600   push    0056EAF0
            0056EA96    FF75 E8         push    dword ptr
            0056EA99    8D45 D8         lea   eax,
            0056EA9C    BA 03000000   mov   edx, 3
            0056EAA1    E8 0661E9FF   call    00404BAC
            0056EAA6    8B45 D8         mov   eax,
            0056EAA9    8BD7            mov   edx, edi
            0056EAAB    E8 34A8E9FF   call    004092E4
            0056EAB0    33C0            xor   eax, eax
            0056EAB2    5A            pop   edx
            0056EAB3    59            pop   ecx
            0056EAB4    59            pop   ecx
            0056EAB5    64:8910         mov   fs:, edx
            0056EAB8    68 DFEA5600   push    0056EADF
            0056EABD    8D45 D8         lea   eax,
            0056EAC0    BA 02000000   mov   edx, 2
            0056EAC5    E8 865DE9FF   call    00404850
            0056EACA    8D45 E4         lea   eax,           ; Key3
            0056EACD    BA 05000000   mov   edx, 5
            0056EAD2    E8 795DE9FF   call    00404850
            0056EAD7    C3            retn
    0056EBDB    8B55 E4         mov   edx,           ; 真码
    0056EBDE    A1 CC5E5F00   mov   eax,           ; 假码
    0056EBE3    E8 5060E9FF   call    00404C38               ; 关键比较
    0056EBE8    0F9445 FF       sete                    ; 也可以在这里爆破
    0056EBEC    33C0            xor   eax, eax
    0056EBEE    5A            pop   edx
    0056EBEF    59            pop   ecx
    0056EBF0    59            pop   ecx
    0056EBF1    64:8910         mov   fs:, edx
    0056EBF4    68 11EC5600   push    0056EC11
    0056EBF9    8B45 F8         mov   eax,
    0056EBFC    E8 BB4DE9FF   call    004039BC
    0056EC01    8B45 F0         mov   eax,
    0056EC04    E8 B34DE9FF   call    004039BC
    0056EC09    C3            retn
005A9924    84C0            test    al, al                     ; 标志位比较
005A9926    74 27         je      short 005A994F             ; 关键跳,跳则注册失败


另:
00404B07    89D6            mov   esi, edx
00404B09    8B79 FC         mov   edi,             ; 机器码长度
00404B0C    8B56 FC         mov   edx,             ; ASCII "H0"的长度=2
00404B0F    01FA            add   edx, edi                ; 相加
00404B11    39CE            cmp   esi, ecx
00404B13    74 17         je      short 00404B2C
00404B15    E8 5E030000   call    00404E78
00404B1A    89F0            mov   eax, esi                ; 机器码
00404B1C    8B4E FC         mov   ecx,             ; 机器码长度
00404B1F    8B13            mov   edx,             ; ASCII "H0"
00404B21    01FA            add   edx, edi
00404B23    E8 F4DEFFFF   call    00402A1C
可以看出,上面的内容其实就是字符串“H0”连接机器码

还有:
004092E4/$53            PUSH EBX
004092E5|.56            PUSH ESI
004092E6|.57            PUSH EDI
004092E7|.8BFA          MOV EDI,EDX
004092E9|.8BF0          MOV ESI,EAX
004092EB|.8BC6          MOV EAX,ESI
004092ED|.E8 FAB7FFFF   CALL vip.00404AEC
004092F2|.8BD8          MOV EBX,EAX
004092F4|.8BC7          MOV EAX,EDI
004092F6|.8BD3          MOV EDX,EBX
004092F8|.E8 7BBBFFFF   CALL vip.00404E78
004092FD|.8BD6          MOV EDX,ESI
004092FF|.8B37          MOV ESI,DWORD PTR DS:
00409301|.85DB          TEST EBX,EBX
00409303|.74 15         JE SHORT vip.0040931A
00409305|>8A02          /MOV AL,BYTE PTR DS:
00409307|.3C 61         |CMP AL,61
00409309|.72 06         |JB SHORT vip.00409311
0040930B|.3C 7A         |CMP AL,7A
0040930D|.77 02         |JA SHORT vip.00409311
0040930F|.2C 20         |SUB AL,20
00409311|>8806          |MOV BYTE PTR DS:,AL
00409313|.42            |INC EDX
00409314|.46            |INC ESI
00409315|.4B            |DEC EBX
00409316|.85DB          |TEST EBX,EBX
00409318|.^ 75 EB         \JNZ SHORT vip.00409305
0040931A|>5F            POP EDI                     //对注册码检测就是有小写字母转大写
0040931B|.5E            POP ESI
0040931C|.5B            POP EBX
0040931D\.C3            RETN
即小写字母转大写



/////////////////////////////////////////////////////////////////////////////////////////////////////////
ok,现在这软件的注册算法基本清楚了!
0.字符串“HO”连接机器码,得到变形的机器码。本例为H0Y31QH89E;
1.依次取变形的机器码(本例为H0Y31QH89E)每一位ASC,按照下述方式运算:
第一位ASC + 64 的和 除以 常数5B,其余数作为ASC,得到对应的字符,(对余数的检测及变化见0056E889 - 0056E8A9区间,有可能会影响到下一位的运算结果。此略)
第二位ASC + [(第一位运算的余数 + 64) * 2]除以 常数5B ,其余数作为ASC,得到对应的字符,
第三位ASC + [ (第二位运算的余数 + 64)* 2]除以 常数5B ,其余数作为ASC,得到对应的字符,
   ...
以此类推,直到变形机器码取完为止,得到字符串(本例为“QGC9ZCCE19”),设为S1;
如果S1的长度为0,则略过下面的2这一步。而S3就等价于S1了!
2.与得到S1的方法一样,同样对S1进行取余的运算。(在此略过)得到字符串S2(本例为"ZWMA83B7VA");
3.S2连接S1,得到S3(本例为“ZWMA83B7VAQGC9ZCCE19”);
4.根据S3的长度,分别对应如下的注册码形式
a.S3长度<8,则注册码形式为:****-***;               (第二段为S3的第5位开始剩下的部分)
b.7< S3长度<15,则注册码形式为:*****-****-*****;   (第三段为S3的第9位开始剩下的部分)
c.14<S3长度,则注册码形式为:******-*****-****...   (第三段为S3的第12位开始剩下的部分)
本例S3为20位,则注册码为:ZWMA83-B7VAQ-GC9ZCCE19
有小写字母则转为大写!
//////////////////////////////////////////////////////////////////////////////////////////////////


关于算法总结中得到S1的过程举例如下:
                                     本机变形的机器码(本例为H0Y31QH89E)
第一位为H,ASC为48(16进制,下同)。
    (48 + 64) /5B ,
    得到的余数为51H,(经过余数检测运算仍然不变)将其看做ASC码,则其对应的字符为“Q”,得到S1的第1位;
第二位为0,ASC为30(16进制),则:
    / 5B ,
    得到的余数为2E,(注意:经过余数检测运算,2E变为47了,具体参见0056E889 - 0056E8A9区间),将其看作ASC码,则其对应的字符为“G”,得到S1的第2位;
...
最终得到S1为“QGC9ZCCE19”


好,咱输入注册码:ZWMA83-B7VAQ-GC9ZCCE19,注册成功!且注册按钮已变灰!

注册信息保存在:

"rc"="ZWMA83-B7VAQ-GC9ZCCE19"
"sysj"=hex:00,00,00,00,c0,d2,e3,40

删除变回未注册版!


坏男孩 发表于 2011-2-25 20:27:32

不是很懂呵呵

老万 发表于 2011-2-28 07:41:21

学习了,写的很详细

pygcnm 发表于 2011-3-1 10:48:42

看到眼都花了了

8263726 发表于 2011-3-2 16:53:28

牛B! 佩服!

剑客之道 发表于 2011-3-3 19:12:49

支持楼主,特别是算法这段写的非常清晰。谢谢!

a1250377248 发表于 2011-3-6 10:39:04

哇神圣的一刻就来了
页: [1]
查看完整版本: ****管理系统单机版的注册算法分析