软件名称:守财奴2005-家庭版  内部版本:V2.5
公司名称:竹笙软件

公司主页:http://www.zssoft.com/

修改时间:2005/3/28

应用平台:Windows 98/ME/NT/2000/XP/2003

破解人:wofan[OCN]
破解工具:Peid,OD,Casm等等
注册信息:
 注册编号:1234567
 注册密码:78787878 


先Peid扫描发现:
ASPack 2.11 -> Alexey Solodovnikov
这种Packer类壳容易脱!
脱后文件大小:1.78MB
编程语言:
Microsoft Visual C++ 6.0

填入注册信息后,要求重启验证。

在程序目录中有个:setting.ini
里面有个输入的注册信息:
[RegUserInfo]
RegCode=1234567
RegPass=78787878
在Casm.exe中可以搜索到与“Regcode”有关的地址有多个,我们用最小的那个:
00465D2C

OD载入,前往:00465D2C
在这里下断:
00465D2C   |.  68 CC885300       push PMoneyKe.005388CC             ; |Key = "RegCode"   
按F9运行,断下!
00465D31   |.  68 C0885300       push PMoneyKe.005388C0             ; |Section = "RegUserInfo"
00465D36   |.  C74424 34 0800000>mov dword ptr ss:[esp+34],8        ; |                          ****esp+34=0012FD48    8         (esp=12FD28)
00465D3E   |.  C74424 3C 0000000>mov dword ptr ss:[esp+3C],0        ; |                          ****esp+3C=0012FD4C    0
00465D46   |.  C74424 40 0600000>mov dword ptr ss:[esp+40],6        ; |                          ****esp+40=0012FD50    6
00465D4E   |.  C74424 48 0300000>mov dword ptr ss:[esp+48],3        ; |                          ****esp+48=0012FD58    3   ( 压几个固定数3,6,0,8)
00465D56   |.  FFD6              call esi                           ; \GetPrivateProfileStringA   ***读取RegCode=1234567  长度为7送到EAX
00465D58   |.  8B15 58CF5300     mov edx,dword ptr ds:[53CF58]                                    
00465D5E   |.  8D4424 08         lea eax,dword ptr ss:[esp+8]                                     
00465D62   |.  52                push edx                           ; /IniFileName => "F:\守财奴2005-家庭版\Setting.ini"
00465D63   |.  6A 07             push 7                             ; |BufSize = 7              
00465D65   |.  50                push eax                           ; |ReturnBuffer
00465D66   |.  68 B8885300       push PMoneyKe.005388B8             ; |Default = "000000"
00465D6B   |.  68 B0885300       push PMoneyKe.005388B0             ; |Key = "RegPass"
00465D70   |.  68 C0885300       push PMoneyKe.005388C0             ; |Section = "RegUserInfo"
00465D75   |.  FFD6              call esi                           ; \GetPrivateProfileStringA   ***只读取Regpass=787878  只读取前6位。长度6送到EAX
00465D77   |.  33C0              xor eax,eax                                                      ***EAX清零
00465D79   |.  8D4C24 4C         lea ecx,dword ptr ss:[esp+4C]
00465D7D   |>  0FBE5404 10       /movsx edx,byte ptr ss:[esp+eax+10>                             ***esp+eax+1=12FD38 ,Regcode的ASCII带符号扩展,依次送EDX
00465D82   |.  83EA 30           |sub edx,30                                                     ***取Chr()
00465D85   |.  40                |inc eax                                                        ***EAX自加1,指向下一位
00465D86   |.  8911              |mov dword ptr ds:[ecx],edx                                     ***Chr()值,保存在12FD74为首址的地方
00465D88   |.  83C1 04           |add ecx,4                                                      ***ECX=ECX+4 开辟下一个保存点                                                    
00465D8B   |.  83F8 06           |cmp eax,6                                                      ***与固定数6比,看来Regcode要6位!!
00465D8E   |.^ 7C ED             \jl short PMoneyKe.00465D7
00465D90   |.  33C0              xor eax,eax
00465D92   |.  8D4C24 34         lea ecx,dword ptr ss:[esp+34]                                ***esp+34=12FD5C
00465D96   |>  0FBE5404 08       /movsx edx,byte ptr ss:[esp+eax+8]                           ***Regpass的ASCII带符号扩展,依次送EDX
00465D9B   |.  83EA 30           |sub edx,30
00465D9E   |.  40                |inc eax
00465D9F   |.  8911              |mov dword ptr ds:[ecx],edx                                  保存
00465DA1   |.  83C1 04           |add ecx,4
00465DA4   |.  83F8 06           |cmp eax,6                                                   ***一样,要取6位
00465DA7   |.^ 7C ED             \jl short PMoneyKe.00465D96
00465DA9   |.  33C9              xor ecx,ecx                                                 ****ECX清零,要作为控制循环的东东了。
00465DAB   |>  8B440C 4C         /mov eax,dword ptr ss:[esp+ecx+4C]                          ****Regcode顺着来,第一位当然就是1  (esp+ecx+4C=12FD7C)
00465DAF   |.  8B740C 1C         |mov esi,dword ptr ss:[esp+ecx+1C]                          ****这是前面Push 的数
00465DB3   |.  03C6              |add eax,esi                                                 加起来,第一次:就是1+8=9
00465DB5   |.  83F8 0A           |cmp eax,0A                                                  等于10吗?
00465DB8   |.  72 03             |jb short PMoneyKe.00465DBD                                  少于则跳,直接去比较!
00465DBA   |.  83E8 0A           |sub eax,0A                                                   否则就减去10
00465DBD   |>  3B440C 34         |cmp eax,dword ptr ss:[esp+ecx+34]                            比一比: dword ptr ss:[esp+ecx+34]保存着假注册码
00465DC1   |.  74 02             |je short PMoneyKe.00465DC5
00465DC3   |.  33FF              |xor edi,edi                                                 ****不相等,EDI就被清零!EDX保存着注册正确与否的标志!
00465DC5   |>  83C1 04           |add ecx,4                                                   ****ECX=ECX+4
00465DC8   |.  83F9 18           |cmp ecx,18                                                                                            
00465DCB   |.^ 7C DE             \jl short PMoneyKe.00465DAB                                  ECX少于&H18时(十进制是24,24/4=6),就跳上去
00465DCD   |.  8BC7              mov eax,edi                                               标志送EAX
00465DCF   |.  5F                pop edi
00465DD0   |.  5E                pop esi
00465DD1   |.  83C4 6C           add esp,6C
00465DD4   \.  C3                retn                                                      返回去
**************************************************************************
D 12FD7C 可见:    (这是存放前6位Regcode)
0012FD74  00000001
0012FD78  00000002
0012FD7C  00000003
0012FD80  00000004
0012FD84  00000005
0012FD88  00000006
D 12FD44 可见:     (存放6个固定数,就叫密钥吧)
0012FD44  00000008
0012FD48  00000001    (这个1从何而来?重新载入,到00465D36 ,再D 12FD7C)
0012FD4C  00000000
0012FD50  00000006
0012FD54  00000001    (这个1从何而来?)
0012FD58  00000003
0012FD5C  00000007   (从这里开始存放假码)
0012FD60  00000008
0012FD64  00000007
0012FD68  00000008
0012FD6C  00000007
0012FD70  00000008

*************************************************************************
这个1从何而来?重新载入,到00465D36 ,再D 12FD7C
0012FD44  004E1E16  入口地址      ***这些是在Push之前,这一数据区中存放的数
0012FD48  00000001                ***看到了这个1
0012FD4C  0000000C
0012FD50  00000000
0012FD54  00000001                ***看到了这个1
0012FD58  0053CE90  PMoneyKe.0053CE90
**********************************************************************



返回到这里:
004646E1    .  8986 E0000000     mov dword ptr ds:[esi+E0],eax                           再保存标志,EAX=0表示注册不成功!


总结:
注册编号至少6位,注册码也只要6位!             
假注册名(regcode或者称为:注册编号)逐个与密钥810613相加,结果保留个位数,就是注册码!!!

就取注册编号:111111
算出注册密码:921724

保护这么弱!!不会还有其它不为 人知的东东?????

by wofan[OCN]
1:51 2005-5-1

  • 标 题: 答复
  • 作 者:kyc
  • 时 间:2005-05-01 09:42

不错啊,我前天下了这个我还以为很高难,没敢动。
让你抢先了。
for(int i=0;i<6;i++)
  {
    if(((tmp[i]+key[i]))/10==0)
      code[i]=tmp[i]+key[i];
    else
      code[i]=tmp[i]+key[i]-10;
  }