UPX脱壳分析

在探究upx之前我们应该知道什么是壳

在自然界中,植物用壳来保护种子,动物用壳来保护身体等。同样,在一些计算机软件里也有一段专门负责保护软件不被非法修改或反编译的程序。他们附加在原程序上通过Windows加载器载入内存后,先于原始程序的执行,得到控制权,执行过程中对原始程序进行解密和还原操作,还原后再把控制权交给原始程序,执行原来的代码部分。加上外壳后,原始程序代码在磁盘文件中一般是以加密后的形式存在的,只在执行时在内存中还原,这样就可以比较有效地防止破解者对程序文件的非法修改,同时也可防止程序被静态反编译。由于这段程序和自然界的壳在功能上有很多相同的地方,基于命名的规则,就把这样的程序称为“壳”了。
按照壳的功能特性,壳可以划分为压缩壳和加密壳,压缩壳侧重于压缩体积,加密壳侧重于加密,二者的出发点是不一样的。常见的压缩壳有upx、ASPack等,常见的加密壳有ASProtect、Armadillo等。

接下来我们需要知道什么是UPX壳

UPX(the Ultimate Packer for eXecutables)是一款先进的可执行程序文件压缩器。压缩过的可执行文件体积缩小50%-70%,这样减少了磁盘占用空间、网络上传下载的时间和其它分布以及存储费用。通过UPX压缩过的程序和程序库完全没有功能损失,和压缩之前一样可正常地运行。对于支持的大多数格式没有运行时间或内存的不利后果。
UPX支持许多不同的可执行文件格式,包含Windows 95/98/ME/NT/2000/XP/CE程序和动态链接库、DOS程序、Linux可执行文件和核心等。
UPX的官方网站为http://upx.sf.net/
UPX程序除了加壳之外,同时支持脱壳操作。

UPX加壳的原理

upx的功能有两种描述。一种叫做给程序加壳,另一种叫压缩程序。其实这两种表述都是正确的,只是从不同的
角度 对upx的描述。
upx的工作原理其实是这样的:首先将程序压缩。所谓的压缩包括两方面,一方面在程序的开头或者其他合适的
地方 插入一段代码,另一方面是将程序的其他地方做压缩。压缩也可以叫做加密,因为压缩后的程序比较难看
懂,主要是 和原来的代码有很大的不同。最大的表现也就是他的主要作用就是程序本身变小了。变小之后的程
序在传输方面有很 大的优势。其次就是在程序执行时,实时的对程序解压缩。解压缩功能是在第一步时插入的
代码完成的功能。联起来 就是:upx可以完成代码的压缩和实时解压执行。且不会影响程序的执行效率。
upx和普通的压缩,解压不同点就算在于upx是实时解压缩的。实时解压的原理可以使用一下图形表示:
1==>2==>3==>4==>5==>6
假设1是upx插入的代码,2,3,4是压缩后的代码。5,6是随便的什么东西。
程序从1开始执行。而1的功能是将2,3,4解压缩为7,8,9。
7,8,9就是2,3,4在压缩之前的形式。
连起来就是: 1==>7==>8==>9==>5==>6
最初代码的形式就应该是:7==>8==>9==>5==>6
用upx压缩之后形式为:1==>2==>3==>4==>5==>6
执行时的形式变为:1==>7==>8==>9==>5==>6

在研究去掉UPX壳之前
我们首先找到一个用UPX加壳的EXE文件,我们也可以自己使用UPX加壳

这样子我们就对这个程序完成了UPX加壳,这时候我们可以使用exeinfope观察一下

可以看到这个程序已经套上了UPX的外壳,我们可以用ida观察

可以看到程序的大部分函数都被隐藏起来了,所以程序就被保护起来了

如何去掉UPX壳

1.最简单的方法就是使用我们下载的UPX.exe直接在cmd里边使用UPX -d命令来去除

2.我们可以使用OD等动态调试工具来找到程序的真正入口来达到去掉UPX壳的目的

1.首先使用OD打开程序


2.使用单步调试法找到程序的真正入口
在调试的时候我们使用F8来进行单步步过,注意在调试的时候只能向下找

就是正常的F8调试,然后遇到向上的箭头我们在该位置使用F4下一个断点,让程序跳过这个指令向下运行

这个位置的时候要注意将断点设在call下方,因为在壳这里的call会不允许出去 需要设置断点后F4 直接过call 然后继续调试
找到popad

运行到这里 下面全是00填充 一个大跳转 UPX的壳就运行完了 。跳转后的第一个指令一般就是程序的入口。

这里基本上就是程序的真正入口了,这时候我们就可以使用OllyDump将程序下载下来就可以了


这时候程序就完成了脱壳,我们可以用exeinfope看一下

这时候就可以看到程序的UPX外壳已经没有了
同样的我们也可以使用ida来看一下

可以看到左侧的函数已经出现,这样就完成了脱壳

上一篇
下一篇