返回列表 发帖

[转帖]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 返回 搜索二进制代码 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,汗~~升级了 一个小版本,突然膨胀这么大。

返回列表 回复 发帖