PE映像切换-minilctf
有关 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 就行
参考资料
- 《逆向工程核心原理》
PE映像切换-minilctf