实现:逆向脱壳 IAT修复重定向

前言:这两天学习了对于IAT IT IID 重定向的概念,但是还是有点模糊,操作先记下来,以后慢慢搞懂,下面就讲下自己对它的理解

逆向程序:UnPackMe_YodasCrypter1.3.e.exe

逆向过程:

1、 首先载入OD,界面为如下,并且红标处有pushad,尝试进行ESP定律脱壳,进行硬件断点
实现:逆向脱壳 IAT修复重定向_第1张图片

2、F9第一次为如下图,那么里OEP也不远了,然后尝试对代码段进行内存访问断点
实现:逆向脱壳 IAT修复重定向_第2张图片

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

OEP为 004271B0 . 55 PUSH EBP

实现:逆向脱壳 IAT修复重定向_第3张图片

4、进行转储保存,这里自己使用的pe tools,打开发现错误,那么需要进行相应的IAT修复
实现:逆向脱壳 IAT修复重定向_第4张图片

实现:逆向脱壳 IAT修复重定向_第5张图片

实现:逆向脱壳 IAT修复重定向_第6张图片

5、重新载入转储的程序,发现OEP无法到达,直接报错,跟随到OEP 004271B0,查看IAT表是否正确,我们知道正常的IAT表其中存放着各个函数的地址,而经过重定向的IAT表,其中并不是存放着地址,而是一个指针,这个指针,指向壳的某个内存空间中,然后在壳中代码片段将地址返回回去, 如如下的图,经过重定向之后,IAT表地址中保存的就不是API函数地址了,而是被覆盖了重定向后的地址
实现:逆向脱壳 IAT修复重定向_第7张图片

实现:逆向脱壳 IAT修复重定向_第8张图片

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

实现:逆向脱壳 IAT修复重定向_第9张图片

7、继续F8走到如下图中,红标处就是IAT表中的地址被重新修改为重定向的地址,所以我们需要进行NOP,让下面的跳转进行跳过,使其不进行重定向
实现:逆向脱壳 IAT修复重定向_第10张图片

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

实现:逆向脱壳 IAT修复重定向_第11张图片

实现:逆向脱壳 IAT修复重定向_第12张图片

你可能感兴趣的:(实现:逆向脱壳 IAT修复重定向)