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

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

  • 相关阅读:
    volley框架使用
    Insert Interval
    candy(贪心)
    Best Time to Buy and Sell Stock
    Best Time to Buy and Sell Stock III
    distinct subsequences
    edit distance(编辑距离,两个字符串之间相似性的问题)
    trapping rain water
    word break II(单词切分)
    sudoku solver(数独)
  • 原文地址:https://www.cnblogs.com/5315hejialei/p/7060315.html
Copyright © 2011-2022 走看看