菜鸟脱壳之脱壳的基础知识(五)——利用内存断点寻找OEP
经过第一节的基础知识,我们都知道了,加壳程序首先解把原来压缩的代码解压,然后放到所对应的区块中,当外壳程序执行完毕后,跳回到OEP执行,我们都知道,OEP是放在代码段中,也就是当外壳程序处理完毕后,跳回到代码段来执行,那我们是不是可以利用壳的这个特点来进行脱壳呢?答案是肯定的,是可以的!有的时候紧紧在代码段下断是不够的,那怎么办呢?其实很简单,用两次内存断点就可以了,一般的壳会一堆对.text、.rdata、.data、rsrc区块进行解压,根据这个原理,我们可以在适当的时候,对其他的几个区段下断点,然后再在.text段下断点,来找到程序的OEP,进而进行脱壳!
我是用Delphi7.0的加了Aspack2.28的壳,测试能运行后,我们按“ALT + M”打开内存镜像,对代码段进行下断,我们可以用F2来下断点,也可以下内存访问中断(有的强壳会检测F2断点,所以我们可以用这个方法来对区段下断!)这个断点是一次性断点,当被下断点的区块被读取或者执行时就会中断,中断发生以后,断点就会被自动删除了!
对CODE(我用的是Delphi7.0加的壳,所以是为Code段)段下断以后,F9运行,我们停到了004608BB这里:
此时,代码开始解压了,我们对00401000段下F2断点,也就是PE文件头,下断点,F9运行,断在了开始解压PE文件头的地方:
我们向下面拉,会发现一个很熟悉的代码:
00460425 这里是一个跨区段的转移,很明显是跳向OEP的,我们在这个retn这里下F2断点,F9运行,断下后,取消断点,F8单步步过下,发现果真到达了OEP了!
其实也不一定非在PE文件头那里下断,可以在.rsrc段下断后,到Code段下断,也是可以到达0046038F的,继而向下面拉,可以找到跨区段的转移,从而到达OEP!
附下载版文章:
http://www.2cto.com/uploadfile/2012/1205/20121205071514480.zip