脱壳步骤,修复IAT的原因及修复IAT的完整步骤

回复 星标
更多

脱壳步骤,修复IAT的原因及修复IAT的完整步骤

我们已经知道如何定位到OEP了,下一步就是如何脱壳并修复啦。脱壳的步骤是简单的,固定的,而之后如何修复才是我们面临的真正挑战。本问将展示脱壳和修复的完整过程。

调试器:OllyDbg

环境:XP SP3 虚拟机

(一)如何使用LordPE脱壳

首先,修复和脱壳最好都在XP系统的虚拟机里进行。

如何使用LordPE脱壳呢?首先得找到OEP,先让EIP位于OEP。首先用ESP定律定位到OEP。

510582

看上去一点都不像OEP是吧,但是这确实是,之所以会显示字节码,是因为OD误将真正的程序代码分析成数据了。所以显示成一个一个单独的数据

我们只要删除模块分析,就能得到正确的代码,如下图所示。

510582

打开LordPE,打开我们选中目标进程,右键-修正镜像大小,接着右键,点击完整转存(完全脱壳),就脱壳完毕了。

510582

(二)修复IAT的原因

但是这就结束了么?并没有。当我们再次打开它时,它弹出了错误并且退出。显然它无法直接运行。

510582

转存后的程序是无法直接运行的,载入后,到达OEP之前的异常。如图所示。

510582

载入dump后的程序然后F9运行,在执行到 OEP之前就产生了异常。

当异常发生后,手动定位到OEP,看看IAT是否已经填充完毕。下图中有一行

call 00401506我们就来到401506.如图所示

510582

看得出来,的确是能指向函数本身的。但是我们在数据窗口跟随一下函数首地址,右键,此时已经没有“ 查看可执行文件 ”这个选项了。

510582

换言之没法查看文件偏移了。此时再用winhex定位到上次的文件偏移。很奇怪它指向的已经不是之前那个数了。

我们再看看字符串还在不在。如果手动定位到原来储存字符的地方(详情阅读上一篇文章),也不在了。因为原来的程序在获取完IAT后就把字符删掉了,文件偏移里的字符串指针没有了,就没法自动获取地址了。所以必须脱壳之后必须把IAT修复好 。

(三)手动修复IAT

开始修复IAT。

第一步还是先找到OEP,到达OEP后,OD和进程本身不能关掉。脱壳过程中不能把程序关掉。

操作过程和之前相同,先选进程,右键,完整转存,脱壳完毕。

双击脱壳后的程序,无法打开。

第二步:使用importrec修复IAT。不是选择dump后的程序,而是到达OEP的加壳程序。为什么不选择脱壳后的程序呢?

因为我们需要提取源文件里的信息,放到脱壳后的文件里。然后放到脱壳后的程序 附件进程后,里面有个选项

如何使用填写这几个数字呢:

第一个选项是OEP栏:这里填写OEP的相对偏移地址就行

第二个选项是RVA:虚拟内存地址,这里填IAT的起始位置

大小:填写导入表大小,需要用IAT的末地址减去首地址。哪个是首地址,哪个是尾部地址?

有一个小技巧,能帮我们快速定位到IAT的开始和末尾。怎么做呢,在数据窗口右击-长型-地址,那么它的起始位置

就非常直观了;如图所示。所以得到

510582

OEP:10000

RVA:3184

大小:尾部一定得是00000000才行。而且得是最后一个00000000。

点击获取导入表(get import),出现了如图所示的界面。

510582

点击修正转存(fix dump),软件让选择一个程序,我们选脱完壳后的程序,之后会生产一个被修复后的程序。至此IAT修复完成。

注意:如果该程序打不开,就用PETools载入这个文件,选择PE重建,如图所示

510582

也就是说经历了三个步骤:修复IAT,转存到脱壳后文件,修复PE头。

以上步骤是修复IAT的基本步骤。但这仅仅是最基本的步骤,如果都这么简单,脱壳就没什么意思了。

510582

本文由看雪论坛amzilun原创

转载请注明来自看雪社区

往期热门阅读:

  • 看雪学院招募看雪讲师

  • 某壳分析+修复

  • 安卓逆向菜鸟的初体验

  • unity3d手游破解(三)--基于inline hook

  • 基于Wrk和ReactOS源码分析APC机制的记录

扫描二维码关注我们,更多干货等你来拿!

此帖已被锁定,无法回复
新窗口打开 关闭