zoukankan      html  css  js  c++  java
  • 逆向脱壳——脱壳后的修复

    脱壳后的修复

    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,获取输入表。

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

  • 相关阅读:
    jQuery 中 children() 与 find() 用法的区别
    JSON.parse()和JSON.stringify() 的用法区别
    Cookie 与Session 的区别(转载)
    Ajax的post方法,模拟 从后台读取数据小demo
    Tab切换栏
    C# Linq to Entity 多条件 OR查询
    C# 执行DOS命令和批处理
    C# 将DataTable数据源转换成实体类
    MYSQL 企业常用架构与调优经验分享
    C# 虚方法virtual详解
  • 原文地址:https://www.cnblogs.com/5315hejialei/p/7060315.html
Copyright © 2011-2022 走看看