首页 > 其他 > 详细

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

时间:2019-12-28 14:09:38      阅读:112      评论:0      收藏:0      [点我收藏+]

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

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

逆向过程:

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

2、F9第一次为如下图,那么里OEP也不远了,然后尝试对代码段进行内存访问断点
技术分享图片

技术分享图片

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是正确的,所以可以进行修复成功!

技术分享图片

技术分享图片

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

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!