IAT和导入表关系

来源:互联网 发布:数控圆弧编程举例 编辑:程序博客网 时间:2024/06/03 10:30

导入表:IMAGE_IMPORT_DESCRIPTOR:


IMAGE_IMPORT_DESCRIPTOR 结构定义如下:
IMAGE_IMPORT_DESCRIPTOR STRUCT 

{
union 

{
Characteristics              DWORD   ? 
OriginalFirstThunk        DWORD   ? -》指向INT
}

TimeDateStamp                     DWORD   ? 
ForwarderChain                     DWORD   ? 
Name                                    DWORD   ? 
FirstThunk                            DWORD   ?-》指向IAT

}
IMAGE_IMPORT_DESCRIPTOR ENDS 

导入表在PE加载前是这样的(IAT也是指向了IMAGE_THUNK_DATA结构)

在PE加载之后是(IAT指向了函数的实际地址)



IAT:就是所有要导入的函数的名称和Hint的地址表:


这些地址跟过去就是:


分别是要导入函数的Hint和函数名称

而导入表的首地址可以在DATA Directories里找IMPORT ADDRESS TABLE的RVA地址

也可以在导入表的多组IID中查看最小的一个FirstThunk的地址就是IAT的地址



PE加载之前:


OriginalFirstThunk的值为IMAGE_THUNK_DATA数组的首地址,数组以一个00 00 00 00地址表示这个dll库导出结束

FirstThunk的值为IAT的导入函数地址,没加载之前也是IMAGE_THUNK_DATA数组结构,以示以一个00 00 00 00地址表示这个dll库导出结束


PE加载之后:



OriginalFirstThunk不变化,而FirstThunk关闭了和OriginalFirstThunk的链接,并且FirstThunk的值为内存中导入函数地址的数组,一样以00 00 00 00表示一个结束


typedef struct _IMAGE_THUNK_DATA32 {
union {
PBYTE ForwarderString;
PDWORD Function;
DWORD Ordinal;
PIMAGE_IMPORT_BY_NAME AddressOfData;
} u1;
} IMAGE_THUNK_DATA32;

ForwarderString 指向一个转向者字符串的RVA;
Function 被输入的函数的内存地址;
Ordinal 被输入的API的序数值
AddressOfData 指向IMAGE_IMPORT_BY_NAME

IDT(IMPORT Directory Table)


原创粉丝点击