从狂风汉化百宝箱XP的破解看VB注册(一)(含特别提示,写给初学者)
――手把手系列之三
写在前面:
这几天头都被VB的程序搞大了,源由一个VB程序,是属于重启验证型的,有三处关键跳转,已经被我爆破,可本人非钻牛角尖,硬是想分析一下VB程序的算法,做一个注册机,所以整天在VB内部函数中跟来跟去,晕头转向,气得不行。VB程序实在太可气,不过好在已经解决98%了。届时写一个篇关于将其刮肠破肚的过程。这两天又有坛友问有关VB注册机的问题,就先休息一下,写一个纯入门级的教程,软件就是狂风汉化百宝箱了,谁让它也用VB编呢?一来杀杀VB的锐气,以解我近日心头之恨;二来也祝贺一下本人刚刚担任霏凡解密区的见习版主。言归正传,开工。
【破解作者】 jackily
【作者邮箱】 [email]jackily_zhang@msn.com[/email]
【作者主页】 http://estudy.ys168.com
【使用工具】 peid,ollydbg,keymake
【破解平台】 Win9x/NT/2000/XP
【软件名称】 狂风汉化百宝箱XP 2.00a
【下载地址】 http://www3.skycn.com/soft/9113.html
【软件简介】 前身是“枫叶字符替换器”,用于汉化程序非标准资源,本版本增加了自动汉化,汉化初哥等功能,并且改进了查找速度,和垃圾字串屏蔽算法,使之能更加有效的为汉化者服务,界面采用XP风格。具有汉化“一条龙”服务,包括搜索、替换字串、重点查找、自动汉化、汉化上传、过滤字典编辑等实用功能。绝对是汉化的得力助手。
【加壳方式】 ASPack 2.12 -> Alexey Solodovnikov
【破解声明】 本破解纯属以学习为目的,偶得一点心得,愿与大家分享:)
--------------------------------------------------------------------------------
【破解内容】
安装完毕后主文件为狂风汉化百宝箱XP.exe,用peid检查,无它,唯ASPack 2.12 壳尔。这个曾经叱咤风云的壳,在stripperXP面前服服贴贴地靠边站了。(特别提示一:破解前一定先查壳,否则其坚硬的外衣会将你拒之门外的)。
用ollydbg载入,运行,嗯,VB编出的界面还不赖。点击注册,用户名处自动填了我操作系统当前用户的名:jackily,机器码:4746442,这两项均为灰色不可修改。不管它,输入注册码:123456。点“注册认证”出现错误提示“注册失败,请检查是否输入了大小写!”。数字也要大小写啊?呵呵,开个玩笑。看来注册码应该是字母而非数字。不过反正输入的都是假码,管它字母还是数字呢?好了,重新载入,点右键―“搜索”―“字符参考”。咦,只有几个ASCII码项,哪有刚才的出错信息啊?用unicode查,还是一样,什么相关信息也没有。(特别提示二:一般情况下,用ollydbg的字符参考功能即可查到出错信息,然后双击即可转到其相应地址,也就离注册码算法或比较处不远了,再找合适的地方下断)。
初次受挫,不过学破解就要有死猪不害开水烫的厚脸皮,这点小CASE算什么?没门,跳窗户呗。这回从VB的内部函数入手,(特别提示三:在提示二中说到的方法失效后,就要找函数断点了,比如:打开或读写注册表、创建或打开新文件等等......)。
VB和其它语言稍有不同,其内部函数检测注册码最常用的就两种:一是常用串(string) 比较;二是变量(Variant)比较,因此要重点考察的函数分别是_vbastrcmp或_vbastrcomp 、 _vbavartstne或_vbavartsteq。在ollydbg左下角的命令行中输入bpx _vbastrcmp,回车。弹出新窗口,所列是VB模块中将要调用到的函数名。点右键―排序―目标,以便查找。按图所骥,来到_vbastrcmp处,调用之处太多了,一看_vbastrcomp只有4处调用,先可少的来,将4处全部下断,调试。嘿,我的爆脾气,一拳击倒对手,在00462C3D处停了下来,向上看,为典型的注册调用。(特别提示四:其实,破VB程序最好的工具是SMARTCHK,用它调试直接就可以知道比较函数是_vbastrcmp了,如图一:smartchk用法请参见看雪教程)
代码分析如下,注册机做法在稍后的总结内:
以上代码省略 ......................
00462BEF > \8B0E mov ecx,dword ptr ds:[esi] ; Case 16 of switch 00459221
00462BF1 . 56 push esi
00462BF2 . FF91 7C030000 call dword ptr ds:[ecx+37C]
00462BF8 . 8D95 98FEFFFF lea edx,dword ptr ss:[ebp-168]
00462BFE . 50 push eax
00462BFF . 52 push edx
00462C00 . FF15 88104000 call dword ptr ds:[<&MSVBVM60.__vbaObjS>; MSVBVM60.__vbaObjSet
00462C06 . 8BF8 mov edi,eax
00462C08 . 8D8D B0FEFFFF lea ecx,dword ptr ss:[ebp-150]
00462C0E . 51 push ecx
00462C0F . 57 push edi
00462C10 . 8B07 mov eax,dword ptr ds:[edi]
00462C12 . FF90 A0000000 call dword ptr ds:[eax+A0]
00462C18 . 3BC3 cmp eax,ebx
00462C1A . DBE2 fclex
00462C1C . 7D 12 jge short _狂风汉?00462C30
00462C1E . 68 A0000000 push 0A0
00462C23 . 68 F85C4500 push _狂风汉?00455CF8
00462C28 . 57 push edi
00462C29 . 50 push eax
00462C2A . FF15 64104000 call dword ptr ds:[<&MSVBVM60.__vbaHres> ; 不学算法的以上皆不用理会,VB的代码烂得很。
00462C30 > 8B95 B0FEFFFF mov edx,dword ptr ss:[ebp-150] ;[ebp-150] 假码地址
00462C36 . 8B46 54 mov eax,dword ptr ds:[esi+54] ;[esi+54] 真码地址
00462C39 . 52 push edx ;unicode"123456" 我输入的假码
00462C3A . 50 push eax ;unicode"MNMNKMI" 真码
00462C3B . 6A 01 push 1
00462C3D . FF15 CC114000 call dword ptr ds:[<&MSVBVM60.__vbaStrComp> ;关键比较
00462C43 . 66:8BF8 mov di,ax ;以下简单处理一下
00462C46 . 8D8D B0FEFFFF lea ecx,dword ptr ss:[ebp-150]
00462C4C . 66:F7DF neg di
00462C4F . 1BFF sbb edi,edi
00462C51 . 47 inc edi
00462C52 . F7DF neg edi
00462C54 . FF15 14124000 call dword ptr ds:[<&MSVBVM60.__vbaFree>; MSVBVM60.__vbaFreeStr
00462C5A . 8D8D 98FEFFFF lea ecx,dword ptr ss:[ebp-168]
00462C60 . FF15 10124000 call dword ptr ds:[<&MSVBVM60.__vbaFree>; MSVBVM60.__vbaFreeObj
00462C66 . 66:3BFB cmp di,bx
00462C69 0F84 25010000 je _狂风汉?00462D94 ;跳走就灭火,但此处不是爆破点,不信可试一下,真正的爆破点在
程序启动处
00462C6F . 8B56 54 mov edx,dword ptr ds:[esi+54]
00462C72 . 8D4E 60 lea ecx,dword ptr ds:[esi+60]
00462C75 . FF15 88114000 call dword ptr ds:[<&MSVBVM60.__vbaStrC>; MSVBVM60.__vbaStrCopy
00462C7B . 8B0E mov ecx,dword ptr ds:[esi]
00462C7D . 56 push esi
00462C7E . FF91 84030000 call dword ptr ds:[ecx+384]
00462C84 . 8D95 98FEFFFF lea edx,dword ptr ss:[ebp-168]
00462C8A . 50 push eax
00462C8B . 52 push edx
00462C8C . FF15 88104000 call dword ptr ds:[<&MSVBVM60.__vbaObjS>; MSVBVM60.__vbaObjSet
00462C92 . 8BF8 mov edi,eax ;以上是将数据写入“set.ini”中,以便重启时验证
00462C94 . 8D8D B0FEFFFF lea ecx,dword ptr ss:[ebp-150]
00462C9A . 51 push ecx
00462C9B . 57 push edi
00462C9C . 8B07 mov eax,dword ptr ds:[edi]
00462C9E . FF50 50 call dword ptr ds:[eax+50]
00462CA1 . 3BC3 cmp eax,ebx
00462CA3 . DBE2 fclex
00462CA5 . 7D 0F jge short _狂风汉?00462CB6
00462CA7 . 6A 50 push 50
00462CA9 . 68 30654500 push _狂风汉?00456530
00462CAE . 57 push edi
00462CAF . 50 push eax
00462CB0 . FF15 64104000 call dword ptr ds:[<&MSVBVM60.__vbaHres>; MSVBVM60.__vbaHresultCheckObj
00462CB6 > 8B95 B0FEFFFF mov edx,dword ptr ss:[ebp-150]
00462CBC . 8D4E 64 lea ecx,dword ptr ds:[esi+64]
00462CBF . FF15 88114000 call dword ptr ds:[<&MSVBVM60.__vbaStrC>; MSVBVM60.__vbaStrCopy
00462CC5 . 8D8D B0FEFFFF lea ecx,dword ptr ss:[ebp-150]
00462CCB . FF15 14124000 call dword ptr ds:[<&MSVBVM60.__vbaFree>; MSVBVM60.__vbaFreeStr
00462CD1 . 8D8D 98FEFFFF lea ecx,dword ptr ss:[ebp-168]
00462CD7 . FF15 10124000 call dword ptr ds:[<&MSVBVM60.__vbaFree>; MSVBVM60.__vbaFreeObj
00462CDD . 8B16 mov edx,dword ptr ds:[esi]
00462CDF . 56 push esi
00462CE0 . FF92 04070000 call dword ptr ds:[edx+704]
00462CE6 . 3BC3 cmp eax,ebx
00462CE8 . 7D 12 jge short _狂风汉?00462CFC
00462CEA . 68 04070000 push 704
00462CEF . 68 94574500 push _狂风汉?00455794
00462CF4 . 56 push esi
00462CF5 . 50 push eax
00462CF6 . FF15 64104000 call dword ptr ds:[<&MSVBVM60.__vbaHres>; MSVBVM60.__vbaHresultCheckObj
00462CFC > B9 0A000000 mov ecx,0A
00462D01 . B8 04000280 mov eax,80020004
00462D06 . 898D 4CFEFFFF mov dword ptr ss:[ebp-1B4],ecx
00462D0C . 898D 5CFEFFFF mov dword ptr ss:[ebp-1A4],ecx
00462D12 . 898D 6CFEFFFF mov dword ptr ss:[ebp-194],ecx
00462D18 . 8D95 7CFDFFFF lea edx,dword ptr ss:[ebp-284]
00462D1E . 8D8D 7CFEFFFF lea ecx,dword ptr ss:[ebp-184]
00462D24 . 8985 54FEFFFF mov dword ptr ss:[ebp-1AC],eax
00462D2A . 8985 64FEFFFF mov dword ptr ss:[ebp-19C],eax
00462D30 . 8985 74FEFFFF mov dword ptr ss:[ebp-18C],eax
00462D36 . C785 84FDFFFF 446>mov dword ptr ss:[ebp-27C],_狂风汉?0045654>
00462D40 . C785 7CFDFFFF 080>mov dword ptr ss:[ebp-284],8
00462D4A . FF15 C8114000 call dword ptr ds:[<&MSVBVM60.__vbaVarD>; MSVBVM60.__vbaVarDup
00462D50 . 8D85 4CFEFFFF lea eax,dword ptr ss:[ebp-1B4]
00462D56 . 8D8D 5CFEFFFF lea ecx,dword ptr ss:[ebp-1A4]
00462D5C . 50 push eax
00462D5D . 8D95 6CFEFFFF lea edx,dword ptr ss:[ebp-194]
00462D63 . 51 push ecx
00462D64 . 52 push edx
00462D65 . 8D85 7CFEFFFF lea eax,dword ptr ss:[ebp-184]
00462D6B . 53 push ebx
00462D6C . 50 push eax
00462D6D . FF15 8C104000 call dword ptr ds:[<&MSVBVM60.#595>] ; MSVBVM60.rtcMsgBox,显示成功或出错信息的函数
00462D73 . 8D8D 4CFEFFFF lea ecx,dword ptr ss:[ebp-1B4]
00462D79 . 8D95 5CFEFFFF lea edx,dword ptr ss:[ebp-1A4]
00462D7F . 51 push ecx
00462D80 . 8D85 6CFEFFFF lea eax,dword ptr ss:[ebp-194]
00462D86 . 52 push edx
00462D87 . 8D8D 7CFEFFFF lea ecx,dword ptr ss:[ebp-184]
00462D8D . 50 push eax
00462D8E . 51 push ecx
00462D8F .^ E9 03E2FFFF jmp _狂风汉?00460F97
--------------------------------------------------------------------------------
【破解总结】
详细算法就不追了,前面提到还有一个程序等着收工呢。顺便说一下内存注册机的做法,一般情况下,用keymake做内存注册机时,只能在明码比较时来做。比如刚才的edx是假码存放的地址,eax是真码存放的地址,都是明码。还有一种算是半明码,比如比较的是十进制数或ASCII码的HEX值,也就是十六进制值。因此需要把常用的一些数字的HEX值牢记。我常用的是123456,HEX值是1E240,所以我对它非常敏感。你的常用值是多少啊?
--------------------------------------------------------------------------------
【算法注册机】
都说过了不追了,怎么还往上贴呢?
--------------------------------------------------------------------------------
【内存注册机】
如图二:
中断地址:462C3A
中断次数:1
第一字节:50
指令长度: 2
寄存器方式:EAX
宽字符: 选勾 (一定要选)
特别提示五:另外说一下VB中的宽字符,也就是常说的unicode,它的明确形式就是在内存地址中在各值间加个00。你问我为什么呀?一个字,“笨”呗。:) (你破解多了就知道了)
--------------------------------------------------------------------------------
【爆破地址】
自己练吧。(提示在00464291处下断,向下追,离爆破点不远了,一定要活着回来啊,千万别炸伤了!)
--------------------------------------------------------------------------------
【用户名、密码】
用户名:jackily
机器码:4746442
注册码:MNMNKMI
--------------------------------------------------------------------------------
(待续未完)
【版权声明】 本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!
2005-1-18
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!