认识导入表(_IMAGE_IMPORT_DESCRIPTOR)结构。
简单的说一个程序不可能完全包含整个系统中的代码,当我们要实现一些功能的时候,系统的API已经包含了这个功能,那么我们就可以将系统的这个dll加载到我们程序的内存内存空间中,然后去执行他就可以了。比如一个简单的窗口中弹出对话框如果要我们自己写全部代码,我想没有几周是不可能实现的,因为他涉及到显卡的驱动调用等相关内容。而Windows在编写过程中就为程序员预留了一些接口API,我们只需要按照规定调用这些预留的接口就可以实现其功能了。那么程序要用的功能在那个dll中呢?调用的是哪个函数呢?在PE文件内,有一组数据结构,他们分别对应着每个被输入的DLL。每一个这样的结构都给出了被输入的DLL的名称并指向一组函数指针。这组函数指针被称为输入地址表(Import Address Table)。
重要成员如下
成员1:包含指向输入名称表简称INT的RVA,INT是一个IMAGE_THUNK_DATA结构数组,数组中的每一个IMAGE_THUNK_DATA结构指向IMAGE_IMPORT_BY_NAME结构,数组最后一个内容是内容为0的IMAGE_THUNK_DATA。
成员2:一个32位的时间标志,可以忽略。
成员3:这个是第一个被转向的API的索引,一般为0。
成员4:DLL的名字的指针,是一个以00结尾的ASCII字符的RVA地址,例如”kernel32.dll”
成员5:包含指向输入地址表(IAT)的RVA。IAT是一个IMAGE_THUNK_DATA数组。成员1同成员5非常相似,他们指向两个本质上相同的数组IMAGE_THUNK_DATA。
注意:
在文件中认识输入表结构。本次为了说明问题,我们就用简单的1.exe了,我们的用c32打开1.exe,然后借助lordPE来找到输入表。
可以看到导入表
在文件中认识导入表