1.什么事导入表?

当你的模块需要使用其他模块提供的函数的时候,就需要在自己的模块中记录这些信息,记录这些信息的就是导入表。

重要字段有三个:
OriginalFirstThunk:INT的RVA
FirstThunk:IAT的RVA
Name:导入的Dll的RVA
INTIAT还是文件的时候,里面存储的东西是一样的,都是函数名称的RVA。
但是从字面理解,IAT应该是存储地址的,为什么会存储名称。因为在程序没有运行的时候,无法得知模块具体回加载到什么位置,也就无法得到函数的地址是多少。
当程序运行起来之后,系统会去将IAT填充上函数的地址。
所有调用其他模块函数的代码都是call ds:[IAT地址]。

2.如何找到导入表?

通过数据目录表的第一项(第零项是导出表),得到RVA就能找到
IMAGE_IMPORT_DESCRIPTOR结构体数组,数据以全零为结尾。
首先在010中找到数据目录中的索引为一的字段就是第二个

这个就是导入表结构的起始RVA:0x0001A174 转为FOA:0x7974

然后我们转到0x7974这个位置进行查看

3.如何解析导入表


INT的RVA:0x0001A25C 转为FOA:0x7A5C

IAT的RVA:0x0001A098 转为FOA::0x7898

Name的RVA:0x0001A3CA 转为FOA:0x7BCA

我们先转到INT的FOA和IAT的FOA进行查看,我们会发现他们存储的内容是相同的,因为在没有运行起来的时候,他们存储的都是函数的名称的RVA。

4.如何用代码解析

5.知道了导入表相关的内容有什么用

1.我们可以做IAT-Hook,替换IAT表中的内容就可以Hook
2.知道一个exe用到了哪些模块的哪些函数。可以根据函数名猜测功能,利于分析程序。

最后修改:2020 年 08 月 26 日
如果觉得我的文章对你有用,请随意赞赏