有时候,一些强壳,仅仅定位到了iat表的位置,并且知道了大小,在importrec中也还是无法修复的,我们知道正常的iat表其中存放着各个函数的地址,而经过重定向的IAT表,其中并不是存放着地址,而是一个指针,这个指针,指向壳的某个内存空间中,然后在壳中代码片段将地址ret,这样的话,importrec就无法修复了,我们知道,正常的文件,他的iat表在未加载的时候是字符串名称,windows在加载可执行文件的时候,通过导入表将iat中的字符串填充为正确的地址。importrec则是开辟新的空间,然后作为iat表,但现在无法知道原来的函数名字叫什么,因而无法修复。手动修复的方法有几种。
一,逐个跟踪进程,通过壳中的例程retn所返回的函数入口地址确定函数名称,然后在importrec中修改,有时候壳会在retn掩饰函数名称,这时候就要分析。这种方法比较繁杂,但是也简单粗暴。
二,通过修改壳中代码,一般壳对有些dll入口地址修改,有些则不会修改,不修改的不用做任何处理,对于重定向的dll,我们需要做的就是把重定向的跳转改为何不重定向的一样,具体方法则比较复杂。首先跟踪一个重定向的iat,下内存写入断点,然后不断允行,直到运行到该iat项被修改为跳到例程的地址,这样我们就确认了壳是如何对重定向的iat项进行操作的范围假设称作a->b->c->....->z,其中应该有大量跳转和循环就比如我这里列出的a->b->c->...->z,而非重定向的dll则比较简单,它会略过其中许多步骤,直接从a->z,我们只要找到了这两个的区别,并将重定向的跳转修改为和非重定向一样为a->z即可。