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

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

文章目录


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

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

环境 & 工具

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

脱壳

单步跟踪

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

查壳

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

OEP寻找

前期一路单步至此

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

尝试跳过向上跳转

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

把RVA和大小填入

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

与自动寻找的IAT对比

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

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

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

修复后

逆向脱壳实训 #2 手脱FSG及寻找IAT
上一篇:多态


下一篇:脱壳——修复加密IAT