PE文件格式--------------导入表和IAT 下载本文

内容发布更新时间 : 2024/6/26 14:11:01星期一 下面是文章的全部内容请认真阅读。

PE文件格式--------------导入表和IAT

pe文件导入表

1)提取导入表:在数据目录的中,索引为1的位置; 导入表起始RVA地址:

IMAGE_NT_HEADER.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress 导入表大小:

IMAGE_NT_HEADER.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualSize

2)导入表结构:一个导入库对应下面的一个结构,pe文件引用了几个导入库文件就有几个这样的结构,最后以全0值结构结束。当pe在磁盘中时,结构中的两个域OriginalFirstThunk和FirstThunk都指向

IMAGE_THUNK_DATA,当pe加载准备运行时,前者仍然指向IMAGE_THUNK_DATA,后者则有装载器修改为指向导入函数实际地址。

IMAGE_IMPORT_DESCRIPTOR struc

+00h OriginalFirstThunk: dd ;存放RVA,该RVA指向一个

IMAGE_THUNK_DATA结构数组,该数组占4字节,以全0值结尾

+04h DateTimeStamp: dd +08h ForwarderChain: dd +0ch Name1: dd ;存放RVA,该RVA指向dll名字,该名字已0结尾

+10h FirstThunk: dd ;存放RVA,该RVA指向一个

IMAGE_THUNK_DATA结构数组,该数组占4字节,值结尾

IMAGE_IMPORT_DESCRIPTOR ends IMAGE_THUNK_DATA struc union {

ForwarderString: dd Function: dd Ordinal: dd ;序号

AddressOfData: dd 向IMAGE_IMPORT_BY_NAME }

IMAGE_THUNK_DATA ends IMAGE_IMPORT_BY_NAME struc

0 ;指 以全 Hint:

dw ;函数序号,但有的编译器不用此域 Name1: db ;函数名称,以0结尾

IMAGE_IMPORT_BY_NAME ends 3)IAT导入地址表

pe装载后,导入表的第0项的FirstThunk指向的RVA,导入地址表的起始位置。

另一种更便捷的导入表提取方法是:数据目录的IMAGE_DIRECTORY_ENTRY_IAT 4)导入表图解 pe文件加载前

pe文件加载后

4)主要代码:

RvaToOffset.asm

;====================== ;将RVA转化为pe文件偏移

即为