呵呵,终于解决了。先看看结果,整理一下,等会跟帖发过程和小甜饼,让大家都能用上这个恼人
的“CRACKME”——VCD开机画面随心换V3.0
机器码:F62EAA14415B4116
注册码:9E053DC5B75E9A18 (后面可以跟些字符,但不影响注册,最终只保留前面的16位注册码信息)
机器码是根据C盘卷的序列号经过某某有名的算法产生的,取变形后的前16位作为机器码。该死的
内置程序版本标志“jhvcdlogo30”,提取“jhvcdlogo”作为连接字符跟机器码连接,我忘了
具体细节了,好像是经过特殊算法的变形(估计这个算法跟取C盘序列号变形的算法是相同的)
产生了最后的注册码。是明码比较的。
程序经过特殊处理,具有迷惑分析的能力,而且替换了COMMAND组件,用画出来的XP风格按钮替换
断点不好设置。而且有TIMER控件时刻干扰,郁闷。。。注册成功后,将取系统登陆的用户名作为
注册用户名 取消掉窗口上的“未注册”字样
再等等,马上就将方法告诉跟我一样的菜鸟
另外我觉得这样的软件卖得太贵了。。。我等学生一族没能力购买的了。。。
正文:
注册信息保存在:HKEY_CURRENT_USER\Software\LOGO ProgramSettings\logoinfo\reginfo\LiberationKey
附件是内存注册机和删除注册信息再玩一遍的REG文件,解压密码是:
159357 使用时,请关闭杀毒软件,或者添加为信任程序。
该内存注册机匹配 http://www.jh686.cn/soft/vcdlogo30.rar 这个版本
得到的注册码前16位真实有效,后面的可以忽略掉。当然,不忽略也可以成功注册的。还有,使用此内存注册机不要求原程序脱壳。原程序不要改名字,而且不必脱壳。
加载程序的时候OD提示压缩了,那么十之八九加壳了(VB程序除外),也不用PEID了,我习惯这样。
直接用OD受脱,什么ESP定律了,什么步步为营了,还有脱壳机,直接找POPAD等。
这里我用翻动窗口,直接找到:
00436718 - E9 4BB4FCFF jmp 00401B68
在它身上下断点,F9,断下来,F2,回车,F2,F9,F2,DUMP就OK了
重新加载新的程序,明显的VB语言。
刚开始利用VBEXPLORER来查找事件断点,找到了XP风格的断点,中圈套了,一个劲的被TIMER干扰。撤退~~
利用rtcmsgbox来断点,CTRL+F9,返回,呵呵,看到个JE,改一下,恩,提示注册成功了。真是幸福啊~~然后提示重新启动程序
重新启动后蹦出个窗口,提示未注册,幸福来的快去的也快。接下来猛攻重启验证,弄了好久不成功。撤退~~
呵呵,上面是引导你的思路的,下面才开始:
程序启动时候,LOAD事件中,通过GetVolumelnformationA来获取C盘的序列号。随后利用MID()函数再分别从开头字符依次取它们的十六进制ASC,开始很多运算,烦死了,很长很长。头疼。
如果你想看看机器码到底如何产生,那么加载程序后,先在命令输入栏上“bp GetVolumeInformationA”
F9 断在这里:
7C821BA5 > 6A 44 push 44
7C821BA7 68 201D827C push 7C821D20
7C821BAC E8 1509FEFF call 7C8024C6
7C821BB1 33F6 xor esi, esi
7C821BB3 3975 08 cmp dword ptr [ebp+8], esi
CTRL+9,回到上级。一步步来跟吧。。。反正我跟了好久就像进了桃花阵。。。
我不懂算法,很少研究复杂的算法。这个算法好像挺经典的,我不认识。老长老长的。
接入正题,怎么破?怎么下断点?
vbaStrCmp
vbaStrComp
这两个都给我下断点,哦,先别急着下断点。先加载程序,F9让它跑起来。好了,打开注册界面输入123456789假注册码吧。然后用函数断点,
找到上述两个函数,或者直接在命令输入栏里输入断点命令:BP MSVBVM60.__vbaStrCmp BP MSVBVM60.__vbaStrComp
(两个调用断点分开输入)
下好短点之后就单击注册吧。断在这里:
733B4813 > FF7424 08 push dword ptr [esp+8]
733B4817 FF7424 08 push dword ptr [esp+8]
733B481B 6A 00 push 0
733B481D E8 03000000 call __vbaStrComp
733B4822 C2 0800 retn 8
733B4825 > 837C24 04 02 cmp dword ptr [esp+4], 2
733B482A 0F84 DB2C0200 je 733D750B
没事情做就看看堆栈:
堆栈 ss:[0012EBD8]=00157CEC, (UNICODE "jhvcdlogo30")
jhvcdlogo30 这个字符很刺眼,似乎是作者的软件名称加版本号,这里作为连接字符参与运算。
没什么意义了,就算知道了,呵呵,我也不知道他的算法是怎么搞的。太复杂了。我们不管它,F8潇洒的走下去~~~(心里有个底,算法简单的
就分析算法写注册机,算法复杂的就看是否明码比较,明码比较就写内存注册机,暗码比较就爆破,重启还验证的再爆破~~~一路高歌,菜鸟从来就是这么痛快和低级的——不要笑了)
F8下去后发现进入了算法区,挑花阵!赶快出来,这个算法不好弄。按F9重新断下,看看堆栈:
堆栈 ss:[0012EAC0]=0016CACC, (UNICODE "123456789")
恩,假码露脸了。呵呵~~打起精神来吧,小心点,一步步跟,跟了一会儿无非前戏,没意思,撤退~~~直接F9,再次断下:
733B4813 > FF7424 08 push dword ptr [esp+8]
733B4817 FF7424 08 push dword ptr [esp+8]
733B481B 6A 00 push 0
733B481D E8 03000000 call __vbaStrComp
733B4822 C2 0800 retn 8
733B4825 > 837C24 04 02 cmp dword ptr [esp+4], 2
733B482A 0F84 DB2C0200 je 733D750B
呵呵,回到这里了。F9一下。然后,疯狂F8,到:
166A741E FF15 78106916 call dword ptr [16691078] ; MSVBVM60.__vbaHresultCheckObj
166A7424 8B4D DC mov ecx, dword ptr [ebp-24]
166A7427 8B56 4C mov edx, dword ptr [esi+4C]
166A742A 8B1D 64106916 mov ebx, dword ptr [16691064] ; MSVBVM60.__vbaStrCat
166A7430 51 push ecx
166A7431 52 push edx
寄存器中:
ECX 001576F4 UNICODE "F62EAA14415B4116" ——这个是机器码
EDX 00157D14 UNICODE "jhvcdlogo"——这个是连接后参与运算的字符
166A7432 FFD3 call ebx ——字符连接,可看寄存器
166A7434 8B3D 58126916 mov edi, dword ptr [16691258] ; MSVBVM60.__vbaStrMove
166A743A 8BD0 mov edx, eax
166A743C 8D4D D8 lea ecx, dword ptr [ebp-28]
寄存器:
EAX 0016CF94 UNICODE "F62EAA14415B4116jhvcdlogo"
166A743A 8BD0 mov edx, eax
166A743C 8D4D D8 lea ecx, dword ptr [ebp-28]
166A743F FFD7 call edi
166A7441 50 push eax
166A7442 8B46 44 mov eax, dword ptr [esi+44]
166A7445 50 push eax
166A7446 FFD3 call ebx
166A7448 8BD0 mov edx, eax
166A744A 8D4D D4 lea ecx, dword ptr [ebp-2C]
166A744D FFD7 call edi
166A744F 8B0E mov ecx, dword ptr [esi]
经过上面这一段后,连接了"jhvcdlogo30" 看寄存器:
EAX 0016FF44 UNICODE "F62EAA14415B4116jhvcdlogojhvcdlogo30"
166A745A FF91 84080000 call dword ptr [ecx+884] ————关键算法,执行这个之后,标记为HELLO1
就根据"F62EAA14415B4116jhvcdlogojhvcdlogo30"挺出了注册码的前身,看寄存器:
EDX 0016C584 UNICODE "9E053DC5B75E9A186D2F61170C0B7BDF"
这串字符其实就可以拿来注册的了,其实它的前面16位才是有效注册码。后面的跟不跟都没关系。我们在这做内存注册机。
送给你们当点心、甜饼。大餐的话我功力不够,做不好。
166A74C5 FF15 2C106916 call dword ptr [1669102C] ; MSVBVM60.__vbaStrVarMove 取你的假注册码
166A7525 8995 78FFFFFF mov dword ptr [ebp-88], edx
166A752B C785 70FFFFFF 0>mov dword ptr [ebp-90], 4008
166A7535 FFD7 call edi
166A7537 8D55 B0 lea edx, dword ptr [ebp-50]
166A753A 8D45 A0 lea eax, dword ptr [ebp-60]
166A753D 52 push edx
166A753E 50 push eax
166A753F FF15 20116916 call dword ptr [16691120] ; MSVBVM60.__vbaVarTstEq
166A7545 8D4D A0 lea ecx, dword ptr [ebp-60]
166A7548 66:8BF8 mov di, ax
166A754B 8D55 B0 lea edx, dword ptr [ebp-50]
166A754E 51 push ecx
166A754F 8D45 C0 lea eax, dword ptr [ebp-40]
166A7552 52 push edx
166A7553 50 push eax
166A7554 6A 03 push 3
166A7556 FFD3 call ebx
166A7558 66:F7DF neg di
166A755B 1BFF sbb edi, edi
166A755D B9 08000000 mov ecx, 8
166A7562 897D E8 mov dword ptr [ebp-18], edi
166A7565 8BFC mov edi, esp
166A7567 8B16 mov edx, dword ptr [esi]
166A7569 894D 80 mov dword ptr [ebp-80], ecx
166A756C 890F mov dword ptr [edi], ecx
166A756E 8B4D 84 mov ecx, dword ptr [ebp-7C]
166A7571 B8 ACA56916 mov eax, 1669A5AC ; UNICODE "RegisteredUser"
166A7576 56 push esi
166A7577 894F 04 mov dword ptr [edi+4], ecx
166A757A 8945 88 mov dword ptr [ebp-78], eax
166A757D 8947 08 mov dword ptr [edi+8], eax
166A7580 8B45 8C mov eax, dword ptr [ebp-74]
166A7583 8947 0C mov dword ptr [edi+C], eax
166A7586 FF92 90030000 call dword ptr [edx+390]
166A758C 85C0 test eax, eax
166A758E DBE2 fclex
166A7590 7D 12 jge short 166A75A4
166A7592 68 90030000 push 390
166A7597 68 DC926916 push 166992DC
166A759C 56 push esi
166A759D 50 push eax
166A759E FF15 78106916 call dword ptr [16691078] ; MSVBVM60.__vbaHresultCheckObj
166A75A4 68 F0756A16 push 166A75F0
上面这一段是给提取用户信息
166A753F FF15 20116916 call dword ptr [16691120] ; MSVBVM60.__vbaVarTstEq
上面这一句莫非是关键比较?为了验证我们的想法,请先在这里下断点,待会有用!!!!!我们标记为:NO1断点
166A416C 52 push edx
166A416D 56 push esi
166A416E FF91 48080000 call dword ptr [ecx+848]
166A4174 3BC7 cmp eax, edi ; 莫非是关键标志检测?先再这里下断点,标记为NO2断点
166A4176 7D 12 jge short 166A418A
166A4178 68 48080000 push 848
166A417D 68 0C936916 push 1669930C
166A4182 56 push esi
166A4183 50 push eax
166A4184 FF15 78106916 call dword ptr [16691078] ; MSVBVM60.__vbaHresultCheckObj
166A418A 8B45 C8 mov eax, dword ptr [ebp-38]
166A418D 83EC 10 sub esp, 10
166A4190 8BD4 mov edx, esp
166A4192 B9 0B400000 mov ecx, 400B
166A4197 894D CC mov dword ptr [ebp-34], ecx
166A419A 8945 C4 mov dword ptr [ebp-3C], eax
166A419D 890A mov dword ptr [edx], ecx
166A419F 8B4D D0 mov ecx, dword ptr [ebp-30]
166A41A2 8D45 C4 lea eax, dword ptr [ebp-3C]
166A41A5 6A 01 push 1
166A41A7 894A 04 mov dword ptr [edx+4], ecx
166A41AA 8945 D4 mov dword ptr [ebp-2C], eax
166A41AD 6A 01 push 1
166A41AF 56 push esi
166A41B0 8942 08 mov dword ptr [edx+8], eax
166A41B3 8B45 D8 mov eax, dword ptr [ebp-28]
166A41B6 8942 0C mov dword ptr [edx+C], eax
166A41B9 FF15 40106916 call dword ptr [16691040] ; MSVBVM60.__vbaRaiseEvent 提示错误信息了
166A41BF 83C4 1C add esp, 1C
一路下来,到这里就已经提示错误了,大概的流程已经有了个印象了。好了,我们单击确定,F9运行下去,重新填上注册信息,再次注册。
断下来后,一路狂按F9,直到NO2断点,修改
166A4176 7D 12 jge short 166A418A 改它为不跳走,试试能不能突破?(改标志S即可)
测试结果为不是标志,所以取消掉NO2断点,下面重复上一验证的方法,来看看NO1能起什么作用?
F9运行下去,重新填上注册信息,再次注册。断下来后,一路狂按F9,直到NO1断点,修改
166A753F FF15 20116916 call dword ptr [16691120] ; NO1断点
166A7545 8D4D A0 lea ecx, dword ptr [ebp-60] 怎么改?执行到这一句后,看看寄存器:
166A7548 66:8BF8 mov di, ax
166A754B 8D55 B0 lea edx, dword ptr [ebp-50]
166A754E 51 push ecx
寄存器:
EAX 00000000
呵呵,用鼠标在EAX上双击,修改数据为“FFFFFFFF”如:
EAX FFFFFFFF
然后F9运行到底,提示注册成功了。看来不出所料,
166A753F FF15 20116916 call dword ptr [16691120] ; MSVBVM60.__vbaVarTstEq
这一句(NO1断点处)还真的是关键比较的地方了。我是不知道怎么改好,如果要爆破的话。这里好像是不能修改代码的。
不过可以打内存补丁进行爆破。如果你用注册码,这里也就不用管了。好了,先讲到这里吧。
附件是内存注册机和删除注册信息再玩一遍的REG文件,解压密码是:
159357
该内存注册机匹配 http://www.jh686.cn/soft/vcdlogo30.rar
得到的注册码前16位真实有效,后面的可以忽略掉。不忽略也可以成功注册。
想睡觉了~~哎~~挺天亮吧