9.7 UPX加壳

加壳是名气最大的免杀方式,各种加壳工具更是眼花缭乱,这里我们介绍其中最入门级的UPX。UPX是一款可执行程序文件压缩器。压缩过的可执行文件体积缩小50%~70%,这样减少了磁盘占用空间、网络上传下载的时间和其他分布以及存储费用。通过UPX压缩过的程序和程序库完全没有功能损失,与压缩之前一样程序可正常运行。加壳的本质是对可执行程序资源压缩。加壳过的程序可以直接运行,但是不能查看源代码,要经过去壳才可以查看源代码。

如图9-2所示,假设PE文件由代码段1、2和3组成。UPX的加壳过程可以分为两步:第一步,在PE文件的特定位置增加一段代码A;第二步,将代码段1、2和3无损压缩成代码段B,然后和代码段A一起组成新的程序。其中代码段A的主要功能是解压缩后面的代码段B。

图9-2 UPX加壳过程

UPX的去壳过程如图9-3所示,执行代码段A,A解压代码段B成为代码1、2和3,然后执行它们。

图9-3 UPX去壳过程

UPX的安装方式很灵活,Mac下可以使用命令直接安装:


brew install upx

对于习惯源码安装的读者,可以到其GitHub上下载源码编译安装:


https://github.com/upx/upx

UPX的常用参数功能列举如下:


Usage: upx [-123456789dlthVL] [-qvfk] [-o file] file..

·-1,压缩速度最快。

·-9,压缩比最大。

·-d,解压缩。

·-l,列出压缩的文件列表。

·-t,测试。

·-k,保留备份文件。

·-o file,保存到文件file。

·--force,强行压缩。

同时UPX还支持非常细粒地针对PE结构的操作,常见选项举例如下:

·--overlay=copy,覆盖预留未使用的数据区域。

·--compress-exports,是否加密导出表,1表示压缩,0表示不压缩。

·--compress-icons,对图标的操作,0表示不压缩,3表示全压缩。

·--compress-resources,是否压缩资源,1表示压缩,0表示不压缩。

·--strip-relocs,是否去除重定向表,1表示去除,0表示不去除。

我们通过调用UPX命令的方式实现UPX加壳,为了提高免杀能力,主要的几个UPX选项都随机生成,避免杀毒软件摸出规律,代码如下:


options = ['--force', '--overlay=copy']
compression_level = random.randint(1, 9)
options += ['-{}'.format(compression_level)]
options += ['--compress-exports={}'.format(random.randint(0, 1))]
options += ['--compress-icons={}'.format(random.randint(0, 3))]
options += ['--compress-resources={}'.format(random.randint(0, 1))]
options += ['--strip-relocs={}'.format(random.randint(0, 1))]