PE映像切换-minilctf

记录一下反调试中的 PE 映像切换技术

有关 PE 映像切换

概念

首先先以挂起的模式运行 A.exe 进程,然后将一个完全不同的 PE 文件的映像映射到 A.exe 的内存空间,并运行。A.exe 即 “外壳进程 ”,B.exe 为 “内核进程” (相当于偷梁换柱

这一技术主要用于病毒程序的伪装,反调试

具体实现过程

0x01 把 real.exe 载入内存,并创建进程 fake.exe

​ 此时进程处于挂起状态,可以自由操控内存空间

0x02 获取 fake.exe 实际加载基地址

0x03 获取 real.exe 的基地址

​ 在 PE 文件头中获取

0x04 比较这两个基地址

1.两个基地址相同

​ 利用 ntdll 里的 ZwUnmapViewOfSection 卸载 fake.exe 的映射,分配内存空间再将 real.exe 映射到进程内存

2.两个基地址不同

​ 可直接将 real.exe 映射到 fake.exe 进程内存,再把 PEB.Imagebase 改为 real.exe 的基地址

0x05 修改EP

CONTEXT.Eax 存储 fake.exe 的 EP 地址,CONTEXT.Eip 存储 ntdll!RtlUserThreadStart 这个API的地址,通过这个API跳转到 EP 代码

miniLctf Re1

​ 在看完上面这部分内容后突然想起来之前的 miniLctf 里的 Re1 好像有涉及这方面的知识,于是就重新分析了一下

​ 可以根据最后修改 EP 时的地址找到 real.exe 导出分析

​ 导出之后的解题过程就不详细叙述了应该比较简单,关注 TLS 就行

参考资料

  • 《逆向工程核心原理》
作者

0wl

发布于

2021-07-01

更新于

2021-07-03

许可协议

评论