本文阐述了辨别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
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2018-6-5 18:12
被r0Cat编辑
,原因:
上传的附件: