内容发布更新时间 : 2025/1/7 6:28:47星期一 下面是文章的全部内容请认真阅读。
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文件偏移
即为