首页
论坛
专栏
课程

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

2019-6-26 18:22 1669

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

2019-6-26 18:22
1669

【文章标题】: 仿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

                   ->ntdll!LdrpMapDll

                       ->ntdll!LdrpWalkImportDescriptor  //处理导入表等

                       ->LdrpRunInitializeRoutines  //调用DLLMAN

                           ->LdrpCallTlsInitializers

                           ->LdrpCallInitRoutine

简单来看,我们好像只需要处理NtOpenFile、NtCreateSection、NtMapViewOfSection这三个函数就可以

完成整个过程。但是思考加载过程的原理,其中最重要的工作是将PE文件数据结构解析并映射到内存中

(整个过程很多内存加载DLL的实现代码都能够满足要求),我们需要做的就是在这三个函数API HOOK代码

中完成替代操作系统完成PE文件内存加载的过程。考虑到我们需要模拟文件句柄及资源回收处理,所以还需要

额外处理如下函数:NtClose、NtUnmapViewOfSection。


2、相关API HOOK在DLL加载情况下的参数及功能分析:

a) NtOpenFile函数分析:

NTSTATUS NTAPI NtOpenFile(OUT PHANDLE FileHandle,

           IN ACCESS_MASK DesiredAccess,

           IN POBJECT_ATTRIBUTES ObjectAttributes,

           OUT PIO_STATUS_BLOCK IoStatusBlock,

           IN ULONG ShareAccess,

           IN ULONG OpenOptions)

HOOK该函数主要需要处理的就是检查是否是需要模拟的文件,然后直接虚拟一个文件句柄给外部。

然后在其他接收文件句柄的函数内,需要检测是否是虚拟文件句柄,并进行相关处理。此处需要注意

一点就是虚拟文件句柄的范围不能和有效的文件句柄相互冲突,以免引起问题。

b) NtCreateSection函数分析:

NTSTATUS NTAPI NtCreateSection(OUT PHANDLE SectionHandle,

                IN ACCESS_MASK DesiredAccess,

                IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,

                IN PLARGE_INTEGER MaximumSize OPTIONAL,

                IN ULONG SectionPageProtection OPTIONAL,

                IN ULONG AllocationAttributes,

                IN HANDLE FileHandle OPTIONAL)

HOOK该函数主要需要处理的就是如果调用该函数的参数中FileHandle 是虚拟文件句柄则需要特殊处理,

以FileHandle参数为NULL并将SEC_IMAGE标志去除方式调用原始的NtCreateSection函数,创建Section对象,

然后我们手工将相关文件数据按照要求复制到创建出来的Section里,并返回创建的Section对象句柄给外面。

此处需要注意(AllocationAttributes & SEC_IMAGE)非0则表示是创建PE文件的Section对象,如果为0则是

数据文件映射方式;同时要注意复制文件到Section里时要调用原始的NtMapViewOfSection函数进行映射,

并注意读写属性。

c) NtMapViewOfSection函数分析:

NTSTATUS NTAPI NtMapViewOfSection(IN HANDLE SectionHandle,

                   IN HANDLE ProcessHandle,

                   IN OUT PVOID* BaseAddress,

                   IN ULONG_PTR ZeroBits,

                   IN SIZE_T CommitSize,

                   IN OUT PLARGE_INTEGER SectionOffset OPTIONAL,

                   IN OUT PSIZE_T ViewSize,

                   IN SECTION_INHERIT InheritDisposition,

                   IN ULONG AllocationType,

                   IN ULONG Protect)

HOOK该函数主要需要处理的就是如果调用该函数的参数中SectionHandle是虚拟Section句柄则需要特殊处理,

同时如果不是SEC_IMAGE 格式则直接调用原始的NtMapViewOfSection映射数据即可。如果是 SEC_IMAGE 

格式则需要我们参照内存加载DLL的代码进行重定位表修复、导入表处理等。此处需要注意保护属性的设置,

同时不需要调用DLLMAN函数,后续操作系统的API会调用。


【实现细节注意事项】

完成上述过程就可以基本实现DLL的虚拟加载功能,但还有些细节要特别处理。主要如下:

a) 是整个加载过程中系统函数还需要打开文件并读取“manifest”文件等。同时为了满足对

模拟文件句柄的文件读取、获取文件创建时间、文件尺寸、文件属性等需要,也一起HOOK了

如下API:NtCreateFile、NtReadFil、NtQueryInformationFile、NtQueryAttributesFile等;


b) 可执行程序内部可能会查找指定的文件,所以需要一起HOOK如下API:NtQueryDirectoryFile、

NtQueryDirectoryFileEx,用于解决FindFile功能;


c) 之所以HOOK了NtQueryVirtualMemory函数的原因,我记得是VC编译的DLL里在加了“映像具有

安全异常处理函数/SAFESEH”时,VC运行时库的异常处理函数内部会调用NtQueryVirtualMemory

检测异常处理函数所在内存页是否有IMAGE标记,如果没有则会导致内部的异常处理函数无效

(该问题在VMPROTECT3.0版本中存在该BUG,后来逆向分析了异常处理函数才发现该检测)。


参考:https://bbs.pediy.com/thread-185786.htm  原创]线程初始化过程 PK 加载DLL过程(详细)

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

【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!

                           2019年06月26日



[公告]安全服务和外包项目请将项目需求发到看雪企服平台:https://qifu.kanxue.com

最后于 2019-6-27 09:20 被拍拖编辑 ,原因:
上传的附件:
最新回复 (4)
Lixinist 1 2019-6-26 18:51
2
0
突然发现点赞功能不见了
kanxue 8 2019-6-28 11:39
3
0
Lixinist 突然发现点赞功能不见了
优化代码中
小希希 2019-6-29 14:29
4
0
不错,楼主分析的好
killpy 2 2019-7-1 14:01
5
0
太刺激了  自己hook自己的相关文件操作api 实现虚拟文件的功能 这骚操作
游客
登录 | 注册 方可回帖
返回