软件名称:守财奴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