打开OD之后是这样的:
为什么说第一个call是初始化函数地址呢?原因是进去之后是这样的:
jmp之后:
先解释一下第一个注释:怎么查看位于第几个区段?点击M
第二个注释,进入call里面看一看:(IAT加密的特征:以四个0结尾)
那么现在就去找加密的地方,在messagebox之后只有一个call,随后就jmp了,因此怀疑这个call里面进行了加密,进去:
找到IAT表的位置(FF 15):
发现真的有个XOR,由此猜测这里是真正加密的地方,接下来的函数是申请堆空间,所以猜测这里是一个解密的地方,然后这里是一个被包含在循环获取函数名并得到导入表的函数。
看眼call之前的eax:
call之后就变了:
由此怀疑:
GetProcAddress实在还原IAT的地址(偏移+基址),一开始只有偏移,在call里面加上了基址,仔细跟一下不难发现,有一个ADD EAX,EDX的操作,怀疑就是这里实现了地址的还原:
EDX显然是基址:
ADD完毕获取到正确的地址:
现在要做的就是把加密的地方给nop掉,这里注意,这个函数它四个参数入栈,在call完毕之后会自动pop出来,所以如果要nop掉参数的话就要把函数call的VirtualAlloc一起给nop掉,具体情况看下面:
填充IAT的标志:
第一个解法:除了一个给edx传值的操作不能nop,剩下的全nop掉,理由:edx是基址,上面有更改过edx的值:
现在先打个补丁,看看能不能dump成功
IAT表已经出来了:
就可以dump了!