前言: 近日分析某游戏辅助软件时,发现其使用了傀儡进程的方式,本以为是常见的傀儡进程技术实现,但在分析时并未发现其调用常规函数实现,而是使用了一些内存映射的API,所以仔细分析后发现其傀儡进程的实现技术有所不同,故学习整理。
一、 傀儡进程
傀儡进程是指将目标进程的映射文件替换为指定的映射文件,替换后的进程称之为傀儡进程。
一般来说傀儡进程的创建流程分别为以下几点:
- 以挂起的方式进行创建目标进程
- 获取目标进程的上下文,在替换完成后及时恢复,另外为了后边清空内存空间的操作,也必须要通过上下文获得进程的加载基地址。
- 傀儡进程在替换之前必须使用NtUnmapViewOfSection将目标进程的内存映射清除掉
- 利用VirtualAllocEx重新分配空间
- 将傀儡进的PE信息写入傀儡进程,在这个过程中需要完成PE文件的装载
- 恢复现场并运行傀儡进程
参考资料:傀儡进程技术实现
二、 内存映射文件
内存映射文件,是由一个文件到一块内存的映射。Win32提供了允许应用程序把文件映射到一个进程的函数
(CreateFileMapping)。内存映射文件与虚拟内存有些类似,通过内存映射文件可以保留一个地址空间的区域,同时将物理存储器提交给此区域,内存文件映射的物理存储器来自一个已经存在于磁盘上的文件,而且在对该文件进行操作之前必须首先对文件进行映射。使用内存映射文件处理存