海风月影's profile海风月影BlogListsNetwork Tools Help

Blog


    偶变了。。。。。

    每天早上去公司,要坐公交车,这辆车早上老人比较多,以前偶都主动给老人让座,现在偶发现偶变了。。。基本不给别人让座了。。。。。。。。惭愧,惭愧。。。

    VBox 4.3 脱壳 - MINITAB(Registered Trademark) Release 14.20

     
    【文章标题】: 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 返回
    搜索二进制代码
     
    C3 8B ?? ?? 6A 01
     
    搜索到这里:
     
    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,向下看,不远处:
     
    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是多少
     
    ds:[05400014]=009DB8B4 (Mtb14.009DB8B4)
    esi=05400000, (ASCII "XlXl")
    跳转来自 07007FB4
    OEP=[05400014]=009DB8B4
     
    清除前面所有断点,下硬件执行断点: he 009DB8B4,F9运行,已经稳稳地停在了OEP处,程序是VC++写的

    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运行
     
    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返回
     
    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 :
     
    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中跳过去看看:
     
    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的区域。
    随便找块空地,写入下面代码
        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                    ; 原地打转,防止断点断不下来

    二进制代码:

    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的过程修改一下返回代码
    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行,二进制代码
    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,汗~~升级了
    一个小版本,突然膨胀这么大。
     
     
    --------------------------------------------------------------------------------
    【版权声明】: 本文原创于海风月影, 转载请注明作者并保持文章的完整, 谢谢!
                                                           2006年10月02日 18:00:58

    VC中添加小音乐

    国外很多注册机都有小音乐,下面我们来尝试如何给直接的程序加上小音乐,这里用的是 winmm 版的
     
    先用ufmod中的工具 eff 选一首歌,生成一个歌的数据文件:如 xm.c
    将 xm.c , ufmod.h , ufmod.obj 复制到工程目录下
    在工程中加入上面3个文件,然后在主文件中加入下面2行:
    #include "ufmod.h"
    #include "xm.c"
    打开工程-设置,选连接,手工加入库文件 : winmm.lib
    然后在程序启动的时候也就是
    case WM_CREATE:
    后面加上播放歌的语句
    uFMOD_PlaySong ( xm , (void*)11163 , 1);
    其中的 11163是生成文件 xm 里那个 xm[]数组的大小 ,1代表是内存数据
    ok,收工。
     
    附上需要下载的工具
     
     
    更多的XM音乐下载:

     
     

    CCG Keygenme2.1 DONE

     
     发图纪念一下
     
    今天刚搞定了CCG Keygenme2.1