首页
社区
课程
招聘
[原创]仿VMPROTECT3.0、Enigma Protector、BoxedApp虚拟文件功能实现原理分析
发表于: 2019-6-26 18:22 10929

[原创]仿VMPROTECT3.0、Enigma Protector、BoxedApp虚拟文件功能实现原理分析

2019-6-26 18:22
10929

【文章标题】: 仿VMPROTECT3.0、Enigma Protector、BoxedApp虚拟文件功能实现原理分析

【文章作者】: PT

【软件名称】: BoxedApp VMPROTECT Enigma Protector

【下载地址】: 自己搜索下载

【操作平台】: WIN32

【作者声明】: 平时太懒了,很少写文章。现在将之前的一些分析整理下发出来,升级等级换

《北京第三届看雪2019安全开发者峰会》门票。能力有限,如有不对内容请指出。

--------------------------------------------------------------------------------

格式有些问题,请下载附件中的PDF版本。


【背景说明】

      用过这两款软件的人都知道,这三款加壳工具都能够实现将文件加密后存放到可执行程序里面。

然后在加壳后的软件启动后,HOOK操作系统文件操作的API接口,从而实现不需要本地磁盘中有

相关文件,而直接虚拟出文件的功能。其中BoxedApp甚至支持虚拟注册表的相关虚拟实现。

      由于自己在做壳过程中想加入将一些可执行程序运行时必须加载的外部DLL捆绑进加壳后的

可执行程序上,从而避免依赖的外部DLL被人篡改。针对这一实现需要,所以特别对它们进行了研究。

下面先说下自己写想要达到的效果,然后对这些软件实现原理进行下分析,最后在说下实现中的一些细节问题。


【功能说明】

  1、能够在加壳时将可执行程序(静态链接、动态加载)的外部第三方DLL文件,捆绑到加壳后的可执行程序中;

  2、当加壳后的可执行程序正常运行时,系统能够自动完成依赖DLL动态库的自动加载及IAT处理过程(不需要人工干预);

  3、能够满足启动及软件运行过程中,系统API及可执行程序内部自身的读取访问支持(暂不考虑写入支持)。

【分析过程】

  1、相关软件的API HOOK分析:

    在考虑相关实现时,虽然知道这些软件肯定是对系统相关的API函数进行了HOOK,然后模拟了相关功能的实现,

但是具体细节不太清楚,担心模拟不全,所以首先对我已知具备该类功能的工具进行下观察分析,以免走弯路。

    首先利用PCHunter_free对BoxedApp、Enigma Protector、VMPROTECT这两款软件加壳后的可执行文件运行时

的HOOK情况进行下记录及对比分析,具体情

    

三款软件所HOOK API清单图


      上图中“内存加载必须函数”列所勾选的函数是经过对比分析后发现三者共同使用的API函数如下:  

  文件及Section操作类API(实现文件操作、内存映射等功能的实现),具体如下:

  ntdll.dll->NtCreateFile

  ntdll.dll->NtOpenFile

  ntdll.dll->NtReadFile

  ntdll.dll->NtClose

  ntdll.dll->NtCreateSection

  ntdll.dll->NtMapViewOfSection

  ntdll.dll->NtUnmapViewOfSection

 信息查询类API(模拟 模拟句柄 及 文件、Section等内核对象的模拟仿真,欺骗R3程序及系统函数),具体如下:

  ntdll.dll->NtQuerySection

  ntdll.dll->NtQueryAttributesFile

  ntdll.dll->NtQueryInformationFile

  ntdll.dll->NtQueryVolumeInformationFile

  ntdll.dll->NtQueryDirectoryFile

  ntdll.dll->NtQueryVirtualMemory

  ntdll.dll->NtQueryObject


2、结合上述的API函数简单讲解下DLL加载实现(描述的过于简单请见谅):

a)  当调用LoadLibrary时首先打开文件并将按照PE文件格式解析数据,并以IMAGE方式将PE各段内容

逐块映射到内存中,如果需要并修复重定位:

kernel32!LoadlibraryA

   ->kernel32!LoadLibraryExA

       ->kernel32!LoadLibraryExW

           ->ntdll!LdrLoadDll

               ->ntdll!LdrpLoadDll

                   ->ntdll!LdrpMapDll

                       ->ntdll!LdrpCreateDllSection

                             ->ntdll!NtOpenFile  //打开目标文件*

                             ->ntdll!NtCreateSection   //创建映射*

                     ->ntdll!NtMapViewOfSection   //映射*

                     ->LdrRelocateImageWithBias  //修复重定位


b) 接着处理调入表等,然后调用TLS回调函数和DLLMAN入口函数;

kernel32!LoadlibraryA

  ->kernel32!LoadLibraryExA

      ->kernel32!LoadLibraryExW

           ->ntdll!LdrLoadDll

               ->ntdll!LdrpLoadDll


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

最后于 2019-6-27 09:20 被拍拖编辑 ,原因:
上传的附件:
收藏
免费 11
支持
分享
最新回复 (8)
雪    币: 9934
活跃值: (2554)
能力值: ( LV6,RANK:87 )
在线值:
发帖
回帖
粉丝
2
突然发现点赞功能不见了
2019-6-26 18:51
0
雪    币: 47147
活跃值: (20450)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
3
Lixinist 突然发现点赞功能不见了
优化代码中
2019-6-28 11:39
0
雪    币: 1810
活跃值: (4025)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
不错,楼主分析的好
2019-6-29 14:29
0
雪    币: 83
活跃值: (1087)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
5
太刺激了  自己hook自己的相关文件操作api 实现虚拟文件的功能 这骚操作
2019-7-1 14:01
0
雪    币: 148
活跃值: (140)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
收藏学习了
2020-1-30 18:48
0
雪    币: 3879
活跃值: (3673)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
学到很多   
2021-8-21 12:03
0
雪    币: 6296
活跃值: (4962)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
8
“一点就是虚拟文件句柄的范围不能和有效的文件句柄相互冲突,以免引起问题。”
那么请问,怎么获取当前分配了哪些文件句柄?
2022-2-6 15:42
0
雪    币: 576
活跃值: (2035)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
mark 
2022-2-6 19:44
0
游客
登录 | 注册 方可回帖
返回
//