PE学习(13) 解析导入表和IAT表

导入表的结构如下

需要关注的三个字段为:

 

OriginalFirstThunk是指向INT表的RVAFirstThunk是指向IAT表的RVA

INT表和IAT表在文件中是完全一样的(前提是没有绑定导入)

 

IMAGE_THUNK_DATA是一个4字节的数据,如果最高位是1,那么低31位就是函数的导出序号;如果最高位是0,那么它的值是一个RVA,指向一个IMAGE_IMPORT_BY_NAME结构

IMAGE_THUNK_DATA结构(不需要把它当成struct)

IMAGE_IMPORT_BY_NAME结构

其中低地址的Hint是导出序号,然而这个值可能并不准确,有些编译器会把它设置成0,我们只需要关注 Name,这个是一个以0结尾的字符串,表示函数名

如果没有提前绑定函数地址,IAT表和INT表在文件中存储的数据是完全一样

在PE加载前后IAT表变化

 

解析

参考之前的文章,拿到导出表的FOARVA

其中IMAGE_DIRECTORY_ENTRY_IMPORT是宏定义的1,导入表位于数据目录第二个

回顾PE的加载过程:

 

循环所有导出表(如果名字为空认为读取结束)

拿到DLL名称,注意转为FOA

拿到OriginalFirstThunk结构体进行遍历

 

参考开头部分的内容:IMAGE_THUNK_DATA是一个4字节的数据,如果最高位是1,那么低31位就是函数的导出序号;如果最高位是0,那么它的值是一个RVA,指向一个IMAGE_IMPORT_BY_NAME结构

拿到这个值的最高位(其中IMAGE_ORDINAL_FLAG32是最高位为1的DWORD)

最高位为1时输出,为0时转FOA后计算偏移转IMAGE_IMPORT_BY_NAME结构体拿到名称

 

打印FirstThunk部分代码逻辑类似,整体代码如下

 

某非WINDOWS自带EXE截图

 

NOTEPAD截图(为什么这里的FirstThunk内的Name为空,参考下篇文章)