加壳、脱壳
1.什么是加壳
所谓加壳,是一种通过一系列数学运算,将可执行程序文件或动态链接库文件的编码进行改变(目前还有一些加壳软件可以压缩、加密驱动程序),以达到缩小文件体积或加密程序编码的目的。
当被加壳的程序运行时,外壳程序先被执行,然后由这个外壳程序负责将用户原有的程序在内存中解压缩,并把控制权交还给脱壳后的真正程序。一切操作自动完成,用户不知道也无需知道壳程序是如何运行的。一般情况下,加壳程序和未加壳程序的运行结果是一样的。
如何判断一个可执行文件是否被加了壳呢?有一个简单的方法(对中文软件效果较明显)。用记事本打开一个可执行文件,如果能看到软件的提示信息则一般是未加壳的,如果完全是乱码,则多半是被加壳的。
为什么黑客能够利用加壳技术来对抗反病毒软件呢?众所周知,目前杀毒软件主要依靠特征码技术查杀病毒。由于加壳软件会对源文件进行压缩、变形,使加密前后的特征码完全不同。
脱壳能力不强的杀毒软件,对付“加壳”后病毒就需要添加两条不同的特征记录。如果黑客换一种加壳工具加壳,则对于这些杀毒软件来说又是一种新的病毒,必须添加新的特征记录才能够查杀。如果杀毒软件的脱壳能力较强,则可以先将病毒文件脱壳,再进行查杀,这样只需要一条记录就可以对这些病毒通杀,不仅减小杀毒软件对系统资源的占用,同时大大提升了其查杀病毒的能力。
2. 脱壳
马甲”能穿也能脱。相应的,有加壳也一定会有解壳(也叫脱壳)。脱壳主要有两种方法:硬脱壳和动态脱壳。
第一种,是硬脱壳,这是指找出加壳软件的加壳算法,写出逆向算法,就像压缩和解压缩一样。由于,目前很多“壳”均带有加密、变形的特点,每次加壳生成的代码都不一样。硬脱壳对此无能为力,但由于其技术门槛较低,仍然被一些杀毒软件所使用。
第二种,是动态脱壳。由于加壳的程序运行时必须还原成原始形态,即加壳程序会在运行时自行脱掉“马甲”。目前,有一种脱壳方式是抓取(Dump)内存中的镜像,再重构成标准的执行文件。相比硬脱壳方法,这种脱壳方法对自行加密、变形的壳处理效果更好。


