动态连接库须要导入表html
typedef struct _IMAGE_IMPORT_DESCRIPTOR { union { DWORD Characteristics; // 0 for terminating null import descriptor DWORD OriginalFirstThunk; // RVA to original unbound IAT (PIMAGE_THUNK_DATA) } DUMMYUNIONNAME; DWORD TimeDateStamp; // 0 if not bound, // -1 if bound, and real date\time stamp // in IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT (new BIND) // O.W. date/time stamp of DLL bound to (Old BIND) DWORD ForwarderChain; // -1 if no forwarders DWORD Name; DWORD FirstThunk; // RVA to IAT (if bound this IAT has actual addresses) } IMAGE_IMPORT_DESCRIPTOR;
OriginalFirstThunk:指向导入名称表函数
FirstThunk:指向导入地址表this
Name:指向导入的dll名称code
IMAGE_THUNK_DATA最高位为1剩下的表示序号,最高位0剩下的表示RVA指向IMAGE_import_BY_NAME,里面存着名字。htm
(图片来源https://www.cnblogs.com/guanlaiy/archive/2012/04/28/2474504.html)blog
OriginalFirstThunk,FirstThunk在文件中同样,只有PE加载的时候系统会根据INT表内容用GetProcAddress()或相似函数将IAT表中内容替换成DLL重载调整好位置的真实导入函数地址。它读的是导出表函数的RVA加上调整好后的DLL的ImageBase。图片
至此导入表、导出表、重定位表功能就连起来了,重定位表只改本PE内容和别的PE无关,PE加载后大部分DLL须要重定位,这个时候imageBase也是真实的了,那么导出函数的真实地址就能经过导出表的导出函数RVA加上真实的该PE的imageBase得到了。GetProcAddress返回给导入表刷新用。ip