首页
社区
课程
招聘
[原创]Molebox 4.5462 脱壳及VFS分析
发表于: 2013-12-5 14:02 16531

[原创]Molebox 4.5462 脱壳及VFS分析

2013-12-5 14:02
16531

1)脱壳
这个壳很简单(我这个外面还有坚石诚信ET199的壳),可以无视,但在这也顺带说一下思路吧:
我基本上从不先调试程序,基本上会先让其运行,dump之,然后用16进制工具和IDA先分析,找到入口点,VC的、delphi等的都有其固有特征(我是说一般情况):
VC的入口点基本都要判断PE属性,所以一般必然有如下代码:
.data:007CA429     mov     eax, 5A4Dh
.data:007CA42E     cmp     ds:400000h, ax
看到这个,就知道入口在附近,回溯一下就找到了
Delphi的入口一定在代码段的最后,或者搜索delphi运行时的固定代码串等,
再回到Molebox,假定找到了入口:
.data:00AFEF5D    mov     eax, dword_AF1D28
.data:00AFEF62    push    eax
.data:00AFEF63    popfd;//各位,这个很熟悉吧
.data:00AFEF64    mov     eax, off_AF1D08
.data:00AFEF69    jmp     off_AF1D2C  入口点
发现其IMPORT表并没加密,不过,往上翻一下看看:
.data:00AFEE5F  call    sub_AFFD90  ;//这一行注意,进去看看
.data:00AFEE64  mov     eax, off_B01118
.data:00AFEE69  mov     eax, [eax+10Ch]
.data:00AFEE6F  shl     eax, 18h
.data:00AFEE72  sar     eax, 1Fh
.data:00AFEE75  test    eax, eax

.data:00AFFD90  sub_AFFD90      proc near               ; 
.data:00AFFD90  mov     eax, offset dword_AF6FB8
.data:00AFFD95  loc_AFFD95:
.data:00AFFD95  push    40h
.data:00AFFD97  pop     ecx
.data:00AFFD98  loc_AFFD98:    ; CODE XREF: sub
.data:00AFFD98  xor     dword ptr [eax], 0FFh;//想干啥啊,咱不让干,直接retn
.data:00AFFD9E  add     eax, 4
.data:00AFFDA1  dec     ecx
.data:00AFFDA2  jnz     short loc_AFFD98
.data:00AFFDA4  cmp     eax, offset unk_AF77B8
.data:00AFFDA9  jl      short loc_AFFD95
.data:00AFFDAB  retn
.data:00AFFDAB sub_AFFD90    endp
上面这个程序应该是清重定位表?
接下来大家知道怎么办,不浪费口舌了。
2)谈谈Molebox的VFS(虚拟文件系统)
  一般的情况下,使用h4sh3m的 Virtual Packages Extractor 1.1或者Sh4DoVV的 Extractor均可将文件释放出来,但是如果从NoleBox界面上选择Hide All File的话,这两个工具失去作用的,因为文件名是加密的,看不到,那么如何将文件弄出来呢,我一开始是分析VFS的结构,从STELBOX这个DLL分析中,实际上完全可以将文件读出来,我花了很大功夫反这这些代码,发现采用的是DES算法,如果是数据文件,还需要进行unzip,并且是一块一块解(当然这是内存所限必须这么做),其key就在代码中,每次要读写一个文件时,VFS将其重定向到主程序PE的附加数据位置,再从VFS目录结构中找到对应文件的位置,再用文件操作API读取,解密,解压缩,不过,当做到能将其目录结构解开时已经费了很大劲,这时大致知道了其VFS的mount和文件读写方法,其将系统kernel32,user32,ntdll等API全部编号封装再调用,VFS内支持文件操作的代码:
seg000:00C4C5D0
seg000:00C4C5D0 loc_CE4C5D0:  ; CODE XREF: 
seg000:00C4C5D0                 mov     edx, [ebp+arg_8] ; jumptable 0CE4C5C9 case 0
seg000:00C4C5D3                 mov     eax, [ebp+arg_4]
seg000:00C4C5D6                 push    edx
seg000:00C4C5D7                 push    eax
seg000:00C4C5D8                 call    apif_CreateFile
seg000:00C4C5DD                 pop     ebp
seg000:00C4C5DE                 retn    0Ch
seg000:00C4C5E1 ; ---------------------------------------------------------------------------
seg000:00C4C5E1                 mov     edx, [ebp+arg_8] ; jumptable 0CE4C5C9 case 1
seg000:00C4C5E4                 mov     eax, [ebp+arg_4]
seg000:00C4C5E7                 push    edx
seg000:00C4C5E8                 push    eax
seg000:00C4C5E9                 call    apif_OpenFile
seg000:00C4C5EE                 pop     ebp
seg000:00C4C5EF                 retn    0Ch
seg000:00C4C5F2 ; ---------------------------------------------------------------------------
seg000:00C4C5F2                 mov     edx, [ebp+arg_8] ; jumptable 0CE4C5C9 case 2
seg000:00C4C5F5                 mov     eax, [ebp+arg_4]
seg000:00C4C5F8                 push    edx
seg000:00C4C5F9                 push    eax
seg000:00C4C5FA                 call    apif_ReadFile
seg000:00C4C5FF                 pop     ebp
seg000:00C4C600                 retn    0Ch
。。。
seg000:00C4C658 ; ---------------------------------------------------------------------------
seg000:00C4C658                 mov     edx, [ebp+arg_8] ; jumptable 0CE4C5C9 case 8
seg000:00C4C65B                 mov     eax, [ebp+arg_4]
seg000:00C4C65E                 push    edx
seg000:00C4C65F                 push    eax
seg000:00C4C660                 call    apif_QueDirInfo;//查询目录信息
seg000:00C4C665                 pop     ebp
seg000:00C4C666                 retn    0Ch
分析到这的时候,各位看官可能想到点什么,我是想直接用远线程注入调用apif_QueDirInfo这个函数,不过其入口两个参数困扰了半天,只能翻其SDK看看,正当有点眉目的时候,意外发现一个不能算是漏洞的漏洞(这个先不说了,不要扔砖,毕竟咱也是扣脚大汉),改了一个字节,文件名全部解开了(注意哦,用FileMon也看不到文件名的哦),找到文件清单就好办了,VFS很好的,只要注入线程,直接CopyFile吧。


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 5
支持
分享
最新回复 (14)
雪    币: 350
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
注入DLL直接调用FindFirstFile, FindNextFile, CreateFile, ReadFile会有什么事情发生 ?
2013-12-5 14:36
0
雪    币: 215
活跃值: (61)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
如果是隐藏文件的,FindFirst*,FindNext*,什么也找不到.
2013-12-5 15:08
0
雪    币: 350
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
找不到的话那被打包的程序要怎么打开文件
2013-12-5 16:32
0
雪    币: 1103
活跃值: (496)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
说实话,真想扔个砖,欲言又止,扭扭捏捏,好不痛快的一哥们。。。。。
2014-6-27 23:22
0
雪    币: 1103
活跃值: (496)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
经过自己打包程序测试,勾选Hide All Files后打包,自己注入DLL,使用FindFirst*,FindNext*,的确什么也找不到,只能找到EXE同一目录下的文件,请问Diabloking,如何做到注入DLL,调用FindFirstFile, FindNextFile,便可得到打包文件列表?
2014-7-1 01:00
0
雪    币: 2401
活跃值: (1402)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
旧版的,直接注入就都现形了。
新版的,前段时间看过,找不到。
2014-7-1 11:31
0
雪    币: 1103
活跃值: (496)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
难道楼主说的那个一个字节漏洞就在call    apif_QueDirInfo;//查询目录信息  这个函数里面?
2014-7-1 18:34
0
雪    币: 1103
活跃值: (496)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
我自己写个程序,不是注入DLL,不勾选Hide All Files并打包,调用FindFirstFile, FindNextFile遍历我自己打包的文件夹里面文件,打包文件清单正常遍历出来,但是勾选Hide All Files,我自己写的程序进行遍历都感知不到包里的文件夹以及里面的文件,只能找到EXE同一目录下的文件列表
2014-7-2 09:45
0
雪    币: 817
活跃值: (1927)
能力值: ( LV12,RANK:2670 )
在线值:
发帖
回帖
粉丝
10
期待更为详细的文章
2014-7-2 16:38
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
谢谢提供这么好的学习资料,好好学习!!
2014-7-3 08:07
0
雪    币: 1103
活跃值: (496)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
给自己,也给大家总结一下自己的学习结果,花了好长时间,通过自己的学习最终解包出了Molebox 4.5462 勾上Hide All Files的文件。咱不是扣脚大牛,只是一个普通菜鸟,还是没有达到楼主的境界,解密出所有打包的文件列表,只是换了个思路,用了个笨办法处理文件列表。方法简单的出奇,就是对程序访问文件的所有API下断,比如CreateFileA/W,LoadLibarayA/W,LoadLibarayExA/W,ExReadFile,WriteFile等等,Molebox总该让程序感知访问的文件路径以及文件名吧!被断下后,通过查看文件路径来捕获被Molebox 隐藏的文件名,通过穷举,获得了程序大部分需要的文件列表,自己写个DLL注入程序,直接调用CopyFile函数,一个一个拷贝出来,就可以了,所谓条条大路通罗马,转变个思路就解决了解包问题。
    当然这样处理得到的文件列表还是不齐全,但是不要紧,绝大多数的文件已经解包,剩下的就在程序需要访问某个文件的时候对API下断,通过调试就可以得到你需要解包的文件路径和文件名。
2014-7-11 16:01
0
雪    币: 817
活跃值: (1927)
能力值: ( LV12,RANK:2670 )
在线值:
发帖
回帖
粉丝
13
求方法,求工具
2014-7-15 22:23
0
雪    币: 1103
活跃值: (496)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
使用OD打开Molebox打包的文件,对CreateFileA/W,LoadLibarayA/W,LoadLibarayExA/W下断后,运行,就会出现疯狂断下的情况,断下后看堆栈,就会出现访问文件的路径和名字,如果是系统DLL什么的,你就点运行,只要被打包程序需要访问被隐藏的DLL或者其他的隐藏文件,堆栈里就可以看到隐藏的文件路径以及文件名,这样通过穷举,就可以得到隐藏的文件列表,当然中断/运行N次,才会出现被打包程序访问隐藏的文件名以及路径,至于工具吗,其实就和外挂一样,是我自己写了一个带窗体的DLL,注入到打包程序里面,呼出,点一个按钮,按钮Click事件就直接调用CopyFile(".//被截获的隐藏文件夹//a.exe(被截获的隐藏文件名)","C://a.exe"),这样既可,工具代码什么的,就不放了,太挫,太丢人了。。。
2014-7-15 23:25
0
雪    币: 215
活跃值: (61)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
话说载入STELBOX后,看到函数starting_stage_1(见上),进入:
seg000:00C65390 starting_stage_1 proc near              ;
seg000:00C65390                 push    ebp
seg000:00C65391                 mov     ebp, esp
seg000:00C65393                 push    ebx
seg000:00C65394                 mov     ebx, [ebp+arg_0]
seg000:00C65397                 push    esi
seg000:00C65398                 push    edi
seg000:00C65399                 test    bl, 1
seg000:00C6539C                 jz      short loc_CE653A3
seg000:00C6539E                 call    logMode
seg000:00C653A3

秘密就在此,jz 改为nop nop,你就看到文件清单了
2014-10-14 08:59
0
游客
登录 | 注册 方可回帖
返回
//