导入表在就是在.rdate 节表当然不绝对
导入表在 数据目录 第2个 导入函数在第13个
可以看到rdata 表 起始2000位置 导入表在2538 iat 在2000
这里的rva 地址都要转换为foa 地址 就是 当前rva-初始rva+foa偏移 就是文件物理偏移位置
通过数据找到导入表位置 就是IMAGE_IMPORT_DESCRIPTOR 结构
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; typedef IMAGE_IMPORT_DESCRIPTOR UNALIGNED *PIMAGE_IMPORT_DESCRIPTOR;
这里5个值依次对应
OriginalFirstThunk ,指向IMAGE_THUNK_DATA 他是一个连续的
typedef struct _IMAGE_THUNK_DATA32 { union { DWORD ForwarderString; // PBYTE DWORD Function; // PDWORD DWORD Ordinal; DWORD AddressOfData; // PIMAGE_IMPORT_BY_NAME } u1; } IMAGE_THUNK_DATA32; typedef IMAGE_THUNK_DATA32 * PIMAGE_THUNK_DATA32;
这是值指向
typedef struct _IMAGE_IMPORT_BY_NAME { WORD Hint; CHAR Name[1]; } IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME;
FirstThunk 也是同样指向
_IMAGE_IMPORT_BY_NAME
所以他是一个双桥结构
最后指向一样 不过 FirstThunk 在载入内存时会被替换成真正的函数地址 载入od 查看402000地址