首页
社区
课程
招聘
[原创]从狂风汉化百宝箱XP 2.0的破解看VB注册(一)
2005-1-19 09:20 8867

[原创]从狂风汉化百宝箱XP 2.0的破解看VB注册(一)

2005-1-19 09:20
8867
从狂风汉化百宝箱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

阿里云助力开发者!2核2G 3M带宽不限流量!6.18限时价,开 发者可享99元/年,续费同价!

收藏
点赞7
打赏
分享
最新回复 (14)
雪    币: 324
活跃值: (974)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
chywan 2 2005-1-19 10:34
2
0
VB中,只有ASCII字符的Unicode编码才是高8位为0的16位二进制数,汉字则不是,其Unicode编码和国标码亦不同。
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ltao 2005-1-19 10:50
3
0
学习……
这是啥子编写器,没见过,请指点一下
雪    币: 265
活跃值: (430)
能力值: ( LV9,RANK:370 )
在线值:
发帖
回帖
粉丝
jackily 9 2005-1-19 10:59
4
0
最初由 ltao 发布
学习……
这是啥子编写器,没见过,请指点一下

keymake 1.73 制作内存注册或文件补丁的利器。
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ltao 2005-1-19 11:07
5
0
哦!我用2.0预览版,内存注册机选项是灰色的
改成1.73就OK了,谢谢!
雪    币: 205
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
侠盗 2005-1-19 11:53
6
0
其实 KEYMAKER 还有一个 2.0 的修改版,可以制作注册机,但不好用。
雪    币: 209
活跃值: (55)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
tane 2005-1-19 12:41
7
0
想当年我破的第一个程序就是这个了.当时真是激动呀,自已写了一个VB小程序然后找规律,居然被我碰对了.没有现在这么幸福,用OD.当时用的是WINME+TRW2000破的.没有用过类似的反编译,万能断点之类的工具.想想真有点...说不出的熟悉呀.哈哈,支持楼主.
雪    币: 214
活跃值: (15)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
ljy3282393 1 2005-1-21 01:54
8
0
支持楼主!
雪    币: 85496
活跃值: (198820)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
linhanshi 2005-1-21 07:48
9
0
支持一下!!!
雪    币: 211
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
HillCat 1 2005-1-21 11:23
10
0
很好的教程!
雪    币: 245
活跃值: (32)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
yxxd 2 2005-1-21 15:03
11
0
虽然比较简单,但很符合新手,好
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
冬虫草 2005-1-21 15:51
12
0
在此学习了真好啊。
雪    币: 242
活跃值: (42)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
makewolf 2005-1-21 17:09
13
0
适合新手噢!!!顶!!
雪    币: 209
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
noTme 1 2005-1-22 13:20
14
0
支持的说!
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
panther666 2005-1-23 05:38
15
0
支持楼主!
游客
登录 | 注册 方可回帖
返回