精修家电维修管理系统 V3.3算法分析(简单)
【破文标题】 精修家电维修管理系统 V3.3算法分析(简单)【破解作者】 风球
【作者邮箱】 [email protected]
【使用工具】 PEiD,OllyDBG
【软件类别】国产软件 / 共享版 / 机械电子
【加入时间】2005-12-22 14:19:13
【软件大小】 3303 KB
【下载地址】 http://www.skycn.com/soft/25063.html
【软件简介】 精修家电维修管理系统是一套功能强大而又简便实用的维修管理软件,包括 维修服务、配件管理、资金管理、数据维
护、系统功能、帮助说明等功能模块.实现了维修服务企业日常营运的全面电脑自动管理,是维修服务行业进行电脑信息化管理的理
想选择。丢弃了传统用的纸和笔管理工单的模式。使工作效率大大的提高,提高工作效率,同时就能增加经济效益,同时也大大降低
了员工的劳动强度。
【破解声明】 初学CrAck,偶得一点心得,愿与大家分享^_^如有错误,请大侠们指出
===============================================================================
圣诞快到了```找个简单的软件写篇简单的破文```算是小礼吧```哈```祝兄弟们圣诞快乐!
[破解过程]
PEID查壳为Microsoft Visual C++ 6.0 ,知道是易语言程序,无壳```爽```有时间的话真的需要认真去学一下脱壳了
Od载入,根据错误提示,很容易就来到这里了```
00558B9B 55 push ebpx ; 此处下断,往下单步分析
00558B9C 8BEC mov ebp,esp
00558B9E 81EC 1C000000 sub esp,1C
00558BA4 6A FF push -1
00558BA6 6A 08 push 8
00558BA8 68 220E0116 push 16010E22
00558BAD 68 100E0152 push 52010E10
00558BB2 E8 F50A0700 call 精修家电.005C96AC
00558BB7 83C4 10 add esp,10
00558BBA 8945 FC mov dword ptr ss:,eax ; 假码123456
00558BBD 68 2E000000 push 2E
00558BC2 FF75 FC push dword ptr ss: ; (ASCII "123456")
00558BC5 E8 B15BF9FF call 精修家电.004EE77B
00558BCA 83C4 08 add esp,8
00558BCD 83F8 00 cmp eax,0
00558BD0 B8 00000000 mov eax,0
00558BD5 0F94C0 sete al
00558BD8 8945 F8 mov dword ptr ss:,eax
00558BDB 8B5D FC mov ebx,dword ptr ss:
00558BDE 85DB test ebx,ebx
00558BE0 74 09 je short 精修家电.00558BEB
00558BE2 53 push ebx
00558BE3 E8 B20A0700 call 精修家电.005C969A
00558BE8 83C4 04 add esp,4
00558BEB 837D F8 00 cmp dword ptr ss:,0 ; 判断注册码是否为空
00558BEF 0F84 56000000 je 精修家电.00558C4B ; 不为空则跳
00558BF5 6A 00 push 0
00558BF7 6A 00 push 0
00558BF9 6A 00 push 0
00558BFB 68 01030080 push 80000301
00558C00 6A 00 push 0
00558C02 68 00000000 push 0
00558C07 68 04000080 push 80000004
00558C0C 6A 00 push 0
00558C0E 68 BF220000 push 22BF
00558C13 68 03000000 push 3
00558C18 BB 00030000 mov ebx,300
00558C1D E8 840A0700 call 精修家电.005C96A6 ; 此CALL为“请输入注册码”
00558C22 83C4 28 add esp,28
00558C25 68 05000100 push 10005
00558C2A 68 220E0116 push 16010E22
00558C2F 68 100E0152 push 52010E10
00558C34 68 01000000 push 1
00558C39 BB 64030000 mov ebx,364
00558C3E E8 630A0700 call 精修家电.005C96A6
00558C43 83C4 10 add esp,10
00558C46 E9 21030000 jmp 精修家电.00558F6C
00558C4B FF35 6C000000 push dword ptr ds: ; ds:=5046B189(十进制1346810249即机器码)
00558C51 E8 1A030000 call 精修家电.00558F70 ; 跟进去,此CALL为 机器码 XOR 4217320
00558C56 8945 FC mov dword ptr ss:,eax ; 出来结果eax=5006E861(十进制1342629985)
00558C59 6A FF push -1
00558C5B 6A 08 push 8
00558C5D 68 220E0116 push 16010E22
00558C62 68 100E0152 push 52010E10
00558C67 E8 400A0700 call 精修家电.005C96AC
00558C6C 83C4 10 add esp,10
00558C6F 8945 F8 mov dword ptr ss:,eax ; eax=00163F10, (ASCII "123456")
00558C72 68 04000080 push 80000004
00558C77 6A 00 push 0
00558C79 8B45 F8 mov eax,dword ptr ss:
00558C7C 85C0 test eax,eax
00558C7E 75 05 jnz short 精修家电.00558C85
00558C80 B8 2E000000 mov eax,2E
00558C85 50 push eax
00558C86 68 01000000 push 1
00558C8B BB 64010000 mov ebx,164
00558C90 E8 110A0700 call 精修家电.005C96A6
00558C95 83C4 10 add esp,10
00558C98 8945 F0 mov dword ptr ss:,eax
00558C9B 8955 F4 mov dword ptr ss:,edx
00558C9E 8B5D F8 mov ebx,dword ptr ss:
00558CA1 85DB test ebx,ebx
00558CA3 74 09 je short 精修家电.00558CAE
00558CA5 53 push ebx ; ebx=0014C480, (ASCII "123456")
00558CA6 E8 EF090700 call 精修家电.005C969A
00558CAB 83C4 04 add esp,4
00558CAE DB45 FC fild dword ptr ss: ; 上面出来的值5006E861 (十进制1342629985.)
00558CB1 DD5D E8 fstp qword ptr ss: ; st=1342629985.0000000000
00558CB4 DD45 E8 fld qword ptr ss: ; 堆栈 ss:=1342629985.000000
00558CB7 DC65 F0 fsub qword ptr ss: ; 与假码相减
00558CBA D9E4 ftst ; 结果与零比较,相等即注册成功
00558CBC DFE0 fstsw ax ; 保存状态字的值到AX
00558CBE F6C4 01 test ah,1
00558CC1 74 02 je short 精修家电.00558CC5 ; 相等则跳
00558CC3 D9E0 fchs
00558CC5 DC1D 370F0000 fcomp qword ptr ds:
00558CCB DFE0 fstsw ax
00558CCD F6C4 41 test ah,41
00558CD0 0F84 60020000 je 精修家电.00558F36 ; 跳则OVER,爆破NOP
===============================================================================
##########跟进CALL - 00558C51 E8 1A030000 call 精修家电.00558F70 来到 #########
00558F70 55 push ebp
00558F71 8BEC mov ebp,esp
00558F73 81EC 04000000 sub esp,4
00558F79 68 01030080 push 80000301
00558F7E 6A 00 push 0
00558F80 68 E8594000 push 精修家电.004059E8
00558F85 68 01030080 push 80000301
00558F8A 6A 00 push 0
00558F8C FF75 08 push dword ptr ss: ; 堆栈 ss:=5046B189机器码
00558F8F 68 02000000 push 2
00558F94 BB CC000000 mov ebx,0CC
00558F99 E8 08070700 call 精修家电.005C96A6 ; 再跟进
/////////////跟进来到这里/////////////
005C96A6 FF25 0C000000 jmp dword ptr ds: ; 单步
/////////////单步来到/////////////
10028DF1 A1 20AA0E10 mov eax,dword ptr ds:
10028DF6 0318 add ebx,dword ptr ds:
。。。。。。。。。
10028E16 52 push edx
10028E17 FF13 call dword ptr ds: ; 再跟进
/////////////跟进来到这里/////////////
10059BE0 8B4424 0C mov eax,dword ptr ss:
10059BE4 8B4C24 08 mov ecx,dword ptr ss:
。。。。。。。。。
10059BF1 E8 FAFEFFFF call krnln.10059AF0 ; 再跟进
10059BF6 83C4 10 add esp,10
10059BF9 C3 retn
/////////////跟进来到这里/////////////
10059AF0 8B5424 10 mov edx,dword ptr ss:
10059AF4 8B4424 0C mov eax,dword ptr ss:
10059AF8 83F8 01 cmp eax,1
10059AFB 8B0A mov ecx,dword ptr ds:
10059AFD 7E 2F jle short krnln.10059B2E
10059AFF 56 push esi
10059B00 8B7424 08 mov esi,dword ptr ss:
10059B04 57 push edi
10059B05 8D78 FF lea edi,dword ptr ds:
10059B08 8BC6 mov eax,esi
10059B0A 83C2 0C add edx,0C
10059B0D 83E8 00 sub eax,0
10059B10 74 0E je short krnln.10059B20
10059B12 48 dec eax
10059B13 74 07 je short krnln.10059B1C
10059B15 48 dec eax
10059B16 75 0A jnz short krnln.10059B22
10059B18 330A xor ecx,dword ptr ds: ; 异或运算机器码 XOR 4059E8(十进制4217320)
10059B1A EB 06 jmp short krnln.10059B22
10059B1C 0B0A or ecx,dword ptr ds:
10059B1E EB 02 jmp short krnln.10059B22
10059B20 230A and ecx,dword ptr ds:
10059B22 4F dec edi
10059B23 ^ 75 E3 jnz short krnln.10059B08
10059B25 8B4424 10 mov eax,dword ptr ss:
10059B29 5F pop edi
10059B2A 5E pop esi
10059B2B 8908 mov dword ptr ds:,ecx ; ecx=5006E861(1342629985)
10059B2D C3 retn
===============================================================================
到此注册码算法已经追出了,是不是很简单啊,哈```下面再跟一下机器码的形成吧
根据\\.\PhysicalDrive0字符(易语言取硬盘特征字的东东)来到这里下断
1000DDB6 68 CCCF0D10 push krnln.100DCFCC ; ASCII "\\.\PhysicalDrive0" //点击软件注册中断于此
1000DDBB FF15 1C140C10 call dword ptr ds:[<&KERNEL32.CreateFile>; KERNEL32.CreateFileA
1000DDC1 8BF0 mov esi,eax
/////////// Ctcl+F9返回程序领空 ///////////
0050B60F 83C4 04 add esp,4
0050B612 8945 FC mov dword ptr ss:,eax ; eax=5054670E=1347708686(我的硬盘特征字)
0050B615 837D FC 00 cmp dword ptr ss:,0 ; 判断获取特征字是否成功
0050B619 0F84 82000000 je 精修家电.0050B6A1 ; 获取不成功则跳
0050B61F 68 01030080 push 80000301
0050B624 6A 00 push 0
0050B626 68 87D61200 push 12D687
0050B62B 68 01030080 push 80000301
0050B630 6A 00 push 0
0050B632 FF75 FC push dword ptr ss:
0050B635 68 02000000 push 2
0050B63A BB CC000000 mov ebx,0CC
0050B63F E8 62E00B00 call 精修家电.005C96A6 ; 跟进知道此CALL为特征字 XOR 1234567
0050B644 83C4 1C add esp,1C
0050B647 8945 F8 mov dword ptr ss:,eax ; EAX=5046B189即1346810249
0050B64A 68 01030080 push 80000301
0050B64F 6A 00 push 0
0050B651 FF75 F8 push dword ptr ss:
0050B654 68 01000000 push 1
0050B659 BB 68010000 mov ebx,168
0050B65E E8 43E00B00 call 精修家电.005C96A6
0050B663 83C4 10 add esp,10
0050B666 8945 F4 mov dword ptr ss:,eax ; 机器码 ASCII "1346810249"
0050B669 6A 00 push 0
0050B66B FF75 F4 push dword ptr ss: ; (ASCII "1346810249")
0050B66E 6A FF push -1
0050B670 6A 08 push 8
0050B672 68 1E0E0116 push 16010E1E
0050B677 68 100E0152 push 52010E10
0050B67C E8 3DE00B00 call 精修家电.005C96BE
0050B681 83C4 18 add esp,18
0050B684 8B5D F4 mov ebx,dword ptr ss:
0050B687 85DB test ebx,ebx
0050B689 74 09 je short 精修家电.0050B694
0050B68B 53 push ebx0050B47F(ASCII "1346810249")
0050B68C E8 09E00B00 call 精修家电.005C969A
0050B691 83C4 04 add esp,4
0050B694 8B45 F8 mov eax,dword ptr ss:
0050B697 E9 0F000000 jmp 精修家电.0050B6AB
0050B69C E9 0A000000 jmp 精修家电.0050B6AB
0050B6A1 B8 00000000 mov eax,0 ; 获取不成功跳到这里
0050B6A6 E9 00000000 jmp 精修家电.0050B6AB
0050B6AB 8BE5 mov esp,ebp
0050B6AD 5D pop ebp
0050B6AE C3 retn ; 返回
===============================================================================
下面来分析一下如果获取硬盘特征字不成功的话,返回什么值做机器码```我的机器是可以获取成功的
获取不成功则返回到这里
0050B46D A3 4C0C9F01 mov dword ptr ds:,eax
0050B472 833D 4C0C9F01 0>cmp dword ptr ds:,0
0050B479 0F85 27000000 jnz 精修家电.0050B4A6
0050B47F C705 500C9F01 0>mov dword ptr ds:,5 ; ds:<==5赋值,下面有用
/////////// 多次Ctrl+F9 返回到这里///////////
0050BA66 55 push ebp
0050BA67 8BEC mov ebp,esp
0050BA69 81EC 04000000 sub esp,4
0050BA6F E8 75FBFFFF call 精修家电.0050B5E9
0050BA74 A3 4C0C9F01 mov dword ptr ds:,eax
0050BA79 833D 4C0C9F01 0>cmp dword ptr ds:,0
0050BA80 0F84 22000000 je 精修家电.0050BAA8
0050BA86 6A 00 push 0
0050BA88 68 00000000 push 0
0050BA8D 6A FF push -1
0050BA8F 6A 08 push 8
0050BA91 68 360E0116 push 16010E36
0050BA96 68 100E0152 push 52010E10
0050BA9B E8 1EDC0B00 call 精修家电.005C96BE
0050BAA0 83C4 18 add esp,18
0050BAA3 E9 87000000 jmp 精修家电.0050BB2F
0050BAA8 FF0D 500C9F01 dec dword ptr ds: ; 计数器减一
0050BAAE 833D 500C9F01 0>cmp dword ptr ds:,0 ; 比较,ds:上面已赋过值5
0050BAB5 0F85 74000000 jnz 精修家电.0050BB2F ; 不相等则跳,修改标志位往下分析
0050BABB 6A 00 push 0 ; 上面是重复取5次进行试验???
0050BABD 68 00000000 push 0
0050BAC2 6A FF push -1
0050BAC4 6A 08 push 8
0050BAC6 68 360E0116 push 16010E36
0050BACB 68 100E0152 push 52010E10
0050BAD0 E8 E9DB0B00 call 精修家电.005C96BE
0050BAD5 83C4 18 add esp,18
0050BAD8 C705 4C0C9F01 A>mov dword ptr ds:,12D12AB ; 赋值12D12AB(即19731115作者的生日?)
0050BAE2 68 01030080 push 80000301
0050BAE7 6A 00 push 0
0050BAE9 FF35 4C0C9F01 push dword ptr ds: ; ds:=012D12AB
0050BAEF 68 01000000 push 1
0050BAF4 BB 68010000 mov ebx,168
0050BAF9 E8 A8DB0B00 call 精修家电.005C96A6
0050BAFE 83C4 10 add esp,10
0050BB01 8945 FC mov dword ptr ss:,eax
0050BB04 6A 00 push 0
0050BB06 FF75 FC push dword ptr ss: ; 堆栈 ss:=0020C2F8, (ASCII "19731115")
0050BB09 6A FF push -1
0050BB0B 6A 08 push 8
0050BB0D 68 1E0E0116 push 16010E1E
0050BB12 68 100E0152 push 52010E10
0050BB17 E8 A2DB0B00 call 精修家电.005C96BE
0050BB1C 83C4 18 add esp,18
0050BB1F 8B5D FC mov ebx,dword ptr ss:
0050BB22 85DB test ebx,ebx
0050BB24 74 09 je short 精修家电.0050BB2F
0050BB26 53 push ebx ; (ASCII "19731115")
0050BB27 E8 6EDB0B00 call 精修家电.005C969A
0050BB2C 83C4 04 add esp,4
0050BB2F 8BE5 mov esp,ebp
0050BB31 5D pop ebp
0050BB32 C3 retn
===============================================================================
分析到此大概的算法就算完成了,来个总结吧```
[算法总结]
超简单的算法,注册码 = 机器码 XOR 4217320
机器码:如果获取硬盘特征字成功,那么机器码=硬盘特征字 xor 1234567;否则机器=19731115。
用易语言源码表示上面的代码大概如下:
' 也就是算法注册机了,
' 今天顺便装个易语言来学习一下,对易语言还不熟悉,才刚刚开学习的```哈```如有错误,请指出
' 原软件好像设置了重复取硬盘特征字5次,我这里没表示出来
.局部变量 注册码, 整数型
.局部变量 机器码, 整数型
.局部变量 原特征码, 整数型
原特征码 = 取硬盘特征字 ()
.如果 (原特征字 ≠ 0) ' 检查获取硬盘特征字是否成功
机器码 = 位异或 (原特征码, 1234567)' 返回新特征码
.否则
机器码 = 19731115 ' 返回新特征码
.如果结束
注册码 = 位异或 (机器码, 4217320)
编辑框1.内容 = 到文本 (机器码) ' 机器码
编辑框2.内容 = 到文本 (注册码) ' 注册码
' 原来这个软件的机器码的获取是直接套用易语言里边“软件注册”的例子的,我是写完这篇东东才发现的,汗```对易语言编程不了
解的原因```有兴趣的自己去看吧
===================================================================2005年12月23日
【版权声明】 本文纯属技术交流,无其它目的,转载请注明作者并保持文章的完整, 谢谢!
[ 本帖最后由 风球 于 2005-12-27 10:49 AM 编辑 ] 这还叫简单?
天哪!! 原帖由 冷血书生 于 2005-12-23 05:57 PM 发表
这还叫简单?
天哪!!
算法简单啊```只是贴长而已```哈``` HOHO~
学习了~~~ 不错,向兄弟们学习! E语言不习惯~~ 学习
再学习 现在有新版了。。应该是取CPUID的。。希望能分析一下。 新版是4.5的。
页:
[1]