对于研究逆向技术的同学来说,壳应该是再熟悉不过了,当然很多人还是停留在熟悉的边缘,其实危险漫步觉得脱压缩壳和简单的加密壳是一样的,只要载人OD一步一步走,避开所有陷阱,到达0EP,还有DUMP再修复就可以了。但是更高一个层次的加密壳会对IAT进行加密,就算我们到达了OEP,DUMP之后还是不能修复,这次我以PECompact 2.x->Jeremy Collake为例来讲解如何寻找加密IAT的地方以及如何应对。
我们先按照常规的脱壳步骤进行操作,先来到OEP再说,由于这个过程比较简单,我就不详细讲解了。
然后是DUMP,再然后就是拿出importREC进行修复,发现有很多无效,很多新手朋友看到这副情景都很无奈,下面我就教大家如何处理加了密的IAT。
首先我们要保存好无效的IAT的信息,记下第一个无效的IAT的RVA地址,我们可以知道物理地址是0046612CC00400000+0006612c),然后就是载人程序,在下方ttjcommand处输入“d 46612e”,再对46612c到46612f下dword的硬件写入断点,然后多次按F9,来到最后一次断下的地方,这是最后一次写入的地方,我们可以看到指令把eax的值传给了0046612C这个地址,我们来看看eax的值是多少,是009DOOOO,是不是很熟悉呢,我们还是看看上面的,第一个被加密的IAT的值是多少,也是009DOOOO,现在对IAT的处理大家应该可以猜出来了吧:当程序需要执行第-rIAT的函数时,会去009DOOOO的地址执行某一段程序,这段程序可能直接或者间接的调用IAT,对这段程序我们就不去深究了。我们这么想,修复IAT时找到的009DOOOO是EAX传到这里的,那如果此时EAX指向正确的IAT,不是就可以解除对IAT的加密了吗?所以接下来我们耍格外关注EAX,往上看。
这里把EAX压栈,然后就是一个CALL,我们在PushEAX这条语句上下断,然后载入程序重新运行,断下来了,大家看到了什么,EAX果然指向的是IAT函数,接下来我们只要进入这Al CALL(直接NOP会出错的),从下往上看(因为我们要找最后一次对EAX的修改),很快我们就锁定了下面这条语句:003F04E18BCmov eaxedi。我们单步走到这条语句后,证实了我的想法,EDI的值是009DOOOO,现在把这条语句给NOP掉,发现EAX把正确的IAT的地址传了过去,好的,现在我们来到OEP,进行修复,哈哈,发现成功的修复了。
这个方法不知道别人介绍过没有,是我自己想出来的,起初是有人在博客上发了这个程序的脱壳方式,但是没有说如何找加密IAT,所以我就自己就琢磨了出来,希望大家多动脑多动手,写出自己原创的东西。
本文内容所提及均为本地测试或经过目标授权同意,旨在提供教育和研究信息,内容已去除关键敏感信息和代码,以防止被恶意利用。文章内提及的漏洞均已修复,作者不鼓励或支持任何形式的非法破解行为。