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: 函数名称的字符串。


结构图解

相关推荐
钢琴上的汽车软件4 小时前
C 语言中const与指针:三种常见写法辨析
c语言·指针和const
ZK_H5 小时前
嵌入式c语言——关键字其6
c语言·开发语言·计算机网络·面试·职场和发展
泓铮5 小时前
Windows 环境下 WSL2 与 VMware Workstation 17 共存机制研究与工程实践
windows
星河耀银海5 小时前
远控体验分享:安全与实用性参考
人工智能·安全·微服务
ambition202425 小时前
从暴力搜索到理论最优:一道任务调度问题的完整算法演进历程
c语言·数据结构·c++·算法·贪心算法·深度优先
cmpxr_5 小时前
【C】原码和补码以及环形坐标取模算法
c语言·开发语言·算法
赛博云推-Twitter热门霸屏工具6 小时前
Twitter运营完整流程:从0到引流获客全流程拆解(2026)
运维·安全·自动化·媒体·twitter
yashuk6 小时前
C语言实现PAT练习及算法学习笔记,还有SQLite介绍
c语言·sqlite·开源项目·算法学习·pat练习
ACP广源盛139246256737 小时前
破局 Type‑C 切换器痛点@ACP#GSV6155+LH3828/GSV2221+LH3828 黄金方案
c语言·开发语言·网络·人工智能·嵌入式硬件·计算机外设·电脑
xixixi777777 小时前
通信领域的“中国速度”:从5G-A到6G,从地面到星空
人工智能·5g·安全·ai·fpga开发·多模态