- 公开视频 -> 链接点击跳转公开课程
- 博客首页 -> 链接点击跳转博客主页
目录
Import Table 概述
在 PE 文件中,Import Table(导入表)用于指定可执行文件或动态链接库需要从其他模块(通常是 DLL 文件)加载的符号(函数或变量)。
- Import Table 是 PE 文件中负责动态链接机制的重要结构。
- 它定义了哪些函数(或变量)需要从外部模块加载。
- 常见的导入模块:kernel32.dll, user32.dll 等。
IMAGE_IMPORT_DESCRIPTOR 结构详解
IMAGE_IMPORT_DESCRIPTOR 是描述 PE 文件在运行时需要从外部 DLL 中导入的函数和模块信息的一种数据结构,位于 Import Table 中。
在 Windows SDK 头文件 winnt.h 中,IMAGE_IMPORT_DESCRIPTOR 的定义如下:
typedef struct _IMAGE_IMPORT_DESCRIPTOR {
union {
DWORD Characteristics; // 0 for terminating null import descriptor
DWORD OriginalFirstThunk; // RVA of _IMAGE_THUNK_DATA array
} DUMMYUNIONNAME;
DWORD TimeDateStamp; // Time/Date stamp
DWORD ForwarderChain; // Index of the first forwarder reference
DWORD Name; // RVA of the DLL name (ASCII)
DWORD FirstThunk; // RVA of _IMAGE_THUNK_DATA array for IAT (Import Address Table)
} IMAGE_IMPORT_DESCRIPTOR, *PIMAGE_IMPORT_DESCRIPTOR;
字段解析
字段名 | 描述 |
OriginalFirstThunk | 导入名称表(INT)的RVA,指向IMAGE_THUNK_DATA数组(函数名称或序号) |
TimeDateStamp | 绑定时间戳(若为0,表示未绑定;若为0xFFFFFFFF,表示绑定无效) |
ForwarderChain | 转发函数的索引(通常为0,复杂场景下用于跨DLL转发) |
Name | DLL名称的RVA(如"kernel32.dll") |
FirstThunk | 导入地址表(IAT)的RVA,加载时系统将用实际函数地址填充此表 |
IMAGE_THUNK_DATA 结构
IMAGE_IMPORT_DESCRIPTOR 引用的 _IMAGE_THUNK_DATA 数组用于保存导入的函数信息。
- 按序号导入:最高位为1时,低31位为函数序号(如0x80000001表示序号1)。
- 按名称导入:最高位为0时,值为指向IMAGE_IMPORT_BY_NAME的RVA。
_IMAGE_THUNK_DATA 的定义如下:
typedef struct _IMAGE_THUNK_DATA {
union {
PBYTE ForwarderString; // Pointer to string in forwarders
PDWORD Function; // Pointer to imported function
DWORD Ordinal; // Ordinal value
PBYTE AddressOfData; // RVA of IMAGE_IMPORT_BY_NAME
} u1;
} IMAGE_THUNK_DATA32, *PIMAGE_THUNK_DATA32;
ForwarderString: 字符串指针,表示转发器模块的符号名。
Function: 动态加载后的函数指针。
Ordinal: 按序号导入的函数(如果使用序号导入)。
AddressOfData: 指向
IMAGE_IMPORT_BY_NAME
的 RVA。
IMAGE_IMPORT_BY_NAME 结构
用于描述每个导入函数的符号。
typedef struct _IMAGE_IMPORT_BY_NAME {
WORD Hint; // 函数名称的提示序号,辅助快速查找。
BYTE Name[1]; // 函数名以 null 结尾的字符串。
} IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME;
字段解析:
Hint: 提示值,用于帮助 PE 装载器快速定位函数。
Name: 函数名称的字符串。