逆向脱壳——脱壳后的修复

脱壳后的修复

IAT修复

IAT

导入地址表(IAT):Import Address Table 由于导入函数就是被程序调用但其执行代码又不在程序中的函数,这些函数的代码位于一个或者多个DLL 中.当PE 文件被装入内存的时候,Windows 装载器才将DLL 装入,并将调用导入函数的指令和函数实际所处的地址联系起来(动态连接),这操作就需要导入表完成.

为什么要手动修复IAT?

我们已经掌握了如何寻找OEP和脱壳,有的时候,Dump出来的时候不能正常运行,是因为还有一个输入表没有进行处理,这时候,我们可以尝试手动修复IAT。

原理

程序的IAT是连续的排列的,所以我们只需要找到IAT的起始位置和末位置,就可以确定IAT的地址和大小。在压缩壳中,我们只要找一个调用系统的API的Call的地址,然后在数据窗口中查找,确定IAT起始和结束地址。然后在OD中手动修复。

思路

  • 1.查壳
  • 2.找到程序入口
  • 3.OD插件脱壳-->失败
  • 4.LoadPE脱壳-->失败
  • 5.用ImportREC自动修复-->失败
  • 6.手动查找IAT,用ImportREC进行修复-->成功

实验过程

  • 查壳,显示FSG壳

  • 我们用ESP定律法脱壳,关键跳转后,没有到OPE,右键分析,从模块中删除分析。

  • 到达OPE

  • 用OD的脱壳插件脱壳,这个插件是可以自动修复ITA的,如图勾择重建输入表。

  • 用OD自带的插件脱壳以后,查壳显示无壳,但不能运行。

  • 换一种方法脱壳试试~用LoadPE脱壳

  • 修正镜像大小

  • 还是不能运行

  • 用ImportREC进行输入表重建,尝试修复程序,输入刚刚调试时找到的OPE地址,点击自动查找IAT

  • 点击获取输入表,工具自动帮你填充RVA,这里的RVA是IAT起始的偏移量。RAV是偏移地址的意思,如果说Windows装载器将一个PE文件装入 00400000h处的内存中,而某个节中的某个数据被装入0040xxxxh处,那么这个数据的RVA就是(0040xxxxh- 00400000h)=xxxxh。

- 转储到文件,尝试运行,壳已经没有了,但是还是不行,不能运行……

- 那我们只有试一下手动修复了

  • 随便找一个调用系统的API的Call,如果这个函数的调用地址在IAT中,那么我们根据这个地址就能找到IAT的地址范围。

- 在输入表(IAT)中找到该地址

  • 记录地址0x425210,在命令下输入 d 425210

  • 到达数据窗口的这一段,这是IAT地址,名称与输入表重建工具中的函数对比,内容一致,可以确定这个CALL的调用函数地址在IAT中。

  • 因为IAT段是连续的,因此向上找到开头,向下找到结尾

  • IAT段开始:

  • IAT段结束

- 获取IAT信息
起始:00425000
结束:00425510
RAV:0x00425000-0x00400000=0x25000
Size:0x0042410-0x00425000=0x510

- 进行修复,输入IAT信息,RVA和SIZE,获取输入表。

- 转存,运行成功~脱壳完成~

posted @ 2017-06-21 16:38  君知らない  阅读(10854)  评论(1编辑  收藏  举报