逆向脱壳实训 #2 手脱FSG及寻找IAT
时间:2023-07-29 13:07:00
逆向脱壳训练 #2 手脱FSG及寻找IAT
文章目录
- 逆向脱壳训练 #2 手脱FSG及寻找IAT
-
-
- 环境 & 工具
- 脱壳
-
- 单步跟踪
-
- 查壳
- OEP寻找
- IAT校准
-
之前的ASPACK和NSPACK跟UPX脱下来差不多,就不再写文章记录了
但FSG与前三者相比,在脱壳和修复上都有很大的差异,所以记录下手脱的经验
环境 & 工具
- win xp系统(试用win10系统复制失败,在调试环境中浪费的时间比实际学习的时间长。只能说是值得的windows)
- 吾爱破解版ollydbg
- exeinfope(可使用其他类似的查壳工具)
- ImportREC
- LordPE
脱壳
单步跟踪
同理,高地址跳转步进,低地址跳转跳过,注意无条件跳转和长距离跳转
查壳
OEP寻找
前期一路单步到此
试着跳起来跳起来
程序进入运行态,说明主程序已经运行,说明跟踪程序入口点丢失:-(
但是全程没有长距离跳转,说明程序的入口点应该在这个向上跳前面
那么0x4001D1处无条件跳转有最大的嫌疑
将断点设到0x4001D一个地方,直接运行到这里,然后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总体位置在0左右x250XX使用表中函数时,程序的位置将直接call IAT所以在程序中找到一个地址,比如call 0x250xx的语句
输入命令行d 425210,然后在数据窗口看到地址0x4025210的内容
将数据窗口向上滚动,直到空内容出现。空内容下方的第一个地址是RVA
最后一项和最后一项一直向下滚动kernel相关值减去RVA的值即为IAT的大小
所以这个程序RVA地址0x425000,大小0x280
把RVA和大小填入
自动搜索IAT对比
其实还有一种懒惰的方法,直接把大小填成0x1000
然后点击获取导入表->显示无效的->右键->剪切指针->修正转储即可
修复后