【文章标题】: 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,汗~~升级了
一个小版本,突然膨胀这么大。 |