飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 4873|回复: 8

精修家电维修管理系统 V3.3算法分析(简单)

[复制链接]

该用户从未签到

发表于 2005-12-23 17:23:43 | 显示全部楼层 |阅读模式
【破文标题】 精修家电维修管理系统 V3.3算法分析(简单)
破解作者】 风球[PYG]
【作者邮箱】 [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 [Overlay],知道是易语言程序,无壳```爽```有时间的话真的需要认真去学一下脱壳
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:[ebp-4],eax                       ; 假码123456
00558BBD    68 2E000000     push 2E
00558BC2    FF75 FC         push dword ptr ss:[ebp-4]                          ; (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:[ebp-8],eax
00558BDB    8B5D FC         mov ebx,dword ptr ss:[ebp-4]
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:[ebp-8],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:[6C]                             ; ds:[00C54CFC]=5046B189(十进制1346810249即机器码)
00558C51    E8 1A030000     call 精修家电.00558F70                                 ; 跟进去,此CALL为 机器码 XOR 4217320
00558C56    8945 FC         mov dword ptr ss:[ebp-4],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:[ebp-8],eax                       ; eax=00163F10, (ASCII "123456")
00558C72    68 04000080     push 80000004
00558C77    6A 00           push 0
00558C79    8B45 F8         mov eax,dword ptr ss:[ebp-8]
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:[ebp-10],eax
00558C9B    8955 F4         mov dword ptr ss:[ebp-C],edx
00558C9E    8B5D F8         mov ebx,dword ptr ss:[ebp-8]
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:[ebp-4]                          ; 上面出来的值5006E861 (十进制1342629985.)
00558CB1    DD5D E8         fstp qword ptr ss:[ebp-18]                         ; st=1342629985.0000000000
00558CB4    DD45 E8         fld qword ptr ss:[ebp-18]                          ; 堆栈 ss:[0012EDA0]=1342629985.000000
00558CB7    DC65 F0         fsub qword ptr ss:[ebp-10]                         ; 与假码相减
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:[F37]
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:[ebp+8]                          ; 堆栈 ss:[0012ED98]=5046B189机器码
00558F8F    68 02000000     push 2
00558F94    BB CC000000     mov ebx,0CC
00558F99    E8 08070700     call 精修家电.005C96A6                                 ; 再跟进
/////////////跟进来到这里/////////////
005C96A6    FF25 0C000000   jmp dword ptr ds:[C]                               ; 单步
/////////////单步来到/////////////
10028DF1     A1 20AA0E10     mov eax,dword ptr ds:[100EAA20]
10028DF6     0318            add ebx,dword ptr ds:[eax]
。。。。。。。。。
10028E16     52              push edx
10028E17     FF13            call dword ptr ds:[ebx]                                 ; 再跟进
/////////////跟进来到这里/////////////
10059BE0     8B4424 0C       mov eax,dword ptr ss:[esp+C]
10059BE4     8B4C24 08       mov ecx,dword ptr ss:[esp+8]
。。。。。。。。。
10059BF1     E8 FAFEFFFF     call krnln.10059AF0                                 ; 再跟进
10059BF6     83C4 10         add esp,10
10059BF9     C3              retn
/////////////跟进来到这里/////////////
10059AF0     8B5424 10       mov edx,dword ptr ss:[esp+10]
10059AF4     8B4424 0C       mov eax,dword ptr ss:[esp+C]
10059AF8     83F8 01         cmp eax,1
10059AFB     8B0A            mov ecx,dword ptr ds:[edx]
10059AFD     7E 2F           jle short krnln.10059B2E
10059AFF     56              push esi
10059B00     8B7424 08       mov esi,dword ptr ss:[esp+8]
10059B04     57              push edi
10059B05     8D78 FF         lea edi,dword ptr ds:[eax-1]
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:[edx]               ; 异或运算机器码 XOR 4059E8(十进制4217320)
10059B1A     EB 06           jmp short krnln.10059B22
10059B1C     0B0A            or ecx,dword ptr ds:[edx]
10059B1E     EB 02           jmp short krnln.10059B22
10059B20     230A            and ecx,dword ptr ds:[edx]
10059B22     4F              dec edi
10059B23   ^ 75 E3           jnz short krnln.10059B08
10059B25     8B4424 10       mov eax,dword ptr ss:[esp+10]
10059B29     5F              pop edi
10059B2A     5E              pop esi
10059B2B     8908            mov dword ptr ds:[eax],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:[ebp-4],eax                       ; eax=5054670E=1347708686(我的硬盘特征字)
0050B615    837D FC 00      cmp dword ptr ss:[ebp-4],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:[ebp-4]
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:[ebp-8],eax                       ; EAX=5046B189即1346810249
0050B64A    68 01030080     push 80000301
0050B64F    6A 00           push 0
0050B651    FF75 F8         push dword ptr ss:[ebp-8]
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:[ebp-C],eax                       ; 机器码 ASCII "1346810249"
0050B669    6A 00           push 0
0050B66B    FF75 F4         push dword ptr ss:[ebp-C]                          ; (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:[ebp-C]
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:[ebp-8]
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:[19F0C4C],eax
0050B472     833D 4C0C9F01 0>cmp dword ptr ds:[19F0C4C],0
0050B479     0F85 27000000   jnz 精修家电.0050B4A6
0050B47F     C705 500C9F01 0>mov dword ptr ds:[19F0C50],5             ; ds:[19F0C50]<==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:[19F0C4C],eax
0050BA79     833D 4C0C9F01 0>cmp dword ptr ds:[19F0C4C],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:[19F0C50]               ; 计数器减一
0050BAAE     833D 500C9F01 0>cmp dword ptr ds:[19F0C50],0             ; 比较,ds:[19F0C50]上面已赋过值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:[19F0C4C],12D12AB       ; 赋值12D12AB(即19731115作者的生日?)
0050BAE2     68 01030080     push 80000301
0050BAE7     6A 00           push 0
0050BAE9     FF35 4C0C9F01   push dword ptr ds:[19F0C4C]              ; ds:[019F0C4C]=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:[ebp-4],eax
0050BB04     6A 00           push 0
0050BB06     FF75 FC         push dword ptr ss:[ebp-4]                ; 堆栈 ss:[0012F424]=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:[ebp-4]
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 编辑 ]
PYG19周年生日快乐!
  • TA的每日心情
    无聊
    2020-4-10 17:02
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    发表于 2005-12-23 17:57:27 | 显示全部楼层
    这还叫简单?

    天哪!!
    PYG19周年生日快乐!

    该用户从未签到

     楼主| 发表于 2005-12-23 18:07:19 | 显示全部楼层
    原帖由 冷血书生 于 2005-12-23 05:57 PM 发表
    这还叫简单?

    天哪!!


    算法简单啊```只是贴长而已```哈```
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2005-12-23 19:54:07 | 显示全部楼层
    HOHO~
    学习了~~~
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2005-12-23 21:56:05 | 显示全部楼层
    不错,向兄弟们学习!
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2005-12-25 14:58:23 | 显示全部楼层
    E语言不习惯~~
    PYG19周年生日快乐!
  • TA的每日心情
    慵懒
    2019-1-18 17:27
  • 签到天数: 30 天

    [LV.5]常住居民I

    发表于 2005-12-26 15:18:58 | 显示全部楼层
    学习
                      再学习
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2009-12-22 22:12:31 | 显示全部楼层
    现在有新版了。。应该是取CPUID的。。希望能分析一下。
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2009-12-22 22:14:33 | 显示全部楼层
    新版是4.5的。
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表