“壳”是一种对程序进行加密的程序,“壳”形象地表现了这个功能。我们可以把被加壳的程序当成食物,而加壳程序就是在外面加上一层坚硬的外壳,防止别人去窃取其中的程序。加壳后的程序依然可以被直接运行。在程序运行时壳的代码先运行,然后再运行原来的程序。主要目的是为了隐藏程序的OEP(入口点),防止外部软件对程序的反汇编分析或动态分析。许多病毒通过加壳来达到免杀的目的,但壳也用在保护正版软件不被破解。技术没有对错之分,关键看使用的目的。
1. 壳的分类
(1)压缩壳
压缩壳的作用就是压缩程序的大小。压缩壳并不会对程序进行修改,而是改变了存储方式,使程序更小。运行程序时先运行壳的解压缩程序,解压源程序到内存中,然后执行。常见的压缩壳有UPX,可以将一般程序压缩到原来体积的30%。对upx_test进行压缩,原来大小为188 KB,压缩后为33 KB,只有原来的17.54%,详细信息如图1所示。
(2)加密壳
加密壳的作用是保护程序不被破解。一般情况下,加密壳加密之后的程序大小视情况而定,有些加密壳也有压缩壳的效果。加密壳会对程序进行修改,如打乱代码、混淆等。常见的加密壳有ASProtect、EXECrptor、Armadillo等。如图3所示是用ASProtect进行加密。
(3)虚拟机保护壳
虚拟机保护壳是近些年开始流行的加密保护方案,关键技术是软件实现CPU的功能。由于程序不遵循Intel的OPCode标志,所以分析起来会很麻烦。
2. 脱壳
对于不同的壳,网上有很多对应的脱壳工具。在脱壳前一般先用查壳工具,查加的是什么壳,然后找到对应的脱壳工具进行脱壳。以之前的UPX壳压缩的upx_test.exe为例,进行脱壳演示。如图5是PEiD查壳结果,通过查壳我们知道这是UPX的壳,然后用对应的脱壳工具进行脱壳。