逆向ESP脱壳到IAT表绕过重定位

前言:这两天学习了对于IAT IID 重定向的概念,但是还是有点模糊,操作先记下来,以后慢慢搞懂,下面就讲下自己对它的理解,学好了PE也总算知道了导入表 导出表的概念,自己都有记录在PE中

练手过程

练手程序: UnPackMe_YodasCrypter1.3.e.exe

逆向过程:

1、 首先载入OD,界面为如下,并且红标处有pushad,尝试进行ESP定律脱壳,进行硬件断点

2、F9第一次来到popad的后面,如下图,那么里OEP也不远了,然后尝试对代码code段进行内存访问断点

3、然后继续F9,发现到了OEP处,那么此时脱壳的工作已经完成了

OEP为 004271B0 . 55 PUSH EBP

4、进行转储存储,这里自己使用的pe tools,打开发现错误,那么还需要进行相应的IAT修复

5、重新载入转储的程序,发现OEP无法到达,直接报错,跟随到OEP 004271B0,查看IAT表是否正确,我们知道正常的IAT表其中存放着各个函数的地址,而经过重定向的IAT表,其中并不是存放着地址,而是一个指针,这个指针,指向壳的某个内存空间中,然后在壳中代码片段将地址返回回去

如如下的图,经过重定向之后,IAT表地址中保存的就不是API函数地址了,而是被覆盖了重定向后的地址

5、所以我们处理这些被加密IAT的地址的办法是找到加密这些IAT的地址的跳转(就是Magic Jump),将它修改为强制跳转(JMP),使之无法加密IAT,从而达到脱壳修复的目的!

我们需要知道IAT表的起始地址和结束地址,在原来脱壳完之后进行寻找

起始地址->00460818 值->0014329A

结束地址->00460F28 值->00000000

差值为:710

6、然后重新载入一个有壳的程序,我们需要给它的IAT表的地址进行定位,数据窗口查找表达式460818,然后在460818到460F28设置内存写入断点,原因是一开始我们加载进入还是有壳的情况下,都是被加密过的,如果当程序运行起来的时候,iat表的地址就会被覆盖成重定向后的地址,那就会写入,所以这里设置内存写入断点,设置完了之后F9运行程序,如下图,来到了第一个要被修改的api地址

00465730 8902 MOV DWORD PTR DS:[EDX],EAX ; WINMM.PlaySoundA

7、继续F8走到如下图中,红标处就是IAT表中的地址被重新修改为重定向的地址,所以我们需要进行NOP,让下面的跳转进行跳过,使其不进行重定向

8、然后进行F9运行程序,发现程序直接中断,但是还是可以获取当前程序的IAT表,此时的IAT是正确的,所以可以进行修复成功!

还是有疑问的,用OD的脱壳工具来进行dump发现文件并没有损坏,但是pe tools来保存的时候发现文件就损坏了所以需要去修复IAT表,不太明白!

原文地址:https://www.cnblogs.com/zpchcbd/p/12111435.html