此壳基本上可以统一用最后一次异常法来解决。
我们载入程序,然后设置不忽略内存访问异常,隐藏OD,然后按照最后一次异常法的步骤来运行。到最后一次异常的时候,我们可以选择运行到retn,然后在内存中的代码段下断,然后shift+f9我们就可以来到它的OEP。无论是低版本,还是高版本的ASP壳,基本上都是用上述的最后一次异常法来解决。这里我们发现一个很经典的方法,就是,刚开始并不需要取消忽略任何异常,让它直接跑起来,跑起来以后点击Log窗口,然后查看他有多少次访问违例,我们就只需要shift+F9多少次,然后再打开内存在代码段下断即可,然后一套shift+F9,就可以完美到达OEP。(这样的话不需要我们连续按两遍,其次就是,我们发现有些程序最后一次异常定位没有用,这样的程序我们打开log查看的时候,就会发现其实它所谓的最后一次并不像前面的访问违例一样,而是单独的显示两个字:异常,然后后面跟一串数字。这个时候,我们只需要关注访问违例是有多少个,我们就在哪下手。
接下来我们继续讨论ASP壳的分析,我们发现当我们脱完壳进行修复完毕之后,有时候会出现一个很令人头疼的事情,就是当我们发现了很多无效指针的时候,我们先用等级一修复,发现修复了很大一部分,然后再将剩下的用等级三修复,发现可以完全修复,OK,DUMP下来,点击运行,发现GG,程序无法运行。嗯,好吧,算它厉害,我们可以猜测下这个壳是不是像以前我们遇到的一样,需要我们将OEP设置为它的壳的OEP呢?不管了,先试试,OD载入程序,在它的初始OEP位置修改代码为jmp到我们的OEP,然后保存,通过lordpe进行修改OEP位置,修改完毕,发现,还是无法运行。这就很头疼了,我们知道,很多加密壳都会抽取代码,然后再在程序运行的时候填回去那么,我们现在应该考虑一下这个ASP壳是不是抽取了一部分代码呢跟过去看一看,先按照前面的步骤抓到它的最后一个异常点,然后在最近的一个retn处F2,再CTRL+F9,来到这个retn。这时候我们需要关注右下角的堆栈窗口,我们可以看到有一行后面写着程序的名字,没错,就是那一行。(这时候你们应该知道为什么我说屏幕越大越好了),那一行开始往下数,第二行,然后把第二行记下来,记下来以后,我们在command输入hr+记下来的东西,回车,然后,一个潇洒的shift+F9,这时候,我们就可以单步向下走,遇到call就进去,我们发现,随着我们慢慢的往前走,会出现一些很熟悉的东西,比如说C++的开头代码:push ebp mov ebp,esp 对吧,我们得把这些代码都记下来(二进制复制),然后一步步往下走,将遇到的被抽取的代码都复制下来,直到我们retn出来,然后一直到它告诉我们的虚假OEP,然后往上拉,可以发现有一些地方,我们可以先将它nop填充,然后我们再将复制的代码二进制粘贴,粘贴完了以后我们在加上去的OEP处选择此处为新EIP,然后开始dump下来,再次进行修复。(如果我们call进去没有发现疑代码,那就说明它很有可能没有抽取代码)。好,修复完毕,优雅的点击程序,没运行。。。额,好吧,单击不行,双击才行。双击一下,哈哈哈哈,还是没运行,怎么样,惊不惊喜?意不意外?好啦,出现问题就要解决,我们来考虑下到底是什么问题呢?嗯,我们修复的时候,先等级一修复,然后等级三修复,完全修复完毕,修复完毕之后,我们发现无法运行。那么,我们试试,先等级一修复,然后不用等级三修复,用传说中importREC的外挂插件,针对这个壳ASP选择插件修复,试一试,发现也是完全修复完毕,完全修复完毕之后,我们dump下来,双击成果,发现,哇哇哇哇哇,可以运行。