论坛: 编程破解 标题: [转帖]VBox4.3脱壳-MINITAB(RegisteredTrademark)Release14.20 复制本贴地址    
作者: yongmin [yongmin]    论坛用户   登录
【文章标题】: VBox 4.3 脱壳 - MINITAB(Registered Trademark) Release 14.20
【文章作者】: 海风月影
【作者主页】: http://depteicn.spaces.live.com
【软件名称】: MINITAB(Registered Trademark) Release 14.20
【软件大小】: 78M
【下载地址】: 自己搜索下载
【加壳方式】: VBOX 4.3
【使用工具】: OllyDBG ,LordPE ,ImportREC ,PEID
【操作平台】: WinXP SP2
【软件介绍】:
        MINITAB统计软件是为六西格玛和其它质量改善项目采用的理想套装软件。从统计过程控制(Statistical Process Control)到试验设

计(Design of Experiments),MINITAB为你提供实现质量项目各阶段目标的方法;同时“StatGuide”和“ReportPad”等工具将帮助你理解和联

系你的操作结果。与普通的软件相比,MINITAB统计软件更为精确、可靠、易于使用。 除了具有比老版本更多的统计功能外,MINITAB 14 还有

许多更令人兴奋的新特点,如:

- 一个强大的新图形引擎将基于你的数据传递出精彩的、有洞察力的图形结果
- 更容易创建、编辑、升级图形
- 可自定义菜单、工具栏的功能将使你能够便捷地访问常用的工具

【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】


由于专业需要用到统计软件,老师推荐了 MINITAB 14 ,当然比不过强大的 MATLAB ,不过比起MATLAB 6XXM的庞大身躯来说,minitab 14.10

只有15M,非常适合传播。
老师给的是minitab 14.10 30天试用版,30天后就不能用了~~。老师还说暂时找不到破解版,有谁能通过某些途径获得破解版的,本课程期

末可以加分=。=,我汗~~ 



查壳,VBOX 4.3 - 4.6.x -> WeijunLi [Overlay]
VBOX的anti不强,只是修复IAT稍有点麻烦。我最怕anti,所以拣个anti不强的软柿子来捏捏 :

一,找OEP

OD设置忽略所有异常,用HideOD插件选中 Auto Run HideOD,如果你没有HideOD,用IsDebug 1.4插件去掉Ollydbg的调试器标志。(什么?你也

没有IsDebug 1.4插件?那么你的OD八成是某大侠秘传的,可以直接过IsDebug检测  )

载入Mtb14.exe。

如果先停在入口处,则F9运行它,直到出现试用的窗口,OD设置去掉忽略INT 3异常的勾,点 试用(Try)
如果先出现试用窗口,则点 试用(Try) ,让它停在入口处,OD设置去掉忽略INT 3异常的勾,F9运行

程序暂停在最后一次 INT 3 异常处,MINITAB 14.10只有1次异常,MINITAB 14.20有2次异常,不管有几次,停在最后一次

Ctrl + F9 返回

搜索二进制代码



CODE:[Copy to clipboard]C3 8B ?? ?? 6A 01
搜索到这里:


CODE:[Copy to clipboard]07007F08  .  C3            retn                                    ;  <===搜索到这里
07007F09  >  8B75 08      mov    esi, dword ptr ss:[ebp+8]        ;  <===这行下硬件执行断点
07007F0C  .  6A 01        push    1
下硬件执行断点: he 7007f09 , F9运行,停在 7007F09处,删除硬件断点 hd 7007f09,下面就可以单步执行或者下F2断点了,程序自校验已

经结束。

[ESI+14]里就是OEP,向下看,不远处:


CODE:[Copy to clipboard]07007F08  .  C3            retn                                    ;  <===搜索到这里
07007F09  >  8B75 08      mov    esi, dword ptr ss:[ebp+8]        ;  <===这行下硬件执行断点
07007F0C  .  6A 01        push    1                                ;  向下看
07007F0E  .  5F            pop    edi
07007F0F  .  C745 FC 16000>mov    dword ptr ss:[ebp-4], 16
07007F16  .  817E 0C F8000>cmp    dword ptr ds:[esi+C], 0F8
07007F1D  .  75 1D        jnz    short vboxt430.07007F3C
07007F1F  .  F645 A8 40    test    byte ptr ss:[ebp-58], 40
07007F23  .  74 17        je      short vboxt430.07007F3C
07007F25  .  8B46 14      mov    eax, dword ptr ds:[esi+14]      ;  <===[esi+14]里就是OEP★
07007F28  .  3B05 D0210407 cmp    eax, dword ptr ds:[70421D0]      ;  kernel32.ExitProcess
07007F2E  .  75 07        jnz    short vboxt430.07007F37
07007F30  .  E8 04C4FFFF  call    vboxt430.07004339
07007F35  .  EB 05        jmp    short vboxt430.07007F3C
07007F37  >  E8 CEC1FFFF  call    vboxt430.0700410A
07007F3C  >  8366 1C 00    and    dword ptr ds:[esi+1C], 0
07007F40  .  817E 0C C7000>cmp    dword ptr ds:[esi+C], 0C7
07007F47  .  8D5E 1C      lea    ebx, dword ptr ds:[esi+1C]
07007F4A  .  75 61        jnz    short vboxt430.07007FAD
07007F4C  .  8B46 14      mov    eax, dword ptr ds:[esi+14]      ;  <===[esi+14]里就是OEP★
07007F4F  .  33C9          xor    ecx, ecx
07007F51  .  3B05 D0210407 cmp    eax, dword ptr ds:[70421D0]      ;  kernel32.ExitProcess
07007F57  .  0F94C1        sete    cl
07007F5A  .  85C9          test    ecx, ecx
07007F5C  .  894D 08      mov    dword ptr ss:[ebp+8], ecx
07007F5F  .  75 10        jnz    short vboxt430.07007F71
07007F61  .  FF75 14      push    dword ptr ss:[ebp+14]
07007F64  .  FF75 10      push    dword ptr ss:[ebp+10]
07007F67  .  FF75 0C      push    dword ptr ss:[ebp+C]
07007F6A  .  FFD0          call    eax
07007F6C  .  8946 18      mov    dword ptr ds:[esi+18], eax
07007F6F  .  EB 04        jmp    short vboxt430.07007F75
07007F71  >  8366 18 00    and    dword ptr ds:[esi+18], 0
07007F75  >  837D 10 00    cmp    dword ptr ss:[ebp+10], 0
07007F79  .  75 03        jnz    short vboxt430.07007F7E
07007F7B  .  57            push    edi
07007F7C  .  EB 1C        jmp    short vboxt430.07007F9A
07007F7E  >  397D 10      cmp    dword ptr ss:[ebp+10], edi
07007F81  .  75 2A        jnz    short vboxt430.07007FAD
07007F83  .  837D 08 00    cmp    dword ptr ss:[ebp+8], 0
07007F87  .  74 24        je      short vboxt430.07007FAD
07007F89  .  E8 61D1FFFF  call    vboxt430.070050EF
07007F8E  .  83F8 02      cmp    eax, 2
07007F91  .  74 05        je      short vboxt430.07007F98
07007F93  .  83F8 03      cmp    eax, 3
07007F96  .  75 15        jnz    short vboxt430.07007FAD
07007F98  >  6A 00        push    0
07007F9A  >  53            push    ebx
07007F9B  .  8D85 74FEFFFF lea    eax, dword ptr ss:[ebp-18C]
07007FA1  .  FF75 0C      push    dword ptr ss:[ebp+C]
07007FA4  .  50            push    eax
07007FA5  .  E8 98050000  call    vboxt430.07008542
07007FAA  .  83C4 10      add    esp, 10
07007FAD  >  83BD BCFEFFFF>cmp    dword ptr ss:[ebp-144], 0
07007FB4  .  74 0C        je      short vboxt430.07007FC2
07007FB6  .  FFB5 BCFEFFFF push    dword ptr ss:[ebp-144]
07007FBC  .  E8 5892FFFF  call    vboxt430.07001219
07007FC1  .  59            pop    ecx
07007FC2  >  8B76 14      mov    esi, dword ptr ds:[esi+14]      ;  <===[esi+14]里就是OEP★
这3行都是取OEP,3行都下断点,F9运行,停下来,看一下OEP是多少


CODE:[Copy to clipboard]ds:[05400014]=009DB8B4 (Mtb14.009DB8B4)
esi=05400000, (ASCII "XlXl")
跳转来自 07007FB4

OEP=[05400014]=009DB8B4
清除前面所有断点,下硬件执行断点: he 009DB8B4,F9运行,已经稳稳地停在了OEP处,程序是VC++写的


CODE:[Copy to clipboard]009DB8B4  /.  55            push    ebp                              ;  <===OEP
009DB8B5  |.  8BEC          mov    ebp, esp
009DB8B7  |.  6A FF        push    -1
009DB8B9  |.  68 00D5A700  push    Mtb14.00A7D500
009DB8BE  |.  68 12BF9D00  push    Mtb14.009DBF12                  ;  jmp 到 MSLURT._except_handler3; SE 处理程序安装
009DB8C3  |.  64:A1 0000000>mov    eax, dword ptr fs:[0]
009DB8C9  |.  50            push    eax
009DB8CA  |.  64:8925 00000>mov    dword ptr fs:[0], esp
009DB8D1  |.  83EC 68      sub    esp, 68
009DB8D4  |.  53            push    ebx
009DB8D5  |.  56            push    esi
009DB8D6  |.  57            push    edi
009DB8D7  |.  8965 E8      mov    dword ptr ss:[ebp-18], esp
009DB8DA  |.  33DB          xor    ebx, ebx
009DB8DC  |.  895D FC      mov    dword ptr ss:[ebp-4], ebx
009DB8DF  |.  6A 02        push    2
009DB8E1  |.  5F            pop    edi
009DB8E2  |.  57            push    edi
009DB8E3  |.  FF15 C07FA300 call    dword ptr ds:[A37FC0]            ;  MSLURT.__set_app_type
◆小插曲

对于VC++写的程序可以这样找OEP

下断点BP GetVersion,然后F9运行,不过这个程序入口处没用到GetVersion,不过仔细看看可以发现VC++写的程序入口处也会出现这个函数

MSLURT.__set_app_type,也可以用BP MSLURT.__set_app_type方式来找OEP,不过有个缺陷,就是MSLURT.dll加壳后不一定是静态导入的,如

果不是静态导入是不能这样下断点的,用LORDPE查看加壳的文件,发现有MSLURT.dll文件,呵呵,那么找OEP就方便多了。

●简单找OEP的方法

入口处下断点:bp mslurt.__set_app_type,把断点改在RETN处,忽略所有异常 , F9运行


CODE:[Copy to clipboard]780067D4 >  8B4424 04      mov    eax, dword ptr ss:[esp+4]        ; mslurt.__set_app_type
780067D8    A3 088F0378    mov    dword ptr ds:[78038F08], eax
780067DD    C3              retn                                    ; <===把断点改在这里
很稳地停在了 retn 处,F8返回


CODE:[Copy to clipboard]009DB8B4    55              push    ebp                              ; <====OEP
009DB8B5    8BEC            mov    ebp, esp
009DB8B7    6A FF          push    -1
009DB8B9    68 00D5A700    push    Mtb14.00A7D500
009DB8BE    68 12BF9D00    push    Mtb14.009DBF12                  ; jmp 到 MSLURT._except_handler3
009DB8C3    64:A1 00000000  mov    eax, dword ptr fs:[0]
009DB8C9    50              push    eax
009DB8CA    64:8925 0000000>mov    dword ptr fs:[0], esp
009DB8D1    83EC 68        sub    esp, 68
009DB8D4    53              push    ebx
009DB8D5    56              push    esi
009DB8D6    57              push    edi
009DB8D7    8965 E8        mov    dword ptr ss:[ebp-18], esp
009DB8DA    33DB            xor    ebx, ebx
009DB8DC    895D FC        mov    dword ptr ss:[ebp-4], ebx
009DB8DF    6A 02          push    2
009DB8E1    5F              pop    edi
009DB8E2    57              push    edi
009DB8E3    FF15 C07FA300  call    dword ptr ds:[A37FC0]            ; MSLURT.__set_app_type
009DB8E9    59              pop    ecx                              ; 返回到这里,向上看
当然这里是可以DUMP的

用LordPE ,Correct ImageSize后dump full,保存为dump.exe



二,修复IAT

运行ImportREC,选择Mtb14.exe,OEP填 5DB8B4 (9DB8B4-400000),搜索 IAT,GET Imports。
开始地址:00636FFC
大小:    00006D90

可以看到有很多无效的指针,随便找一个看看。点右键,disassemble/hex view :


CODE:[Copy to clipboard]056B0000    call 070103BA    // ~= vboxt430.dll/0001
056B0005    outs dx,byte ptr es:[edi]
056B0006    ja short 056AFF8F
056B0008    add [eax],al
056B000A    add [eax],al
跑到VBOX空间里去了,显然这个指针不能CUT掉,再多看几个,发现都是call 070103BA,看来070103BA这个函数是解码API的函数。在OD中跳过

去看看:


CODE:[Copy to clipboard]070103BA  /.  55            push    ebp                              ;  <===VBOX 解码 API的过程
070103BB  |.  8BEC          mov    ebp, esp
070103BD  |.  83EC 10      sub    esp, 10
070103C0  |.  53            push    ebx
070103C1  |.  8945 FC      mov    dword ptr ss:[ebp-4], eax        ;  保存寄存器的值
070103C4  |.  895D F8      mov    dword ptr ss:[ebp-8], ebx
070103C7  |.  894D F4      mov    dword ptr ss:[ebp-C], ecx
070103CA  |.  8955 F0      mov    dword ptr ss:[ebp-10], edx
070103CD  |.  8D45 F0      lea    eax, dword ptr ss:[ebp-10]
070103D0  |.  50            push    eax
070103D1  |.  8D45 F4      lea    eax, dword ptr ss:[ebp-C]
070103D4  |.  50            push    eax
070103D5  |.  8D45 F8      lea    eax, dword ptr ss:[ebp-8]
070103D8  |.  50            push    eax
070103D9  |.  8D45 FC      lea    eax, dword ptr ss:[ebp-4]
070103DC  |.  50            push    eax
070103DD  |.  E8 12000000  call    vboxt430.070103F4                ;  解码过程
070103E2  |.  83C4 10      add    esp, 10
070103E5  |.  8B45 FC      mov    eax, dword ptr ss:[ebp-4]        ;  这4行恢复寄存器
070103E8  |.  8B5D F8      mov    ebx, dword ptr ss:[ebp-8]
070103EB  |.  8B4D F4      mov    ecx, dword ptr ss:[ebp-C]
070103EE  |.  8B55 F0      mov    edx, dword ptr ss:[ebp-10]
070103F1  |.  5B            pop    ebx                              ;  取出EBX
070103F2  |.  C9            leave                                    ;  平衡堆栈
070103F3  \.  C3            retn                                    ;  这里跳到正确的API函数
vbox根据什么解码呢?是根据地址解码的,比如056B0000    call 070103BA ,是根据056B0000解码的。这个我就不解释了,shoooo大侠里关

于ASProtect 里修复 Advanced Import protection 已经说得很清楚了(不解释其实是我解释不清楚,哈哈)。这里的vbox很温柔,解码后直接

跳到正确的API函数,因此,我们就没必要跟进去看了,直接写段代码来修复一下就可以了。

修复前我们需要得到一些数据,首先要知道IAT起始和结束位置,这个ImportREC已经帮我们做到了(什么?你还是找不到?填入OEP,点IAT

Auto Search),然后要知道加密的IAT区域的上下限(不能把正确的函数也拿去修复吧),这个其实也很简单,在ImportREC看看那些无效的指针

的值,最小的,和最大的就可以确定了(啥?太多了看不过来?看不过来就多修复几次,每修复一次肯定能少一些无效指针),当然还可以这样

来找,按Alt + M,查看内存,找到这里:见图1,这里是下限



然后向下找,一直找到这里:见图2,这里是上限



这段区域内都是vbox申请的区域,所以肯定包含了加密IAT的区域。

随便找块空地,写入下面代码


CODE:[Copy to clipboard]    E8 14000000    call    05470019
    00 70 A3 00    dd      00A37000                          ; IAT 起始位置
    00 84 DD A3    dd      00A3DD84                          ; IAT 结束位置
    00 00 F4 01    dd      01F40000                          ; 加密的IAT区域的下限
    00 00 93 06    dd      06950000                          ; 加密的IAT区域的上限
    90                    nop
    90                    nop
    90                    nop
    90                    nop
    5A              pop    edx
    81EA 05004705  sub    edx, 5470005                        ; 自定位计算
    8B82 05004705  mov    eax, dword ptr ds:[edx+5470005]  ; 取当前IAT指针
    8B18            mov    ebx, dword ptr ds:[eax]          ; 取当前IAT
    3B9A 0D004705  cmp    ebx, dword ptr ds:[edx+547000D]  ; 是否小于指定区域
    7C 12          jl      short 05470042
    3B9A 11004705  cmp    ebx, dword ptr ds:[edx+5470011]  ; 是否大于指定区域
    7F 0A          jg      short 05470042
    FFD3            call    ebx                              ; 在区域内,调用它修复
    8B82 05004705  mov    eax, dword ptr ds:[edx+5470005]  ; 取当前IAT指针
    8918            mov    dword ptr ds:[eax], ebx          ; 保存正确的IAT
    8B82 05004705  mov    eax, dword ptr ds:[edx+5470005]
    83C0 04        add    eax, 4
    8982 05004705  mov    dword ptr ds:[edx+5470005], eax
    3B05 09004705  cmp    eax, dword ptr ds:[5470009]      ; 还没结束,循环
    7F 02          jg      short 0547005B                    ; 结束了,跳走
  ^ EB CB          jmp    short 05470026
  - EB FE          jmp    short 0547005B                    ; 原地打转,防止断点断不下来
二进制代码:


CODE:[Copy to clipboard]E8 14 00 00 00 00 70 A3 00 84 DD A3 00 00 00 F4 01 00 00 95 06 90 90 90 90 5A 81 EA 05 00 47 05
8B 82 05 00 47 05 8B 18 3B 9A 0D 00 47 05 7C 12 3B 9A 11 00 47 05 7F 0A FF D3 8B 82 05 00 47 05
89 18 8B 82 05 00 47 05 83 C0 04 89 82 05 00 47 05 3B 82 09 00 47 05 7F 02 EB CB EB FE
进入解码 API的过程修改一下返回代码


CODE:[Copy to clipboard]070103BA  /.  55            push    ebp                              ;  <===VBOX 解码API的过程
070103BB  |.  8BEC          mov    ebp, esp
070103BD  |.  83EC 10      sub    esp, 10
070103C0  |.  53            push    ebx
070103C1  |.  8945 FC      mov    dword ptr ss:[ebp-4], eax
070103C4  |.  895D F8      mov    dword ptr ss:[ebp-8], ebx
070103C7  |.  894D F4      mov    dword ptr ss:[ebp-C], ecx
070103CA  |.  8955 F0      mov    dword ptr ss:[ebp-10], edx
070103CD  |.  8D45 F0      lea    eax, dword ptr ss:[ebp-10]
070103D0  |.  50            push    eax
070103D1  |.  8D45 F4      lea    eax, dword ptr ss:[ebp-C]
070103D4  |.  50            push    eax
070103D5  |.  8D45 F8      lea    eax, dword ptr ss:[ebp-8]
070103D8  |.  50            push    eax
070103D9  |.  8D45 FC      lea    eax, dword ptr ss:[ebp-4]
070103DC  |.  50            push    eax
070103DD  |.  E8 12000000  call    vboxt430.070103F4
070103E2  |.  83C4 10      add    esp, 10
070103E5      8B55 F0      mov    edx, dword ptr ss:[ebp-10]        ;  取回我们的EDX
070103E8      C9            leave                                    ;  平衡堆栈
070103E9      5B            pop    ebx                              ;  取出正确的IAT
070103EA      C3            retn                                      ;  返回我们的代码
修改了4行,二进制代码


CODE:[Copy to clipboard]8B 55 F0 C9 5B C3
代码中带自定位,随便放在哪里都能执行,然后对最后一行原地打转的下断点,在call    05470019新建eip,F9运行,停在了最后一行,此时

用ImportREC重新Get Imports,已经全部为有效的,Ok,Fix Dump。运行脱壳后的程序已经没有30天试用的信息了。


三,后记

注意:如果软件已经过期,是无法脱壳的,一定要能够试用才能够脱壳。我当时没有想过要去脱壳,只是好玩,把日期改到了1年以后,发现不

能用了,改回来也不能用,换到同学机器上才把壳给脱掉==!

老师给的是MINITAB 14.10,安装包只有15M,由于国庆没带回来,在网上找不到14.10的了,找了个14.20的,发现安装包有78M,汗~~升级了

一个小版本,突然膨胀这么大。



地主 发表时间: 06-10-05 11:07

论坛: 编程破解

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号