好友
阅读权限 40
听众
最后登录 1970-1-1
zaas
发表于 2010-3-27 11:00
本帖最后由 zaas 于 2010-3-27 11:32 编辑
【破文标题】清灵起名软件 1.6 算法分析及算法注册机
【破文作者】zaas[PYG][FCT]
【破解 工具】OllyICE,PEiD v0.94
【破解平台】WinXP
【软件名称】清灵起名软件 1.6
【更新时间】2010-3-25
【软件类别】国产软件/测字算命
【软件语言】简体中文
【应用平台】WinXP/2000/2003/Vista
【软件性质】共享(收费)软件
【软件大小】848KB
【原版下载】http://www.newhua.com/soft/95584.htm
【保护方式】注册码
【软件简介】常言道:赐子千金,不如教一艺在身。教子一艺,不如赐子好名字。
足见父母为子女取好名的重要意义。因名以定形,名以定事,事以验名。
姓名关系到人一生的事业、健康、婚姻、父母和人际关系等等,一个好的名字是您送给孩子无价的财富。
孔子说:“名不正则言不顺”。
苏东坡说:“世间唯名实不可欺”。
严复说:“一名之立,旬月踟躅”。
诸先贤都道出了姓名对人的重要性。
清灵起名软件, 根据输入的出生日期, 给出起名建议. 用户可进行五行, 笔画, 部首, 格局评分, 三才五格等进行筛选.
【破解声明】我是一只小菜鸟,偶得一点心得,愿与大家分享:)年后忙的一塌糊涂,可悲可叹。
--------------------------------------------------------------
【破解内容】
--------------------------------------------------------------
**************************************************************
用PEiD查壳,Borland Delphi 6.0 - 7.0
**************************************************************
DEDE查找按钮事件,注册按钮的RVA在:004A445C
OD载入,下断分析。发现启动验证也在这里。
004A445C /. 55 push ebp
004A445D |. 8BEC mov ebp, esp
004A445F |. 6A 00 push 0
004A4461 |. 6A 00 push 0
004A4463 |. 6A 00 push 0
004A4465 |. 53 push ebx
004A4466 |. 8BD8 mov ebx, eax
004A4468 |. 33C0 xor eax, eax
004A446A |. 55 push ebp
004A446B |. 68 2D454A00 push 004A452D
004A4470 |. 64:FF30 push dword ptr fs:[eax]
004A4473 |. 64:8920 mov dword ptr fs:[eax], esp
004A4476 |. 8D55 F8 lea edx, dword ptr [ebp-8]
004A4479 |. 8B83 18030000 mov eax, dword ptr [ebx+318]
004A447F |. E8 A05AFCFF call 00469F24
004A4484 |. 8B55 F8 mov edx, dword ptr [ebp-8]
004A4487 |. B8 44454A00 mov eax, 004A4544 ; 假码
004A448C |. E8 73F6FFFF call 004A3B04
004A4491 |. E8 6EF7FFFF call 004A3C04
004A4496 |. 8D55 F4 lea edx, dword ptr [ebp-C]
004A4499 |. 8B83 18030000 mov eax, dword ptr [ebx+318]
004A449F |. E8 805AFCFF call 00469F24
004A44A4 |. 8B45 F4 mov eax, dword ptr [ebp-C]
004A44A7 |. 8D55 FC lea edx, dword ptr [ebp-4]
004A44AA |. E8 5545F6FF call 00408A04
004A44AF |. 8B45 FC mov eax, dword ptr [ebp-4]
004A44B2 |. E8 39FAFFFF call 004A3EF0 ; 验证1次,关键call
004A44B7 |. 84C0 test al, al ; 跳向试用版
004A44B9 |. 74 3A je short 004A44F5
004A44BB |. 6A 00 push 0
004A44BD |. 66:8B0D 4C454>mov cx, word ptr [4A454C]
004A44C4 |. B2 02 mov dl, 2
004A44C6 |. A1 588B5B00 mov eax, dword ptr [5B8B58]
004A44CB |. E8 1C3AF9FF call 00437EEC
004A44D0 |. 8B45 FC mov eax, dword ptr [ebp-4]
004A44D3 |. E8 18FAFFFF call 004A3EF0 ; 再一次验证。al值作为参数使用
004A44D8 |. 8B15 D0755D00 mov edx, dword ptr [5D75D0] ; 清灵起名.005B8B30
004A44DE |. 8802 mov byte ptr [edx], al
004A44E0 |. A1 54765D00 mov eax, dword ptr [5D7654]
004A44E5 |. 8B00 mov eax, dword ptr [eax]
004A44E7 |. E8 0C360700 call 00517AF8
004A44EC |. 8BC3 mov eax, ebx
004A44EE |. E8 512DFEFF call 00487244
004A44F3 |. EB 15 jmp short 004A450A
既然al的赋值是问题的关键,自然要跟进关键call看看:004A3EF0 /[ DISCUZ_CODE_1 ]nbsp; 55 push ebp
004A3EF1 |. 8BEC mov ebp, esp
004A3EF3 |. 33C9 xor ecx, ecx
004A3EF5 |. 51 push ecx
004A3EF6 |. 51 push ecx
004A3EF7 |. 51 push ecx
004A3EF8 |. 51 push ecx
004A3EF9 |. 51 push ecx
004A3EFA |. 51 push ecx
004A3EFB |. 51 push ecx
004A3EFC |. 53 push ebx
004A3EFD |. 8945 FC mov dword ptr [ebp-4], eax
004A3F00 |. 8B45 FC mov eax, dword ptr [ebp-4]
004A3F03 |. E8 1C08F6FF call 00404724
004A3F08 |. 33C0 xor eax, eax
004A3F0A |. 55 push ebp
004A3F0B |. 68 3D404A00 push 004A403D
004A3F10 |. 64:FF30 push dword ptr fs:[eax]
004A3F13 |. 64:8920 mov dword ptr fs:[eax], esp
004A3F16 |. B3 01 mov bl, 1 ;标志位赋值
004A3F18 |. 8D55 F4 lea edx, dword ptr [ebp-C]
004A3F1B |. 8B45 FC mov eax, dword ptr [ebp-4]
004A3F1E |. E8 E14AF6FF call 00408A04
004A3F23 |. 8B55 F4 mov edx, dword ptr [ebp-C]
004A3F26 |. 8D45 FC lea eax, dword ptr [ebp-4]
004A3F29 |. E8 DE03F6FF call 0040430C
004A3F2E |. 8B45 FC mov eax, dword ptr [ebp-4]
004A3F31 |. E8 FE05F6FF call 00404534
004A3F36 |. 83F8 20 cmp eax, 20 ; 注册码32位
004A3F39 |. 74 07 je short 004A3F42 ; 不等则死
004A3F3B |. 33DB xor ebx, ebx
004A3F3D |. E9 E0000000 jmp 004A4022
004A3F42 |> 8D45 F0 lea eax, dword ptr [ebp-10]
004A3F45 |. E8 9EFEFFFF call 004A3DE8 ; 机器码字符串
004A3F4A |. 8B55 F0 mov edx, dword ptr [ebp-10]
004A3F4D |. A1 B48D5D00 mov eax, dword ptr [5D8DB4]
004A3F52 |. E8 2907F6FF call 00404680
004A3F57 |. 74 07 je short 004A3F60
004A3F59 |. 33DB xor ebx, ebx
004A3F5B |. E9 C2000000 jmp 004A4022
004A3F60 |> FF35 548B5B00 push dword ptr [5B8B54] ; qingling
004A3F66 |. FF35 B48D5D00 push dword ptr [5D8DB4] ; 机器码
004A3F6C |. FF35 508B5B00 push dword ptr [5B8B50] ; CQL
004A3F72 |. 8D45 EC lea eax, dword ptr [ebp-14]
004A3F75 |. BA 03000000 mov edx, 3
004A3F7A |. E8 7506F6FF call 004045F4 ; 组合
004A3F7F |. 8B45 EC mov eax, dword ptr [ebp-14]
004A3F82 |. 8D55 F8 lea edx, dword ptr [ebp-8]
004A3F85 |. E8 0AF0FFFF call 004A2F94 ; MD5--》STR1
004A3F8A |. B8 01000000 mov eax, 1
004A3F8F |> 8BD0 /mov edx, eax ; 比较
004A3F91 |. 03D2 |add edx, edx
004A3F93 |. 8B4D FC |mov ecx, dword ptr [ebp-4]
004A3F96 |. 8A5411 FE |mov dl, byte ptr [ecx+edx-2] ; 取假码奇数位
004A3F9A |. 8B4D F8 |mov ecx, dword ptr [ebp-8] ; STR1
004A3F9D |. 3A5401 FF |cmp dl, byte ptr [ecx+eax-1]
004A3FA1 |. 74 04 |je short 004A3FA7
004A3FA3 |. 33DB |xor ebx, ebx
004A3FA5 |. EB 7B |jmp short 004A4022
004A3FA7 |> 40 |inc eax
004A3FA8 |. 83F8 10 |cmp eax, 10 ; 比较15位
004A3FAB |.^ 75 E2 \jnz short 004A3F8F
004A3FAD |. 8D45 E4 lea eax, dword ptr [ebp-1C]
004A3FB0 |. 50 push eax
004A3FB1 |. B9 10000000 mov ecx, 10
004A3FB6 |. BA 11000000 mov edx, 11
004A3FBB |. 8B45 F8 mov eax, dword ptr [ebp-8]
004A3FBE |. E8 D107F6FF call 00404794 ; MD5字符串后半段
004A3FC3 |. 8B45 E4 mov eax, dword ptr [ebp-1C]
004A3FC6 |. 8D55 E8 lea edx, dword ptr [ebp-18]
004A3FC9 |. E8 C6EFFFFF call 004A2F94 ; MD5之--》STR2
004A3FCE |. 8B55 E8 mov edx, dword ptr [ebp-18]
004A3FD1 |. 8D45 F8 lea eax, dword ptr [ebp-8]
004A3FD4 |. E8 3303F6FF call 0040430C
004A3FD9 |. B8 01000000 mov eax, 1
004A3FDE |> 8BD0 /mov edx, eax
004A3FE0 |. 03D2 |add edx, edx
004A3FE2 |. 8B4D FC |mov ecx, dword ptr [ebp-4] ; 假码
004A3FE5 |. 8A5411 FF |mov dl, byte ptr [ecx+edx-1] ; 第偶数位
004A3FE9 |. 8B4D F8 |mov ecx, dword ptr [ebp-8] ; STR2
004A3FEC |. 3A5401 0F |cmp dl, byte ptr [ecx+eax+F] ; STR2后半段
004A3FF0 |. 74 04 |je short 004A3FF6
004A3FF2 |. 33DB |xor ebx, ebx
004A3FF4 |. EB 2C |jmp short 004A4022
004A3FF6 |> 40 |inc eax
004A3FF7 |. 83F8 10 |cmp eax, 10 ; 比较15位
004A3FFA |.^ 75 E2 \jnz short 004A3FDE
004A3FFC |. A1 B48D5D00 mov eax, dword ptr [5D8DB4] ; 机器码
004A4001 |. 8A40 03 mov al, byte ptr [eax+3] ; 第四位
004A4004 |. 8B55 FC mov edx, dword ptr [ebp-4] ; 假码
004A4007 |. 3A42 1E cmp al, byte ptr [edx+1E] ; 第31位
004A400A |. 74 04 je short 004A4010 ; 不等跳死
004A400C |. 33DB xor ebx, ebx
004A400E |. EB 12 jmp short 004A4022
004A4010 |> A1 B48D5D00 mov eax, dword ptr [5D8DB4] ; 机器码
004A4015 |. 8A40 0A mov al, byte ptr [eax+A] ; 第11位
004A4018 |. 8B55 FC mov edx, dword ptr [ebp-4] ; 假码
004A401B |. 3A42 1F cmp al, byte ptr [edx+1F] ; 第32位
004A401E |. 74 02 je short 004A4022 ; 不等跳死
004A4020 |. 33DB xor ebx, ebx ; bl为标志位,跳到这里的都死
004A4022 |> 33C0 xor eax, eax
004A4024 |. 5A pop edx
004A4025 |. 59 pop ecx
004A4026 |. 59 pop ecx
004A4027 |. 64:8910 mov dword ptr fs:[eax], edx
004A402A |. 68 44404A00 push 004A4044
004A402F |> 8D45 E4 lea eax, dword ptr [ebp-1C]
004A4032 |. BA 07000000 mov edx, 7
004A4037 |. E8 5C02F6FF call 00404298
004A403C \. C3 retn
004A403D .^ E9 B2FBF5FF jmp 00403BF4
004A4042 .^ EB EB jmp short 004A402F
004A4044 . 8BC3 mov eax, ebx ; bl给al赋值,爆破点
004A4046 . 5B pop ebx
004A4047 . 8BE5 mov esp, ebp
004A4049 . 5D pop ebp
004A404A . C3 retn
算法不复杂。根据堆栈中传递的字符串可以看出注册算法为明显的MD5算法,用MD5计算器验证发现为标准MD5.
爆破点也很清晰,在:
004A4044 . 8BC3 mov eax, ebx
修改为 inc eax,两个字节即可搞定。
【算法总结】软件用了个简单的方法避免明码比较。
第一步:把序列号和“Qingling”,“CQL”组合求MD5.得到STR1
第二步:Str1后半段求MD5,取MD5结果的后半段得到STR2
第三步:STR1的前15位作为注册码的1-30位中的奇数位;
Str2的前15位作为注册码的1-30位中的偶数位;
机器码的第四位作为注册码的第31位;
机器码的第11位作为注册码的第32位。
综上所述,写出VB注册机。注册机关键代码如下:
Dim Str1 As String
Dim Str2 As String
Str1 = "Qingling" & id & "CQL"
Str1 = Md5(Str1)
Str2 = Right(Md5(Right(Str1, 16)), 16)
Dim Regcode(32) As String
For A = 1 To 15
Regcode(2 * A - 1) = Mid(Str1, A, 1)
Regcode(2 * A) = Mid(Str2, A, 1)
Next
Regcode(31) = Mid(id, 4, 1)
Regcode(32) = Mid(id, 11, 1)
【版权声明】破文是学习的手记,兴趣是成功的源泉;本破文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!