清灵起名软件 1.6 算法分析及算法注册机
本帖最后由 zaas 于 2010-3-27 11:32 编辑【破文标题】清灵起名软件 1.6 算法分析及算法注册机
【破文作者】zaas
【破解工具】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:
004A4473|.64:8920 mov dword ptr fs:, esp
004A4476|.8D55 F8 lea edx, dword ptr
004A4479|.8B83 18030000 mov eax, dword ptr
004A447F|.E8 A05AFCFF call 00469F24
004A4484|.8B55 F8 mov edx, dword ptr
004A4487|.B8 44454A00 mov eax, 004A4544 ;假码
004A448C|.E8 73F6FFFF call 004A3B04
004A4491|.E8 6EF7FFFF call 004A3C04
004A4496|.8D55 F4 lea edx, dword ptr
004A4499|.8B83 18030000 mov eax, dword ptr
004A449F|.E8 805AFCFF call 00469F24
004A44A4|.8B45 F4 mov eax, dword ptr
004A44A7|.8D55 FC lea edx, dword ptr
004A44AA|.E8 5545F6FF call 00408A04
004A44AF|.8B45 FC mov eax, dword ptr
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
004A44C4|.B2 02 mov dl, 2
004A44C6|.A1 588B5B00 mov eax, dword ptr
004A44CB|.E8 1C3AF9FF call 00437EEC
004A44D0|.8B45 FC mov eax, dword ptr
004A44D3|.E8 18FAFFFF call 004A3EF0 ;再一次验证。al值作为参数使用
004A44D8|.8B15 D0755D00 mov edx, dword ptr ;清灵起名.005B8B30
004A44DE|.8802 mov byte ptr , al
004A44E0|.A1 54765D00 mov eax, dword ptr
004A44E5|.8B00 mov eax, dword ptr
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 , eax
004A3F00|.8B45 FC mov eax, dword ptr
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:
004A3F13|.64:8920 mov dword ptr fs:, esp
004A3F16|.B3 01 mov bl, 1 ;标志位赋值
004A3F18|.8D55 F4 lea edx, dword ptr
004A3F1B|.8B45 FC mov eax, dword ptr
004A3F1E|.E8 E14AF6FF call 00408A04
004A3F23|.8B55 F4 mov edx, dword ptr
004A3F26|.8D45 FC lea eax, dword ptr
004A3F29|.E8 DE03F6FF call 0040430C
004A3F2E|.8B45 FC mov eax, dword ptr
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
004A3F45|.E8 9EFEFFFF call 004A3DE8 ;机器码字符串
004A3F4A|.8B55 F0 mov edx, dword ptr
004A3F4D|.A1 B48D5D00 mov eax, dword ptr
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 ;qingling
004A3F66|.FF35 B48D5D00 push dword ptr ;机器码
004A3F6C|.FF35 508B5B00 push dword ptr ;CQL
004A3F72|.8D45 EC lea eax, dword ptr
004A3F75|.BA 03000000 mov edx, 3
004A3F7A|.E8 7506F6FF call 004045F4 ;组合
004A3F7F|.8B45 EC mov eax, dword ptr
004A3F82|.8D55 F8 lea edx, dword ptr
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
004A3F96|.8A5411 FE |mov dl, byte ptr ;取假码奇数位
004A3F9A|.8B4D F8 |mov ecx, dword ptr ;STR1
004A3F9D|.3A5401 FF |cmp dl, byte ptr
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
004A3FB0|.50 push eax
004A3FB1|.B9 10000000 mov ecx, 10
004A3FB6|.BA 11000000 mov edx, 11
004A3FBB|.8B45 F8 mov eax, dword ptr
004A3FBE|.E8 D107F6FF call 00404794 ;MD5字符串后半段
004A3FC3|.8B45 E4 mov eax, dword ptr
004A3FC6|.8D55 E8 lea edx, dword ptr
004A3FC9|.E8 C6EFFFFF call 004A2F94 ;MD5之--》STR2
004A3FCE|.8B55 E8 mov edx, dword ptr
004A3FD1|.8D45 F8 lea eax, dword ptr
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 ;假码
004A3FE5|.8A5411 FF |mov dl, byte ptr ;第偶数位
004A3FE9|.8B4D F8 |mov ecx, dword ptr ;STR2
004A3FEC|.3A5401 0F |cmp dl, byte ptr ;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 ;机器码
004A4001|.8A40 03 mov al, byte ptr ;第四位
004A4004|.8B55 FC mov edx, dword ptr ;假码
004A4007|.3A42 1E cmp al, byte ptr ;第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 ;机器码
004A4015|.8A40 0A mov al, byte ptr ;第11位
004A4018|.8B55 FC mov edx, dword ptr ;假码
004A401B|.3A42 1F cmp al, byte ptr ;第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:, edx
004A402A|.68 44404A00 push 004A4044
004A402F|>8D45 E4 lea eax, dword ptr
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)
【版权声明】破文是学习的手记,兴趣是成功的源泉;本破文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢! 大侠的算法分析很高产啊,支持下! 顶了! 很牛X 还要自己破解啊,我还是菜鸟呢 学习一下 感谢发布原创作品,吾爱破解有你更精彩,加精鼓励! 学习了 ```` 支持一下 ,我是个菜鸟 ,直接破解了就好了 看不懂。。。但是还是非常支持 学习了~呵呵 谢谢分享!