【破文标题】通用合同管理系统 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倍。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)