[摘要]【前 言】:这是我用ME以外的操作系统破的第一个软件!这个软件对于架设<传奇>私服的朋友是再熟悉不过了!以前这个软件下载的地方都有破解补丁放在一起的,可是我找了好久都没有找到,看来...
【前 言】:这是我用ME以外的操作系统破的第一个软件!这个软件对于架设<传奇>私服的朋友是再熟悉不过了!以前这个软件下载的地方都有破解补丁放在一起的,可是我找了好久都没有找到,看来还是自己动手的好!
【软件名称】:DB Commander 2000 PRO(简称DBC_2000)
【作者声明】:本人发表这篇文章只是为了学习!!!请不用于商业用途或是将本文方法制作的注册机任意传播,读者看了文章后所做的事情与我无关,我也不会负责,请读者看了文章后三思而后行!最后希望大家在经济基础好的时候,支持共享软件!
【破解工具】:Ollydbg
—————————————————————————————————
【过 程】:
用Ollydbg加载主程序DB_Commander.exe
根据字符参考知道出错的地方一共有三处,分别对这三个地方下断!
输入用户名Yock和注册码987-654-321后,按注册,拦下:
00541398 . 53 PUSH EBX
00541399 . 56 PUSH ESI
0054139A . 8BF2 MOV ESI,EDX
0054139C . 8BD8 MOV EBX,EAX
0054139E . BA E4135400 MOV EDX,TKDB_Com.005413E4
005413A3 . B8 1C145400 MOV EAX,TKDB_Com.0054141C
005413A8 . E8 5F2FECFF CALL TKDB_Com.0040430C
//这里好像是验证注册表是否有"Tsapanidis"这个值!
//但是我注册表里面没有这个值!
//这里可能是一个暗桩吧!
005413AD . 85C0 TEST EAX,EAX
005413AF . 7E 0C JLE SHORT TKDB_Com.005413BD
//这里不能跳,以跳下去就挂了!
//我这里是跳的,所以我把这里NOP掉了!
005413B1 . 8BD6 MOV EDX,ESI
005413B3 . 8BC3 MOV EAX,EBX
005413B5 . E8 76FCFFFF CALL TKDB_Com.00541030
//这里是关键,根进去!
005413BA . 5E POP ESI
005413BB . 5B POP EBX
005413BC . C3 RETN
005413BD > E8 5AB4ECFF CALL TKDB_Com.0040C81C
005413C2 . 6A 00 PUSH 0
005413C4 . 66:8B0D 281454>MOV CX,WORD PTR DS:[541428]
005413CB . 33D2 XOR EDX,EDX
005413CD . B8 34145400 MOV EAX,TKDB_Com.00541434
//这里就是出错的地方了!
005413D2 . E8 3569F0FF CALL TKDB_Com.00447D0C
005413D7 . 5E POP ESI
005413D8 . 5B POP EBX
005413D9 . C3 RETN
-----------------------------------------------------------------
上面5413b5的CALL来到这里!
00541030 /$ 55 PUSH EBP
00541031 . 8BEC MOV EBP,ESP
00541033 . 6A 00 PUSH 0
00541035 . 6A 00 PUSH 0
00541037 . 6A 00 PUSH 0
00541039 . 53 PUSH EBX
0054103A . 33C0 XOR EAX,EAX
0054103C . 55 PUSH EBP
0054103D . 68 20125400 PUSH TKDB_Com.00541220
00541042 . 64:FF30 PUSH DWORD PTR FS:[EAX]
00541045 . 64:8920 MOV DWORD PTR FS:[EAX],ESP
00541048 . A1 AC215700 MOV EAX,DWORD PTR DS:[5721AC]
0054104D . FF00 INC DWORD PTR DS:[EAX]
0054104F . 8D55 FC LEA EDX,DWORD PTR SS:[EBP-4]
00541052 . A1 383B5700 MOV EAX,DWORD PTR DS:[573B38]
00541057 . 8B80 EC010000 MOV EAX,DWORD PTR DS:[EAX+1EC]
0054105D . E8 EA8CF0FF CALL TKDB_Com.00449D4C
00541062 . 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
00541065 . 50 PUSH EAX
00541066 . 8D55 F8 LEA EDX,DWORD PTR SS:[EBP-8]
00541069 . A1 383B5700 MOV EAX,DWORD PTR DS:[573B38]
0054106E . 8B80 E0010000 MOV EAX,DWORD PTR DS:[EAX+1E0]
00541074 . E8 8B3DEEFF CALL TKDB_Com.00424E04
00541079 . 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8]
//这里是用户名!
0054107C . 5A POP EDX
//这里是输入的假注册码!
0054107D . E8 8EF6FFFF CALL TKDB_Com.00540710
//关键跟进去!
00541082 . 84C0 TEST AL,AL
00541084 . 0F84 C1000000 JE TKDB_Com.0054114B
//这里不跳的话,就把正确的注册信息保存起来!
//跳走的话就出错咯!
0054108A . A1 C81C5700 MOV EAX,DWORD PTR DS:[571CC8]
0054108F . C600 01 MOV BYTE PTR DS:[EAX],1
00541092 . A1 B0215700 MOV EAX,DWORD PTR DS:[5721B0]
00541097 . C600 00 MOV BYTE PTR DS:[EAX],0
............................
.............
00541144 . E8 C36BF0FF CALL TKDB_Com.00447D0C
00541149 . EB 49 JMP SHORT TKDB_Com.00541194
0054114B > 6A 40 PUSH 40
0054114D . E8 2E64ECFF CALL <JMP.&user32.MessageBeep>
00541152 . A1 AC215700 MOV EAX,DWORD PTR DS:[5721AC]
00541157 . 8338 03 CMP DWORD PTR DS:[EAX],3
0054115A . 7C 23 JL SHORT TKDB_Com.0054117F
0054115C . 6A 00 PUSH 0
0054115E . 66:8B0D 981254>MOV CX,WORD PTR DS:[541298]
00541165 . 33D2 XOR EDX,EDX
00541167 . B8 14135400 MOV EAX,TKDB_Com.00541314
Goodbye..."
//这里是注册成功的地方!
0054116C . E8 9B6BF0FF CALL TKDB_Com.00447D0C
00541171 . A1 D41F5700 MOV EAX,DWORD PTR DS:[571FD4]
00541176 . 8B00 MOV EAX,DWORD PTR DS:[EAX]
00541178 . E8 634FEFFF CALL TKDB_Com.004360E0
0054117D . EB 15 JMP SHORT TKDB_Com.00541194
0054117F > 6A 00 PUSH 0
00541181 . 66:8B0D 981254>MOV CX,WORD PTR DS:[541298]
00541188 . 33D2 XOR EDX,EDX
0054118A . B8 50135400 MOV EAX,TKDB_Com.00541350
//这里是另外一个出错的地方了!
0054118F . E8 786BF0FF CALL TKDB_Com.00447D0C
00541194 > A1 C81C5700 MOV EAX,DWORD PTR DS:[571CC8]
00541199 . 8038 00 CMP BYTE PTR DS:[EAX],0
0054119C . 74 52 JE SHORT TKDB_Com.005411F0
-----------------------------------------------------------------
上面54107d的CALL来到这里!
00540710 /$ 55 PUSH EBP
00540711 . 8BEC MOV EBP,ESP
00540713 . 83C4 F0 ADD ESP,-10
00540716 . 53 PUSH EBX
00540717 . 56 PUSH ESI
00540718 . 57 PUSH EDI
00540719 . 33C9 XOR ECX,ECX
0054071B . 894D F0 MOV DWORD PTR SS:[EBP-10],ECX
0054071E . 894D F4 MOV DWORD PTR SS:[EBP-C],ECX
00540721 . 8955 F8 MOV DWORD PTR SS:[EBP-8],EDX
00540724 . 8945 FC MOV DWORD PTR SS:[EBP-4],EAX
00540727 . 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
0054072A . E8 A93AECFF CALL TKDB_Com.004041D8
0054072F . 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8]
00540732 . E8 A13AECFF CALL TKDB_Com.004041D8
00540737 . 33C0 XOR EAX,EAX
00540739 . 55 PUSH EBP
0054073A . 68 4C085400 PUSH TKDB_Com.0054084C
0054073F . 64:FF30 PUSH DWORD PTR FS:[EAX]
00540742 . 64:8920 MOV DWORD PTR FS:[EAX],ESP
00540745 . 33FF XOR EDI,EDI
00540747 . 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
//输入的用户名!
0054074A . E8 D538ECFF CALL TKDB_Com.00404024
//取用户名的位数!
0054074F . 8BF0 MOV ESI,EAX
00540751 . 85F6 TEST ESI,ESI
//是否有用户名!
00540753 . 7E 34 JLE SHORT TKDB_Com.00540789
//没有就跳走咯!
00540755 . BB 01000000 MOV EBX,1
//赋值1,EBX作为计数器!
0054075A > 8B45 FC /MOV EAX,DWORD PTR SS:[EBP-4]
0054075D . 8A4418 FF MOV AL,BYTE PTR DS:[EAX+EBX-1]
00540761 . 8BD0 MOV EDX,EAX
00540763 . 80C2 D0 ADD DL,0D0
00540766 . 80EA 0A SUB DL,0A
00540769 . 72 10 JB SHORT TKDB_Com.0054077B
//比较当前用户名是否是数字,是的话就跳下去直接累加!
0054076B . 80C2 F9 ADD DL,0F9
0054076E . 80EA 1A SUB DL,1A
00540771 . 72 08 JB SHORT TKDB_Com.0054077B
//比较当前用户名是否是大写字母,是的话就跳下取直接累加!
00540773 . 80C2 FA ADD DL,0FA
00540776 . 80EA 1A SUB DL,1A
00540779 . 73 0A JNB SHORT TKDB_Com.00540785
//比较当前用户名是否是小写字母,是的话就不跳!
//如果不是小写字母的话跳走不累加了!
0054077B > 8B55 FC MOV EDX,DWORD PTR SS:[EBP-4]
0054077E . 25 FF000000 AND EAX,0FF
00540783 . 03F8 ADD EDI,EAX
00540785 > 43 INC EBX
00540786 . 4E DEC ESI
00540787 .^75 D1 \JNZ SHORT TKDB_Com.0054075A
//从0054075A到这里的循环是把用户名的值累加起来
//累加的结果保存再EDI里面!
//注意:要是用户名有非法字符和空格的话,就不作计算!
//也就是说,只计算用户名的"A-Z"和"a-z"和"0-9"之间的数!
00540789 > 8BC7 MOV EAX,EDI
//累加值=EDI=EAX
0054078B . C1E0 02 SHL EAX,2
//逻辑左移
0054078E . 8BD7 MOV EDX,EDI
//EDI=EDX=累加值
00540790 . 4A DEC EDX
//减一
00540791 . 8BCA MOV ECX,EDX
//EDX=ECX=累加值减一
00540793 . 99 CDQ
00540794 . F7F9 IDIV ECX
//整数除法
00540796 . 8BD7 MOV EDX,EDI
//累加值=EDI=EDX
00540798 . 85D2 TEST EDX,EDX
//这里我理解是--是否有累加值,有的话就跳!
0054079A . 79 03 JNS SHORT TKDB_Com.0054079F
//我这里是跳下去的!
0054079C . 83C2 03 ADD EDX,3
0054079F > C1FA 02 SAR EDX,2
//算术右移
005407A2 . 0FAFD7 IMUL EDX,EDI
//EDX=EDX*EDI
005407A5 . 03C2 ADD EAX,EDX
//EAX=EAX+EDX
005407A7 . 05 391B0000 ADD EAX,1B39
//累加1B39
005407AC . 8BF8 MOV EDI,EAX
//EAX=EDI
005407AE . 81C7 00E1F505 ADD EDI,5F5E100
//累加5F5E100
//这里的EDI的十进制就十真的注册码了!
//注册码就是怎么练成的!
//对于我来说,我有学到了一些宝贵的东西了,你呢???
005407B4 . 8D45 F4 LEA EAX,DWORD PTR SS:[EBP-C]
005407B7 . E8 EC35ECFF CALL TKDB_Com.00403DA8
005407BC . 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8]
//这里是输入的假注册码!
005407BF . E8 6038ECFF CALL TKDB_Com.00404024
//取假注册码的位数!
005407C4 . 8BF0 MOV ESI,EAX
005407C6 . 85F6 TEST ESI,ESI
//有没有输入?
005407C8 . 7E 3C JLE SHORT TKDB_Com.00540806
//没有输入注册码就跳走咯!
005407CA . BB 01000000 MOV EBX,1
//赋值1,EBX作为计数器!
005407CF > 8B45 F8 /MOV EAX,DWORD PTR SS:[EBP-8]
005407D2 . 8A4418 FF MOV AL,BYTE PTR DS:[EAX+EBX-1]
005407D6 . 04 D0 ADD AL,0D0
005407D8 . 2C 0A SUB AL,0A
005407DA . 72 0C JB SHORT TKDB_Com.005407E8
005407DC . 04 F9 ADD AL,0F9
005407DE . 2C 1A SUB AL,1A
005407E0 . 72 06 JB SHORT TKDB_Com.005407E8
005407E2 . 04 FA ADD AL,0FA
005407E4 . 2C 1A SUB AL,1A
005407E6 . 73 1A JNB SHORT TKDB_Com.00540802
005407E8 > 8D45 F0 LEA EAX,DWORD PTR SS:[EBP-10]
005407EB . 8B55 F8 MOV EDX,DWORD PTR SS:[EBP-8]
005407EE . 8A541A FF MOV DL,BYTE PTR DS:[EDX+EBX-1]
005407F2 . E8 5537ECFF CALL TKDB_Com.00403F4C
005407F7 . 8B55 F0 MOV EDX,DWORD PTR SS:[EBP-10]
005407FA . 8D45 F4 LEA EAX,DWORD PTR SS:[EBP-C]
005407FD . E8 2A38ECFF CALL TKDB_Com.0040402C
00540802 > 43 INC EBX
00540803 . 4E DEC ESI
00540804 .^75 C9 \JNZ SHORT TKDB_Com.005407CF
//从005407CF到这里的循环是把注册码的"-"去掉的!
//举个例子,我输入的注册码是"987-654-321"
//经过这里有就变成"987654321"了!
00540806 > 8D55 F0 LEA EDX,DWORD PTR SS:[EBP-10]
00540809 . 8BC7 MOV EAX,EDI
0054080B . E8 F47FECFF CALL TKDB_Com.00408804
00540810 . 8B45 F0 MOV EAX,DWORD PTR SS:[EBP-10]
//这里就是真的注册码了!
00540813 . 8B55 F4 MOV EDX,DWORD PTR SS:[EBP-C]
//这里是我输入的假注册码!
00540816 . E8 1939ECFF CALL TKDB_Com.00404134
0054081B . 0F94C3 SETE BL
0054081E . BA 64085400 MOV EDX,TKDB_Com.00540864 ; ASCII "Beverly Saunders Site"
//这个就是万能注册名了!
00540823 . 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
//这里是输入的用户名!
//可见这个软件有一个万能注册名的!
00540826 . E8 E13AECFF CALL TKDB_Com.0040430C
0054082B . 85C0 TEST EAX,EAX
0054082D . 7E 02 JLE SHORT TKDB_Com.00540831
0054082F . 33DB XOR EBX,EBX
00540831 > 33C0 XOR EAX,EAX
00540833 . 5A POP EDX
00540834 . 59 POP ECX
00540835 . 59 POP ECX
------------------------------------------------------------------
【总 结】:
又来到我最怕的地方了---总结!
说起来,这个软件又一个地方我搞不懂的就是为什么要检查注册表的
[\Software\T&T Solutions\DB Commander 2000 PRO]
Tsapanidis
我的机子里面没有这个项目,所以要把
005413AF . 7E 0C JLE SHORT TKDB_Com.005413BD
NOP掉才可以注册成功!如果大虾们愿意研究的话,可以告诉我一个究竟吗?
把用户名的字符的ASCII码累加以来!(非法字符和空格除外,只累加这些值.包括"A-Z"/"a-z"/"0-9")
最后把累加值经过下面的运算得出得结果的十进制就是真的注册码了!
累加值=EAX=EDI
MOV EAX,EDI
SHL EAX,2
MOV EDX,EDI
DEC EDX
MOV ECX,EDX
CDQ
IDIV ECX
SAR EDX,2
IMUL EDX,EDI
ADD EAX,EDX
ADD EAX,1B39
MOV EDI,EAX
ADD EDI,5F5E100
最后注册码的结果=EDI的十进制值!
注册信息保存在:
[HKEY_LOCAL_MACHINE\SOFTWARE\T&T Solutions\DB Commander 2000 PRO\5.0.0.0]
"RegNumber"="005F69C6B"
//保存方式是注册码的十六进制!
一组可用的注册码:
Yock
100-047-979
--------------------------------------------------------------------
最后在这里真心感谢你花了那么多时间看这篇文章!谢谢了...
网络的神奇作用吸引着越来越多的用户加入其中,正因如此,网络的承受能力也面临着越来越严峻的考验―从硬件上、软件上、所用标准上......,各项技术都需要适时应势,对应发展,这正是网络迅速走向进步的催化剂。
……