第十六章 脱壳技术
16.1 基础知识
壳的加载过程:保存入口参数、获取壳本身需要使用的API地址、解密原程序各个区块的数据、IAT的初始化、重定位项的处理、HOOK API、跳转到程序原入口点
手动脱壳步骤:查找真正的入口点、抓取内存映像文件、重建PE文件(修复OEP、IAT的RVA和Size)
16.2 寻找OEP
根据跨段指令寻找OEP(单步跟踪)
用内存访问断点寻找OEP(两次断点)
根据栈平衡原理寻找OEP(ESP定律)
根据编译语言特点寻找OEP(常见函数入口代码特征)
16.3 抓取内存映像
使用OllyDump插件
反Dump技术:纠正SizeOfImage、修改内存属性
16.4 重建输入表
确定IAT的地址和大小
用ImportREC重建输入表
16.5 DLL文件脱壳
16.6 附加数据
在某些特殊的 PE 文件中,在各个区块的正式数据之后还有一些数据,这些数据不属于任何区块。因为PE文件被映射到内存中时是按区块映射的,所以这些数据是不能被映射到内存中的。这些额外的数据称为附加数据(overlay)。以认为附加数据的起点是最后一个区块的末尾,终点是文件的末尾。
16.7 PE文件的优化
优化输入表存放位置、资源的重建、装配文件、修正PE文件头
16.8 压缩壳
UPX:注意UPXPR、UPX-Scrambler软件的保护
16.9 加密壳
ASProtect已经有脱壳机了
“stolen bytes”是指外壳将程序的部分代码变形并搬到外壳段中
16.10 静态脱壳