栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

逆向脱壳实训 #2 手脱FSG及寻找IAT

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

逆向脱壳实训 #2 手脱FSG及寻找IAT

逆向脱壳实训 #2 手脱FSG及寻找IAT

文章目录
  • 逆向脱壳实训 #2 手脱FSG及寻找IAT
      • 环境 & 工具
      • 脱壳
        • 单步跟踪
          • 查壳
          • OEP寻找
          • IAT校准

之前的ASPACK和NSPACK跟UPX脱起来差不多,就没有再写文章记录

但FSG相对前三者无论是在脱壳上还是在修复上都有了不小的差别,所以记录下手脱的经验

环境 & 工具
  • win xp系统(尝试使用win10系统复现失败,浪费在调试环境上的时间比实际学习的时间还长,只能说不愧是windows)
  • 吾爱破解版ollydbg
  • exeinfope(可使用其他类似查壳工具)
  • importREC
  • LordPE
脱壳 单步跟踪

同理,高地址跳转步进,低地址跳转跳过,注意无条件跳转和长距离跳转

查壳

OEP寻找

前期一路单步至此

尝试跳过向上跳转

程序进入运行态,说明主程序已经运行,说明跟踪程序入口点跟丢了:-(

但是全程没有长距离跳转,说明程序的入口点应该在这个向上跳转的前面

那么0x4001D1处的无条件跳转有着最大的嫌疑

将断点设到0x4001D1处,直接运行至此处,随后f8跟进跳转

发现此处正是一个长距离无条件跳转,跟进后到达OEP

IAT校准

IAT(import Address Table)即导入地址表,当程序需要调用系统dll(动态链接库)中的函数时(如CreateProcess等API),直接调用内存中的函数指针表IAT特定项,而函数指针表中保存的正是对应函数的入口地址。

之所以需要进行如此转折而非直接在程序之中保存函数入口地址,是因为如果装载在内存中的dll位置一旦发生变化*(既然都叫dynamic link library了,动态一点也很正常吧 [doge])*,需要更改所有程序的对应函数入口跳转地址。而使用跳转后,当dll位置发生变化时,操作系统根据所指数据段中的字符串把表中的指针转换成函数新入口地址即可,极大的增加了dll的复用性及使用效率

所以先看看importREC中自动获取的IAT大致位置

在尝试使用自动获取的IAT地址修复程序后,发现该完整转存的镜像文件无法正常运行,所以只好手动找IAT的RVA(Relative Virtual Addresses)

已知IAT的整体位置大概在0x250XX的位置,且当程序在使用表中函数时会直接call IAT某地址,所以先在程序中找到一个形式如call 0x250xx的语句

在命令行中输入d 425210,然后就可以在数据窗口看见地址0x4025210的内容

将数据窗口一直向上滚动直到出现空内容,空内容下方的第一项的地址即为RVA

再一直向下滚动,最后一项与kernel有关的值减去RVA的值即为IAT的大小

所以该程序的RVA地址0x425000,大小0x280

把RVA和大小填入

与自动寻找的IAT对比

其实还有一个懒方法,直接把大小填成0x1000

然后点击获取导入表->显示无效的->右键->剪切指针->修正转储即可

修复后

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/691448.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号