【文章标题】: 仿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
被拍拖编辑
,原因: