飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 7551|回复: 4

[原创] VB狂风汉化百宝箱破解(申请加分)

[复制链接]

该用户从未签到

发表于 2008-2-22 20:00:44 | 显示全部楼层 |阅读模式
VB狂风汉化百宝箱破解(申请加分) 没办法 我还是“新手上路”/:L
写在前面:
     这几天头都被VB的程序搞大了,源由一个VB程序,是属于重启验证型的,有三处关键跳转,已经被我爆破,可本人非钻牛角尖,硬是想分析一下VB程序的算法,做一个注册机,所以整天在VB内部函数中跟来跟去,晕头转向,气得不行。VB程序实在太可气,不过好在已经解决98%了。届时写一个篇关于将其刮肠破肚的过程。写一个纯入门级的教程,软件就是狂风汉化百宝箱了,谁让它也用VB编呢?一来杀杀VB的锐气,以解我近日心头之恨
【使用工具】 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用法请参见看雪教程)
  http://tinypic.com/1e6f74         
     代码分析如下,注册机做法在稍后的总结内:


以上代码省略 ......................

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处下断,向下追,离爆破点不远了,一定要活着回来啊,千万别炸伤了!)
--------------------------------------------------------------------------------
【用户名、密码】
用户名:e3322
机器码:4746442
注册码:MNMNKMI
最后告 大家,我在多台配置不同的电脑上都试过了,用户名并不参与注册的运算的,只是个摆设而已。因此结论是:VB的运算很傻的哟!
PYG19周年生日快乐!
  • TA的每日心情
    郁闷
    2016-6-2 14:04
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2008-2-22 23:08:15 | 显示全部楼层
    加详细算法就合适了
    PYG19周年生日快乐!
  • TA的每日心情

    2016-6-2 20:34
  • 签到天数: 10 天

    [LV.3]偶尔看看II

    发表于 2008-2-23 00:49:25 | 显示全部楼层
    jackily 很早期的文章里有详细算法
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2008-4-7 17:14:06 | 显示全部楼层
    00462C30     >   8B95 B0FEFFFF      mov edx,dword ptr ss:[ebp-150]       ;[ebp-150] 假码地址
    00462C36     .   8B46 54            mov eax,dword ptr ds:[esi+54]        ;[esi+54] 真码地址

    改成:

    00462C30     >   8B95 B0FEFFFF      mov edx,dword ptr ds:[esi+54]      ;[esi+54] 真码地址
    00462C36     .   8B46 54            mov eax,dword ptr ds:[esi+54]        ;[esi+54] 真码地址

    是否可行呢?

    [ 本帖最后由 凡人1234 于 2008-4-7 17:15 编辑 ]
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2008-4-10 00:02:02 | 显示全部楼层
    谢谢下来看看……
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表