Windows逆向工程提升之IMAGE_IMPORT_DESCRIPTOR

目录

[Import Table 概述](#Import Table 概述)

[IMAGE_IMPORT_DESCRIPTOR 结构详解](#IMAGE_IMPORT_DESCRIPTOR 结构详解)

字段解析

[IMAGE_THUNK_DATA 结构](#IMAGE_THUNK_DATA 结构)

[IMAGE_IMPORT_BY_NAME 结构](#IMAGE_IMPORT_BY_NAME 结构)

结构图解


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 的定义如下:

cpp 复制代码
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 的定义如下:

cpp 复制代码
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;  
  1. ForwarderString: 字符串指针,表示转发器模块的符号名。

  2. Function: 动态加载后的函数指针。

  3. Ordinal: 按序号导入的函数(如果使用序号导入)。

  4. AddressOfData: 指向 IMAGE_IMPORT_BY_NAME 的 RVA。


IMAGE_IMPORT_BY_NAME 结构

用于描述每个导入函数的符号。

cpp 复制代码
typedef struct _IMAGE_IMPORT_BY_NAME {  
    WORD Hint;       // 函数名称的提示序号,辅助快速查找。  
    BYTE Name[1];    // 函数名以 null 结尾的字符串。  
} IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME;  

字段解析:

  1. Hint: 提示值,用于帮助 PE 装载器快速定位函数。

  2. Name: 函数名称的字符串。


结构图解

相关推荐
QT.qtqtqtqtqt5 分钟前
未授权访问漏洞
网络·安全·web安全
凡人叶枫34 分钟前
C++中智能指针详解(Linux实战版)| 彻底解决内存泄漏,新手也能吃透
java·linux·c语言·开发语言·c++·嵌入式开发
命里有定数1 小时前
保姆级教程:在 Windows (WSL2) 下本地部署 Qwen3-ASR
windows
凡人叶枫2 小时前
C++中输入、输出和文件操作详解(Linux实战版)| 从基础到项目落地,避坑指南
linux·服务器·c语言·开发语言·c++
ba_pi3 小时前
每天写点什么2026-02-04(2.1)信息安全
安全·web安全
傻乐u兔3 小时前
C语言进阶————指针3
c语言·开发语言
枷锁—sha3 小时前
Burp Suite 抓包全流程与 Xray 联动自动挖洞指南
网络·安全·网络安全
菩提小狗3 小时前
小迪安全2023-2024|第5天:基础入门-反弹SHELL&不回显带外&正反向连接&防火墙出入站&文件下载_笔记|web安全|渗透测试|
笔记·安全·web安全
lucky67074 小时前
Windows 上彻底卸载 Node.js
windows·node.js
CodeSheep程序羊4 小时前
拼多多春节加班工资曝光,没几个敢给这个数的。
java·c语言·开发语言·c++·python·程序人生·职场和发展