首页
社区
课程
招聘
[原创]剔除IAT里的垃圾数据,修复PE头,如何检验修复是否成功
发表于: 2018-5-29 20:00 7099

[原创]剔除IAT里的垃圾数据,修复PE头,如何检验修复是否成功

2018-5-29 20:00
7099

本文阐述了辨别IAT中的垃圾数据和有效数据的思路,并给出了处理垃圾数据的具体方案,以及检验IAT是否修复成功的具体操作流程。

调试器:OllyDbg
环境:XP SP3 虚拟机

一 辨别并处理垃圾数据
首先介绍一款脱壳插件:ollydump, 我们就用它来脱壳。 
  该插件包含两个文件,一个dll文件和一个文本文档, 和原来一样,我们将它复制并粘贴到PLUGIN文件夹内,重启OD后就可以生效类。文末尾为大家附加了该文件。
和以前一样,用ESP定律到达OEP。删除模块分析后,再次分析,就能将单字节码的程序变为可以阅读的程序了。然后打开脱壳插件,观察里面的参数:里面其他参数都是自动填充的,只需要检查(代码段基址)base of code,是代码段首的偏移,你需要检查这个数确保OEP不会超出代码段所在的范围。如果提示“程序入口点超出代码段范围”,修改该值让OEP位于代码段以内。

但是,这个插件只适合脱壳,不适合修复IAT。修复IAT需要用importREC。
我们把它dump下来。注意,OD没把程序运行起来,但OD已经运行到OEP了,这时不能关OD,才能做修复。
在数据窗口跟随一个函数地址。根据下图,可以得到OEP的相对偏移地址, IAT的起始地址 ,以及IAT的大小 ,如果有疑问可看上一篇文字。

然后用importREC修复,和上一篇的步骤一样。

请看第二行结尾“Valid No”,无效的IAT。我们点开看一下

这些数据并不是指向某些函数,我们甚至不知到它是什么。它究竟有用还是没用呢?
垃圾数据产生的原因有很多,或许是壳之前用过留下的,故意干扰脱壳的,或许壳是残留下来的数据,或者重定向IAT之类,等等。所以需要先去甄别一番。我们来到看第一行,在反汇编窗口跟随4010C2,看到如下图

很显然它什么都不是。它没有任何意义。经过初步的的查找,发现其他地方也是垃圾数据,既然都是垃圾,我们把它删除就好。 
右击无效片段,选择“Delete thunk”(删除)或者“Cut Thunk”(剪切)

垃圾数据完全删除了么?还没有。
第二个干扰项是,kernal32里包含了几个ntdll的函数,因为log窗口有显示如下讯息:

IAT read successfully.
rva:00001200 forwarded from mod:ntdll.dll ord:01F5 name:RtlAllocateHeap
rva:00001210 forwarded from mod:ntdll.dll ord:020A name:RtlFreeHeap
意思是: 源程序里相对偏移地址为1200的函数RtlAllocateHeap, 它是 ntdll里的函数,被替换成一个功能相似的函数
同理,相对偏移地址为1210的函数RtlFreeHeap,它是ntdll里的函数 被替换成一个功能相似的函数
再对比一下原函数里401200和401210处的函数:

被替换成什么呢?

RtlAllocateHeap 被换成类kernal32里的HeapAlloc了。这出错误是被自动修复完成了。
但是我们怀疑这两个ntdll函数也许没被调用呢?通过右击该函数,并选中“查找参考”,可以确认这些函数是否真正被调用。

显然是被调用的。不是没用的函数~

二 检查IAT是否被正确修复的方法
即便修复的过程都是正确的,但仍然会修复错误,可能与软件的版本或者软件是否被汉化有关,我们推荐使用稳定的版本和非汉化版。
所以修复后,检查无误后才算修复完。那么如何检查呢?
调试器:OllyDbg
环境:XP SP3 虚拟机

一 辨别并处理垃圾数据
首先介绍一款脱壳插件:ollydump, 我们就用它来脱壳。 
  该插件包含两个文件,一个dll文件和一个文本文档, 和原来一样,我们将它复制并粘贴到PLUGIN文件夹内,重启OD后就可以生效类。文末尾为大家附加了该文件。
和以前一样,用ESP定律到达OEP。删除模块分析后,再次分析,就能将单字节码的程序变为可以阅读的程序了。然后打开脱壳插件,观察里面的参数:里面其他参数都是自动填充的,只需要检查(代码段基址)base of code,是代码段首的偏移,你需要检查这个数确保OEP不会超出代码段所在的范围。如果提示“程序入口点超出代码段范围”,修改该值让OEP位于代码段以内。

但是,这个插件只适合脱壳,不适合修复IAT。修复IAT需要用importREC。
我们把它dump下来。注意,OD没把程序运行起来,但OD已经运行到OEP了,这时不能关OD,才能做修复。
在数据窗口跟随一个函数地址。根据下图,可以得到OEP的相对偏移地址, IAT的起始地址 ,以及IAT的大小 ,如果有疑问可看上一篇文字。

然后用importREC修复,和上一篇的步骤一样。

请看第二行结尾“Valid No”,无效的IAT。我们点开看一下

这些数据并不是指向某些函数,我们甚至不知到它是什么。它究竟有用还是没用呢?
垃圾数据产生的原因有很多,或许是壳之前用过留下的,故意干扰脱壳的,或许壳是残留下来的数据,或者重定向IAT之类,等等。所以需要先去甄别一番。我们来到看第一行,在反汇编窗口跟随4010C2,看到如下图

很显然它什么都不是。它没有任何意义。经过初步的的查找,发现其他地方也是垃圾数据,既然都是垃圾,我们把它删除就好。 
右击无效片段,选择“Delete thunk”(删除)或者“Cut Thunk”(剪切)

垃圾数据完全删除了么?还没有。
第二个干扰项是,kernal32里包含了几个ntdll的函数,因为log窗口有显示如下讯息:

IAT read successfully.
rva:00001200 forwarded from mod:ntdll.dll ord:01F5 name:RtlAllocateHeap
rva:00001210 forwarded from mod:ntdll.dll ord:020A name:RtlFreeHeap
IAT read successfully.
rva:00001200 forwarded from mod:ntdll.dll ord:01F5 name:RtlAllocateHeap

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2018-6-5 18:12 被r0Cat编辑 ,原因:
上传的附件:
收藏
免费 1
支持
分享
最新回复 (3)
雪    币: 2694
活跃值: (80)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
3
2018-6-18 09:03
0
雪    币: 9165
活跃值: (1635)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
4
感谢分享
2018-6-26 11:41
0
游客
登录 | 注册 方可回帖
返回
//