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

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

2018-5-13 14:57
16561

调试器: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 <imp.&KERNAL32.GetmoduleHandle>,点击这一行按下回车,来到跳转表



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



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



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

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


在数据窗口右击-指定-PE头,然后转到400000(基址),查看PE文件,找到import table address=3000.这表示导入表指针偏移是3000,真实地址等于3000加上基址,即403000。



我们先来区分一下导入表(IT)和输入表(IAT)。导入表是IT(import table),输入表是IAT(import address table).IT的描述符结构是每5个Dword为一个单元,这个单元叫IID,如图所示



一个IID有五个字段,每个字段占一个Dword,但前三个字段一般没用,有用的是第四字段和第五字段。第四字段加基址403290,这里存放dll名称。我们定位到403290看一下



如图所示,dll的名称是user32.dll

第五字段里的内容加基址,作为指针指向的内容是这个dll的第一个函数地址。



[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2019-2-2 10:57 被admin编辑 ,原因: 图片本地化
收藏
免费 3
支持
分享
最新回复 (4)
雪    币: 9142
活跃值: (1630)
能力值: ( 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
活跃值: (1494)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
非常感谢     通俗易懂
2024-4-29 16:55
0
游客
登录 | 注册 方可回帖
返回
//