不管壳是什么,思路都是"让它自己把代码解开,然后在解完的那一刻把内存 dump 下来"。难点只在于找到那一刻(OEP)。
几种常见办法:
ESP 定律
壳在入口保存寄存器、结束时恢复。在入口记下 esp,对该地址下硬件写入/访问断点,断下来的地方离 OEP 很近。对压缩壳几乎万能。
内存访问断点
给代码段设成不可执行,第一次执行异常的地方就是解压后的代码。
特征跳转
很多壳最后是一个 jmp 到 OEP,跨度很大。扫描"跳转距离异常大的 jmp"。
API 断点回溯
在 GetProcAddress / VirtualProtect 上断,壳一定会用到它们修 IAT。
dump 下来之后还有一关:修 IAT。ImportREC 那一套仍然管用。
现在的商业壳(VMProtect、Themida 这类)已经不能这么打了——它们不"脱",代码常驻虚拟机。那是另一个话题。