首页
社区
课程
招聘
7
[原创]IAT的填充过程与执行流程
发表于: 2018-5-13 14:57 18530

[原创]IAT的填充过程与执行流程

2018-5-13 14:57
18530
我也是新手,有遗漏和疏忽之处希望大家及时指正。
IAT是什么?为什么它在脱壳修复中扮演着如此重要的地位?它在内存中是怎么样排列的,又是怎样获取的呢?

调试器:OllyDbg

环境:WinXP SP3 虚拟机


(一)

什么是IAT呢。同一个函数,在A电脑里的首地址和在B电脑里的首地址是不一定相同的。系统版本不同,补丁版本不同,都会导致同一个函数的地址有所差异。如果找不到正确的系统API地址程序就没法正常调用函数,自然就没法运行。为了提升系统的兼容性,每次执行程序时软件都会重新获取一次 基于当前的系统的API的地址,并把这些地址集中起来管理,组成一个表。我们把这个表叫输入函数地址表,简称输入表。即IAT(import address table)。

有些壳没有彻底破坏掉IAT结构。比如ASpck,我们以一个加Aspack的课件为例,我们首先使用ESP定律来到OEP,此时壳已经将IAT还原完毕了。(关于ESP定律的详细解释可以参考坛主大大的文章https://bbs.pediy.com/thread-20366.htm)

然后,来看一个调用函数的实例。



call ,点击这一行按下回车,来到跳转表



接着按下空格键,看到未经修饰的原始代码为 jmp [403238]



jmp [403238] ,数据窗口跟随403238,看到 [403238] = 752d582e,如下图。所以 jmp[403238] 等价于jmp 752d582e ,而752d582e 是函数GetModuleHandle的首地址,从而达到了调用 GetModuleHandle 函数的目的。当然并不是所有程序都保留有跳转表结构,本例对IAT的保存比较完整和系统,有跳转表。



那么能不能直接写 jmp 752d582e呢?不能,因为这个地址在每台电脑都不一样。必须用[4031ac]间接调用77d507ea。

本节我们初步了解了IAT长什么样,下一节我们接下来我们来了解IAT的原始结构及获取方法


(二)IAT的原始结构及获取方法


根据上一节的预备知识可知,数据窗口跟随 403238,取出里面的内容,就是是GetModuleHandle函数的真实地址


选中 752d1245  ,右键,点击“查看可执行文件”,如下图所示,最左上角的那里


原本的 403238 变成了1038, 752d1245变成了355E。 这是为什么呢
我们把1038 叫文件偏移地址,这个地址加上402200就是403228。
355e是相对虚拟地址(RVA),它加上基址 400000(image base)得到一个虚拟内存地址40355e(VA),跟随地址40355e发现里面的内容是该函数的名称字符串如下图所示。


偏移地址的内容里存储着字符串,利用字符串, 接下来,程序调用GetProcAddress获取到函数的真实地址,并将该地址填充到40355e所在的区域。注意这里是存储偏移地址的地方,而不是存储字符串的地方。IAT就由这样的步骤重复执行而形成的。

我们使用十六进制工具winhex验证一下。载入课件,定位1038,里面也是0000355e,再来到40355e,里面是字符串GetModuleHandle
所以程序需要用获取哪些函数,该信息早就已经存在程序里了,在程序运行前用GeProcAddress获取这些函数的地址填充到IAT就能运行了。

[注意]看雪招聘,专注安全领域的专业人才平台!

最后于 2019-2-2 10:57 被admin编辑 ,原因: 图片本地化
收藏
免费 7
支持
分享
赞赏记录
参与人
雪币
留言
时间
心游尘世外
感谢你的贡献,论坛因你而更加精彩!
2025-2-12 01:02
東陽不列山
为你点赞!
2025-1-19 06:53
一路南寻
为你点赞!
2024-12-13 01:53
任常安
你的分享对大家帮助很大,非常感谢!
2024-12-4 11:10
飘零丶
感谢你的贡献,论坛因你而更加精彩!
2024-10-27 04:09
shinratensei
为你点赞!
2024-9-29 06:42
PLEBFE
为你点赞~
2022-7-27 02:04
最新回复 (5)
雪    币: 10872
活跃值: (1845)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
2
感谢分享
2018-5-17 20:50
0
雪    币: 14
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
3
感谢分享了哇~
2019-12-28 09:52
0
雪    币: 313
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
4
谢谢学学了
2021-8-1 20:19
0
雪    币: 98
活跃值: (1634)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
非常感谢     通俗易懂
2024-4-29 16:55
0
雪    币: 314
活跃值: (536)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
很有意思的科普,感谢楼主分享
2024-12-4 11:10
0
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册