【破文标题】通用合同管理系统 1.5注册算法分析
【破文作者】XXNB
【作者邮箱】
【作者主页】http://free.ys168.com/?binbinbin7456
【破解工具】OD
【破解平台】xpsp2
【软件名称】通用合同管理系统 1.5
【软件大小】1097KB
【原版下载】http://www.onlinedown.net/soft/1122.htm
【保护方式】名+码
【软件简介】一款功能强大的合同管理软件,为您的管理提供强力支持!
软件大小:1097KB
软件语言:简体中文
软件类别:国产软件/共享版/办公软件
运行环境:Win9x/Me/NT/2000/XP/2003
加入时间:2006-11-7 16:46:57
    通用合同管理是一款简单、易用,界面友好的企业管理软件,支持计划付款、付款提醒、发票管理、报表打印、台账打印等多项功能,能

大大提高您的工作效率与质量,是广大中小企业合同管理的好助手。
    本系统提供ACCESS单机版和SQL Server网络版
【破解声明】向大侠们学习!!!只为学习!
------------------------------------------------------------------------
【破解过程】
------------------------------------------------------------------------

1、字符串参考“注册成功,谢谢您使用正式版”可以轻松定位。注:“破解一个软件,找到关键断点是最最最重要的。”


0052E460  |.  55            push    ebp                就下端在这里把。F2
0052E461  |.  68 DAE55200   push    0052E5DA
0052E466  |.  64:FF30       push    dword ptr fs:[eax]
0052E469  |.  64:8920       mov     fs:[eax], esp
0052E46C  |.  8D55 FC       lea     edx, [ebp-4]
0052E46F  |.  8B83 08030000 mov     eax, [ebx+308]
0052E475  |.  E8 FA70F3FF   call    00465574
0052E47A  |.  8B45 FC       mov     eax, [ebp-4]                     ;  用户名
0052E47D  |.  E8 D661EDFF   call    00404658                         ;  计算位数
0052E482  |.  83F8 06       cmp     eax, 6                           ;  必须大于6位。看提示
0052E485  |.  7D 1D         jge     short 0052E4A4
0052E487  |.  B8 F0E55200   mov     eax, 0052E5F0                    ;  请重新输入需注册的用户名,六个英文字母(数字)或三个

汉字以上!
0052E48C  |.  E8 B3B2F0FF   call    00439744
0052E491  |.  8B83 08030000 mov     eax, [ebx+308]
0052E497  |.  8B10          mov     edx, [eax]
0052E499  |.  FF92 C4000000 call    [edx+C4]
0052E49F  |.  E9 06010000   jmp     0052E5AA
0052E4A4  |>  8D55 F8       lea     edx, [ebp-8]
0052E4A7  |.  8B83 0C030000 mov     eax, [ebx+30C]
0052E4AD  |.  E8 C270F3FF   call    00465574
0052E4B2  |.  8B45 F8       mov     eax, [ebp-8]                     ;  假码
0052E4B5  |.  50            push    eax
0052E4B6  |.  8D55 F0       lea     edx, [ebp-10]
0052E4B9  |.  8B83 04030000 mov     eax, [ebx+304]
0052E4BF  |.  E8 B070F3FF   call    00465574
0052E4C4  |.  8B45 F0       mov     eax, [ebp-10]                    ;  机器码出现
0052E4C7  |.  E8 3CABEDFF   call    00409008                         ;  这个call的作用是把机器码转成16进制。执行到这句时,在

eax可以看到。
0052E4CC  |.  50            push    eax
0052E4CD  |.  8D55 EC       lea     edx, [ebp-14]
0052E4D0  |.  8B83 08030000 mov     eax, [ebx+308]
0052E4D6  |.  E8 9970F3FF   call    00465574
0052E4DB  |.  8B45 EC       mov     eax, [ebp-14]                    ;  取得用户名
0052E4DE  |.  8D4D F4       lea     ecx, [ebp-C]
0052E4E1  |.  5A            pop     edx
0052E4E2  |.  E8 B1FDFFFF   call    0052E298                         ;  关键算法call          《------------
0052E4E7  |.  8B55 F4       mov     edx, [ebp-C]                     ;  明码比较。不是吧!!这里可以做内存注册机了。
0052E4EA  |.  58            pop     eax                              ;  假码出栈
0052E4EB  |.  E8 B462EDFF   call    004047A4                         ;  经典比较函数
0052E4F0  |.  0F85 AA000000 jnz     0052E5A0                         ;  关键跳
0052E4F6  |.  B2 01         mov     dl, 1
0052E4F8  |.  A1 C4144400   mov     eax, [4414C4]
0052E4FD  |.  E8 C230F1FF   call    004415C4
0052E502  |.  8BF0          mov     esi, eax
0052E504  |.  BA 02000080   mov     edx, 80000002
0052E509  |.  8BC6          mov     eax, esi
0052E50B  |.  E8 5431F1FF   call    00441664
0052E510  |.  B1 01         mov     cl, 1
0052E512  |.  BA 38E65200   mov     edx, 0052E638                    ;  

software\microsoft\windows\currentversion\explorer\advanced
0052E517  |.  8BC6          mov     eax, esi
0052E519  |.  E8 AA31F1FF   call    004416C8
0052E51E  |.  84C0          test    al, al
0052E520  |.  0F84 84000000 je      0052E5AA
0052E526  |.  BA 7CE65200   mov     edx, 0052E67C                    ;  ie
0052E52B  |.  8BC6          mov     eax, esi
0052E52D  |.  E8 2A34F1FF   call    0044195C
0052E532  |.  84C0          test    al, al
0052E534  |.  74 74         je      short 0052E5AA
0052E536  |.  33C9          xor     ecx, ecx
0052E538  |.  BA 7CE65200   mov     edx, 0052E67C                    ;  ie
0052E53D  |.  8BC6          mov     eax, esi
0052E53F  |.  E8 F832F1FF   call    0044183C
0052E544  |.  8BC6          mov     eax, esi
0052E546  |.  E8 E930F1FF   call    00441634
0052E54B  |.  8BC6          mov     eax, esi
0052E54D  |.  E8 D64FEDFF   call    00403528
0052E552  |.  B8 88E65200   mov     eax, 0052E688                    ;  注册成功,谢谢您使用正式版!客服信箱:who2u@e165.com
0052E557  |.  E8 E8B1F0FF   call    00439744
0052E55C  |.  8BC3          mov     eax, ebx
0052E55E  |.  E8 0D44F5FF   call    00482970
0052E563  |.  A1 7C765300   mov     eax, [53767C]
0052E568  |.  8B00          mov     eax, [eax]
0052E56A  |.  8B80 F8020000 mov     eax, [eax+2F8]
0052E570  |.  8B80 08020000 mov     eax, [eax+208]
0052E576  |.  BA 03000000   mov     edx, 3
0052E57B  |.  E8 DC89F1FF   call    00446F5C
0052E580  |.  BA C8E65200   mov     edx, 0052E6C8                    ;  本软件已成功注册!
0052E585  |.  E8 2E89F1FF   call    00446EB8
0052E58A  |.  A1 7C765300   mov     eax, [53767C]
0052E58F  |.  8B00          mov     eax, [eax]
0052E591  |.  8B80 14040000 mov     eax, [eax+414]
0052E597  |.  33D2          xor     edx, edx
0052E599  |.  E8 7A93F4FF   call    00477918
0052E59E  |.  EB 0A         jmp     short 0052E5AA
0052E5A0  |>  B8 E4E65200   mov     eax, 0052E6E4                    ;  您输入的注册码不正确,无法注册!
0052E5A5  |.  E8 9AB1F0FF   call    00439744
0052E5AA  |>  33C0          xor     eax, eax



2、跟进算法call:0052E4E2    call    0052E298 。得到下面代码,具体请看注释。




0052E298  /$  55            push    ebp
0052E299  |.  8BEC          mov     ebp, esp
0052E29B  |.  83C4 EC       add     esp, -14
0052E29E  |.  53            push    ebx
0052E29F  |.  56            push    esi
0052E2A0  |.  57            push    edi
0052E2A1  |.  33DB          xor     ebx, ebx
0052E2A3  |.  895D F0       mov     [ebp-10], ebx
0052E2A6  |.  895D EC       mov     [ebp-14], ebx
0052E2A9  |.  8BF9          mov     edi, ecx
0052E2AB  |.  66:8955 FA    mov     [ebp-6], dx                      ;  机器码的16进制的低4位存储在这里。为下面的循环赋初值准


0052E2AF  |.  8945 FC       mov     [ebp-4], eax
0052E2B2  |.  8B45 FC       mov     eax, [ebp-4]                     ;  用户名
0052E2B5  |.  E8 8E65EDFF   call    00404848
0052E2BA  |.  33C0          xor     eax, eax
0052E2BC  |.  55            push    ebp
0052E2BD  |.  68 BCE35200   push    0052E3BC
0052E2C2  |.  64:FF30       push    dword ptr fs:[eax]
0052E2C5  |.  64:8920       mov     fs:[eax], esp
0052E2C8  |.  8BC7          mov     eax, edi
0052E2CA  |.  8B55 FC       mov     edx, [ebp-4]                     ;  用户名
0052E2CD  |.  E8 1A61EDFF   call    004043EC
0052E2D2  |.  8B45 FC       mov     eax, [ebp-4]
0052E2D5  |.  E8 7E63EDFF   call    00404658                         ;  得到位数
0052E2DA  |.  8BF0          mov     esi, eax                         ;  位数放到esi
0052E2DC  |.  85F6          test    esi, esi                         ;  一看就知道要循环了
0052E2DE  |.  7E 44         jle     short 0052E324
0052E2E0  |.  BB 01000000   mov     ebx, 1                           ;  计数器赋值1
0052E2E5  |>  8BC7          /mov     eax, edi
0052E2E7  |.  E8 C465EDFF   |call    004048B0
0052E2EC  |.  8B55 FC       |mov     edx, [ebp-4]
0052E2EF  |.  8A541A FF     |mov     dl, [edx+ebx-1]                 ;  逐个取用户名  放到dl
0052E2F3  |.  0FB74D FA     |movzx   ecx, word ptr [ebp-6]           ;  第一次开始是机器码低4位。第二次开始是上一次循环得到的

值,注意,都是8位的(低4位),
0052E2F7  |.  C1E9 08       |shr     ecx, 8                          ;  右移8位
0052E2FA  |.  32D1          |xor     dl, cl                          ;  异或  结果放在dl    就是用户名的ASCII码值和右移后的值
0052E2FC  |.  885418 FF     |mov     [eax+ebx-1], dl                 ;  存储上面得到的结果dl。就是替换掉相应位置
0052E300  |.  8B07          |mov     eax, [edi]
0052E302  |.  0FB64418 FF   |movzx   eax, byte ptr [eax+ebx-1]       ;  就是刚才上面dl里面的值
0052E307  |.  66:0345 FA    |add     ax, [ebp-6]                     ;  加 “第一次开始是机器码低4位。第二次开始是上一次循环

得到的值,注意,都是8位的(低4位),”
0052E30B  |.  66:69C0 71D4  |imul    ax, ax, 0D471                   ;  乘以固定值0D471,结果放在ax。8位的哦。就是EAX的后面4


0052E310  |.  66:05 2C01    |add     ax, 12C                         ;  加12C
0052E314  |.  66:05 FE7D    |add     ax, 7DFE                        ;  再加7DFE
0052E318  |.  66:2D 3F48    |sub     ax, 483F                        ;  减483F
0052E31C  |.  66:8945 FA    |mov     [ebp-6], ax                     ;  存储结果,提供给下次循环。
0052E320  |.  43            |inc     ebx                             ;  计数器
0052E321  |.  4E            |dec     esi
0052E322  |.^ 75 C1         \jnz     short 0052E2E5                  ;  往回继续循环。这里这个循环要注意的是最后的结果在dl
0052E324  |>  8D45 FC       lea     eax, [ebp-4]
0052E327  |.  8B17          mov     edx, [edi]
0052E329  |.  E8 0261EDFF   call    00404430                         ;  
0052E32E  |.  8BC7          mov     eax, edi
0052E330  |.  E8 6360EDFF   call    00404398
0052E335  |.  8B45 FC       mov     eax, [ebp-4]
0052E338  |.  E8 1B63EDFF   call    00404658
0052E33D  |.  8BF0          mov     esi, eax                         ;  得到位数
0052E33F  |.  85F6          test    esi, esi
0052E341  |.  7E 56         jle     short 0052E399
0052E343  |.  BB 01000000   mov     ebx, 1                           ;  计数器赋值1
0052E348  |>  8B45 FC       /mov     eax, [ebp-4]                    ;下面这个循环是取上面的结果dl
0052E34B  |.  0FB64418 FF   |movzx   eax, byte ptr [eax+ebx-1]       ;  
0052E350  |.  8945 F4       |mov     [ebp-C], eax
0052E353  |.  FF37          |push    dword ptr [edi]                 ;  真注册码逐个入栈连接
0052E355  |.  8B45 F4       |mov     eax, [ebp-C]
0052E358  |.  B9 1A000000   |mov     ecx, 1A                         ;  固定值1A
0052E35D  |.  99            |cdq
0052E35E  |.  F7F9          |idiv    ecx                             ;  除以1A
0052E360  |.  8BD0          |mov     edx, eax                        ;  把结果放在edx
0052E362  |.  80C2 41       |add     dl, 41                          ;  +41   这里是除以后,整数部位+41
0052E365  |.  8D45 F0       |lea     eax, [ebp-10]                   ;  上面得到的值(dl) 查ASCII表转成相应字符,就是真码的

字符了
0052E368  |.  E8 1362EDFF   |call    00404580
0052E36D  |.  FF75 F0       |push    dword ptr [ebp-10]
0052E370  |.  8B45 F4       |mov     eax, [ebp-C]
0052E373  |.  B9 1A000000   |mov     ecx, 1A                         ;  固定值1A
0052E378  |.  99            |cdq
0052E379  |.  F7F9          |idiv    ecx                             ;  又是除以1A
0052E37B  |.  80C2 41       |add     dl, 41                          ;  结果又加41   这里是除以后,余数部位+41
0052E37E  |.  8D45 EC       |lea     eax, [ebp-14]                   ;  上面得到的值(dl) 查ASCII表转成相应字符,就是真码的

字符了
0052E381  |.  E8 FA61EDFF   |call    00404580
0052E386  |.  FF75 EC       |push    dword ptr [ebp-14]
0052E389  |.  8BC7          |mov     eax, edi
0052E38B  |.  BA 03000000   |mov     edx, 3
0052E390  |.  E8 8363EDFF   |call    00404718
0052E395  |.  43            |inc     ebx
0052E396  |.  4E            |dec     esi
0052E397  |.^ 75 AF         \jnz     short 0052E348                  ;  循环回去
0052E399  |>  33C0          xor     eax, eax
0052E39B  |.  5A            pop     edx
0052E39C  |.  59            pop     ecx


【算法总结】
------------------------------------------------------------------------
1、整个算法和注册名,机器码有关系。比较简单。

2、首先是机器码要转成16进制,取它的低4位作为用户名循环运算的初始值。

3、逐个取用户名的ASCII码值放在dl,第一次使用机器码的低4位右移8位后放在cl。然后dl和cl异或。异或的结果加上机器码的低4位,再乘以

固定值0D471,再加12C,再加7DFE,最后减483F。这里一连串的运算最终的值的低4位将替换机器码的低4位继续循环。

4、上次每次循环得到的值存放在dl。然后生成真码的循环将逐个取这些dl进行运算。

5、真码的运算是,取得dl,除以固定值1A,整数部分加41(16进制)后,查ASCII表转成相应字符成为注册码字符。余数部分也加41(16进制

),同样也查ASCII表转成相应字符成为下一个注册码字符。

6、上面注册码的运算,每次循环将得到两个字符,所以,真码是用户名的2倍。