操作系统环境:Windows 7
目标程序:一大堆压缩壳保护的程序
目标程序总大小:494KB
工具:Dintal-OD、PEID、ImportREC
前言
软件的壳子分为压缩壳和加密壳,这次我们一起来探讨下压缩壳,单看名字大家应该会知道压缩壳用来干嘛的吧?没错,压缩壳就是用来压缩软件用的,因此它侧重的是把软件的体积降到最低而不是对软件的保护。首先危险漫步来给大家科普一下吧,问个问题,被压缩壳加壳的软件如果被脱掉了壳子,那体积会增加还是下降呢?有些童孩可能会想,既然壳子是“加”上去的,那应该是脱了后就会没了壳子,那自然体积应该减少。如果你这样想那真无语了,或者说你这句话说得用错地方了,如果你加的是加密壳那可能脱壳后体积就会就会减少(只是可能不是一定),但如果加的是压缩壳,那脱掉壳子后体积必定是增加的。那么加了压缩壳的软件运行过程又是怎样的呢?和其他壳子一样,在执行到OEP之前是在壳的代码段上执行的,当壳段的代码执行完毕后就会跳到原程序的OEP继续执行,当在OEP的时候整个程序就已经解压缩了,这时候Dump出来的文件是可以正常在本机运行的,所有资源也是可见的状态。为什么说是在本机运行?因为IAT还没修复,程序只适合在本地运行,有时还会运行不了。所以说即使脱壳后可以正常运行也应该修复一下IAT,这样才是可以在所有电脑运行的脱壳程序。我为大家准备了一大堆用压缩壳处理的记事本,希望大家多点练习。
下面我们来正式开始调试压缩壳,第一个我们选的是“MEW 11 SE vl.l”压缩壳保护的exe,先来用PEID查一下壳,前面的“MEW 11 SE-v1.2”是壳的名字与版本,后面的“Northfox[HCC - additional”是提供这个壳子特征码的人或者组织的名字,很多时候提供者往往会给出自己的脱壳方法,大家在搜索壳的脱壳方法时可以尝试搜索这些名字。接着我们用OD载入程序,入口点是一个jmp跳转的命令,如果对这种壳熟悉的人可能一看就看得出是什么壳。
我们可以发现下面的数据窗口是空的,也就是说是完全没有数据的,虽然不是每个压缩壳都是这样,但是这个就比较特例了,数据还在压缩状态所以是空的很正常。在没解压前数据都是被压缩的。我们来单步走吧,下面是我的分析:
这里解析一下为什么到达一些跳转需要在他的下一个命令点击鼠标左键并且按下”F4”吧,首先这样说吧,F4这个按键的效果是“执行到这里”,也就是说这个过程是由程序自动给你执行完毕的,或者说这个跳转并没有被打断,而是被快速地执行完了,直到这个跳转不再跳才会执行到我们的目的地址。为什么我要特别说这个呢,因为在网上看到很多人做教程的时候都是说用F4去打断跳转,这样说会误导很多人,当然,如果你对我说的话还有疑问的,可以试着自己不断地按F8,你会发现当跳转跳到一定次数的时侯就会不跳了,而你这个过程就相当于我们按了”F4”。在这里我直接用”F4”明显是比较方便的,希望大家记得是执行完毕而并不是被打断吧。当以上代码被执行完了,整个程序也就被解压了,我们就会到达壳段的尽头,也就是返回OEP的时候,这里是通过retn来返回的,返回到的地址0100739D也就是程序的真正入口OEP。为了验证一下程序是不是被解压了,我们来查找一下字符串吧。
可以见到很正常地查到了所有的字符串,既然数据已经是解压完了,那现在就是脱壳的时候了。
用OD的脱壳插件来脱就可以了,复制一下OEP的修正地址,等下修复IAT时候可以用。转存出来的东西是可以正常运行的,但是到其他机子上就有可能出错,因此我们必须修复IAT,我们用ImportREC来修复,修复好后就可以正常运行的了,发到其他机子也是正常的,这时再查查壳就知道程序的语言是什么了。
以上使用的是单步法,下次将会教大家其他方法,敬请期待。
后记
单步法是最基础的方法,但在很多高难度的壳子里也需要用到这种方法十你的经验,熟练掌握这种方法对以后一定有帮助。