-
-
[原创]恶意代码分析实战Lab03-03(PE映像切换技术)
-
发表于:
2021-9-29 20:12
13785
-
[原创]恶意代码分析实战Lab03-03(PE映像切换技术)
这个样本比较有意思,利用了pe映像切换技术,《逆向工程核心原理》有类似例子,最近也是上课看书,偶然看到这部分,写个文章巩固下知识点。
我们首先来康康什么是pe映像。
我们都知道创建一个进程时,操作系统会为该进程分配一个 4GB 大小的虚拟 进程地址空间。pe映像就是pe文件在进程内存中的映射形态。

并且pe文件和pe映像在形态上也不会是完全相同的,会有一些差别,如下。

那么什么是pe映像切换呢,简单来说,假设现在有A,B,setup三个exe文件,我们会使用setup.exe来创建A进程,按道理本该执行A进程,但是却使用pe映像切换技术来达到运行B进程的目的。
下面来大概总结其步骤,是setup.exe的代码步骤。
- 将B.exe这个文件存放到开辟的某个内存空间,利用createfile,VirtualAlloc函数,或者其他类似作用的函数。
- 以挂起模式创建A进程。
- 利用GetThreadContext函数获得A进程的主线程的上下文结构,得到CONTEXT.Eax,ReadProcessMemory函数读取PEB.image,也就是A进程的image base和EP。
- 调用NtUnmapViewOfSection函数卸载A进程的pe映像,防止将B.exe文件映射到该地址时发生冲突(实际上,若image base不相同,可以不卸载)。
- 利用VirtualAllocEx函数在A进程中以B进程的image base地址申请其size of image大小的空间。
- 映射pe文件头
- for循环映射pe节区
- 调用WriteProcessMemory将A进程的PEB.imagebase修改为B进程的image base。
- 将EP(CONTEXT.Eax)修改为B.exe的EP。
- 调用ResumeThread,恢复运行A进程,但是实际上运行的是B进程。
在看完本lab和《逆向工程核心原理》中的例子后,产生了两个问题
- 上面的步骤中,修改image base这一操作的先后顺序是否有影响呢?我认为是没有影响的,因为无论哪种方式,都可以达到在A进程中为B进程的PE映像分配了内存空间,并且将A进程的PEB.imagebase修改为B进程的image base的目的。
- 为什么对于映射pe文件头,映射pe节区需要分开来?其实也很简单,答案就在上面的图片中,pe文件和pe映像在形态上不会是完全相同的。

到这里,pe映像切换的原理差不多就讲完了,感兴趣可以去看看书中的详细讲解,下面来分析恶意样本,与书中例子有小差别,但大体原理一致。
先看看行为吧,可以看到创建了一个进程,并且退出了。

[注意]看雪招聘,专注安全领域的专业人才平台!