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

脱壳后的修复

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壳
    逆向脱壳——脱壳后的修复_第1张图片

  • 我们用ESP定律法脱壳,关键跳转后,没有到OPE,右键分析,从模块中删除分析。
    逆向脱壳——脱壳后的修复_第2张图片

  • 到达OPE
    逆向脱壳——脱壳后的修复_第3张图片

  • 用OD的脱壳插件脱壳,这个插件是可以自动修复ITA的,如图勾择重建输入表。
    逆向脱壳——脱壳后的修复_第4张图片

  • 用OD自带的插件脱壳以后,查壳显示无壳,但不能运行。
    逆向脱壳——脱壳后的修复_第5张图片

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

  • 修正镜像大小
    逆向脱壳——脱壳后的修复_第6张图片

  • 还是不能运行

  • 用ImportREC进行输入表重建,尝试修复程序,输入刚刚调试时找到的OPE地址,点击自动查找IAT
    逆向脱壳——脱壳后的修复_第7张图片

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

- 转储到文件,尝试运行,壳已经没有了,但是还是不行,不能运行……
逆向脱壳——脱壳后的修复_第9张图片

逆向脱壳——脱壳后的修复_第10张图片

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

  • 随便找一个调用系统的API的Call,如果这个函数的调用地址在IAT中,那么我们根据这个地址就能找到IAT的地址范围。
    逆向脱壳——脱壳后的修复_第11张图片

- 在输入表(IAT)中找到该地址
逆向脱壳——脱壳后的修复_第12张图片

  • 记录地址0x425210,在命令下输入 d 425210
  • 到达数据窗口的这一段,这是IAT地址,名称与输入表重建工具中的函数对比,内容一致,可以确定这个CALL的调用函数地址在IAT中。
    逆向脱壳——脱壳后的修复_第13张图片

  • 因为IAT段是连续的,因此向上找到开头,向下找到结尾
  • IAT段开始:
    逆向脱壳——脱壳后的修复_第14张图片

  • IAT段结束
    逆向脱壳——脱壳后的修复_第15张图片

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

- 进行修复,输入IAT信息,RVA和SIZE,获取输入表。
逆向脱壳——脱壳后的修复_第16张图片

- 转存,运行成功~脱壳完成~
逆向脱壳——脱壳后的修复_第17张图片

你可能感兴趣的:(逆向脱壳——脱壳后的修复)